# Zapier and Make Migration Guide Migrating workflows from Zapier or Make (formerly Integromat) to General Bots. General Bots ## Overview Zapier and Make are visual automation platforms connecting apps through triggers and actions. General Bots provides equivalent automation through BASIC scripting, offering more power and flexibility without per-task pricing. ## Why Migrate | Aspect | Zapier/Make | General Bots | |--------|-------------|--------------| | Pricing | Per-task/operation | Unlimited executions | | Automation | Visual workflows | BASIC scripts | | AI Integration | Via paid apps | Native LLM keywords | | Chat/Bot | Not included | Multi-channel | | Productivity Suite | Not included | Email, calendar, files | | Custom Logic | Limited | Full programming | | Self-hosting | Not available | Full control | | API Creation | Not available | Instant webhooks | ## Cost Comparison ### Zapier Pricing | Plan | Tasks/Month | Cost | |------|-------------|------| | Free | 100 | $0 | | Starter | 750 | $19.99 | | Professional | 2,000 | $49 | | Team | 50,000 | $69/user | | Company | 100,000+ | Custom | ### Make Pricing | Plan | Operations/Month | Cost | |------|------------------|------| | Free | 1,000 | $0 | | Core | 10,000 | $9 | | Pro | 10,000 | $16 | | Teams | 10,000 | $29/user | | Enterprise | Custom | Custom | ### General Bots | Plan | Operations | Cost | |------|------------|------| | Self-hosted | Unlimited | Infrastructure only | ## Trigger Mapping | Zapier/Make Trigger | General Bots Equivalent | |---------------------|------------------------| | Schedule | `SET SCHEDULE` | | Webhook | `WEBHOOK` | | New Email | `ON "email:received"` | | New Row (Sheets) | `ON "table:name:insert"` | | Form Submission | `ON FORM SUBMIT` | | New File | `ON "file:created"` | | RSS Feed | Scheduled `GET` | | App-specific | API polling or webhooks | ## Action Mapping | Zapier/Make Action | General Bots Equivalent | |--------------------|------------------------| | Send Email | `SEND MAIL` | | HTTP Request | `GET`, `POST`, `PUT`, `DELETE` | | Create Row | `INSERT` | | Update Row | `UPDATE` | | Filter | `IF/THEN/ELSE` | | Formatter | String/date functions | | Delay | `WAIT` | | Paths | `IF` branches | | Loop | `FOR EACH` | | Code (JS/Python) | BASIC script | | Slack Message | `POST` to Slack webhook | | Create Task | `CREATE TASK` | | Send SMS | SMS integration | ## Migration Examples ### Simple Zap: Form to Email **Zapier:** ``` Typeform → Gmail (Send Email) ``` **General Bots:** ```basic ON FORM SUBMIT "contact-form" name = fields.name email = fields.email message = fields.message SEND MAIL TO "support@company.com" SUBJECT "New Contact: " + name BODY "From: " + email + "\n\nMessage:\n" + message END ON ``` ### Multi-Step Zap: Lead Processing **Zapier:** ``` Webhook → Filter → Clearbit Enrich → Salesforce (Create Lead) → Slack (Send Message) ``` **General Bots:** ```basic WEBHOOK "new-lead" lead = body ' Filter IF lead.email = "" OR NOT CONTAINS(lead.email, "@") THEN RETURN #{status: "invalid", reason: "Invalid email"} END IF ' Enrich SET HEADER "Authorization", "Bearer " + GET CONFIG "clearbit-key" enriched = GET "https://person.clearbit.com/v2/people/find?email=" + lead.email ' Create in CRM WITH salesforce_lead .Email = lead.email .FirstName = enriched.name.givenName .LastName = enriched.name.familyName .Company = enriched.employment.name .Title = enriched.employment.title END WITH SET HEADER "Authorization", "Bearer " + GET CONFIG "salesforce-token" result = POST "https://yourinstance.salesforce.com/services/data/v52.0/sobjects/Lead", salesforce_lead ' Notify Slack POST GET CONFIG "slack-webhook", #{ text: "New lead: " + lead.email + " from " + enriched.employment.name } RETURN #{status: "success", salesforce_id: result.id} ``` ### Scheduled Sync **Make Scenario:** ``` Schedule → HTTP Request → Iterator → Google Sheets (Add Row) ``` **General Bots:** ```basic SET SCHEDULE "every hour" data = GET "https://api.example.com/new-orders" FOR EACH order IN data.orders INSERT "orders", #{ order_id: order.id, customer: order.customer_name, total: order.total, status: order.status, synced_at: NOW() } NEXT order TALK "Synced " + LEN(data.orders) + " orders" ``` ### Error Handling **Zapier:** Error handling path or retry **General Bots:** ```basic SET SCHEDULE "every 5 minutes" TRY result = POST "https://api.example.com/sync", data IF result.status <> 200 THEN THROW "API returned " + result.status END IF CATCH ' Log error INSERT "error_log", #{ error: ERROR_MESSAGE, timestamp: NOW(), data: data } ' Alert SEND MAIL TO "ops@company.com" SUBJECT "Sync Error" BODY ERROR_MESSAGE POST GET CONFIG "slack-alerts", #{text: "Sync failed: " + ERROR_MESSAGE} END TRY ``` ### Conditional Paths **Zapier Paths:** ``` Trigger → Path A (if condition) → Actions → Path B (else) → Actions ``` **General Bots:** ```basic WEBHOOK "order-status" order = body IF order.total > 1000 THEN ' High-value order path SEND MAIL TO "vip-team@company.com" SUBJECT "High-Value Order" BODY order POST GET CONFIG "slack-vip", #{text: "VIP Order: $" + order.total} priority = "high" ELSEIF order.is_rush = true THEN ' Rush order path SEND MAIL TO "fulfillment@company.com" SUBJECT "RUSH Order" BODY order priority = "rush" ELSE ' Standard order path priority = "normal" END IF INSERT "orders", #{ id: order.id, total: order.total, priority: priority, created: NOW() } ``` ### Data Transformation **Make/Zapier Formatter:** - Split text - Format dates - Math operations - Lookup tables **General Bots:** ```basic ' String operations full_name = first_name + " " + last_name email_domain = SPLIT(email, "@")[1] slug = LOWER(REPLACE(title, " ", "-")) ' Date formatting formatted_date = FORMAT(created_at, "MMMM d, yyyy") due_date = DATEADD(NOW(), 7, "day") days_ago = DATEDIFF("day", created_at, NOW()) ' Math subtotal = price * quantity tax = subtotal * 0.08 total = subtotal + tax discount = IIF(total > 100, total * 0.1, 0) ' Lookup status_label = SWITCH status CASE "new" : "New Order" CASE "processing" : "In Progress" CASE "shipped" : "On the Way" CASE "delivered" : "Completed" DEFAULT : "Unknown" END SWITCH ``` ## App-Specific Migrations ### Gmail/Email **Zapier:** Gmail trigger/action **General Bots:** ```basic ' Send email SEND MAIL TO recipient SUBJECT subject BODY body ' With attachments SEND MAIL TO recipient SUBJECT subject BODY body ATTACH "/files/report.pdf" ' Process incoming (via Stalwart webhook) ON "email:received" IF CONTAINS(params.subject, "Order") THEN PROCESS_ORDER(params) END IF END ON ``` ### Slack **Zapier:** Slack app **General Bots:** ```basic ' Simple message POST "https://hooks.slack.com/services/xxx", #{text: "Hello!"} ' Rich message WITH slack_message .channel = "#general" .blocks = [ #{type: "header", text: #{type: "plain_text", text: "New Order"}}, #{type: "section", text: #{type: "mrkdwn", text: "*Customer:* " + customer_name}}, #{type: "section", text: #{type: "mrkdwn", text: "*Total:* $" + total}} ] END WITH POST GET CONFIG "slack-webhook", slack_message ``` ### Google Sheets **Zapier:** Google Sheets app **General Bots:** ```basic ' Read from sheet SET HEADER "Authorization", "Bearer " + GET CONFIG "google-token" data = GET "https://sheets.googleapis.com/v4/spreadsheets/{spreadsheetId}/values/Sheet1!A1:D100" ' Append row POST "https://sheets.googleapis.com/v4/spreadsheets/{spreadsheetId}/values/Sheet1!A1:append?valueInputOption=USER_ENTERED", #{ values: [[name, email, phone, NOW()]] } ' Or use General Bots tables directly INSERT "contacts", #{name: name, email: email, phone: phone} ``` ### Airtable **Zapier:** Airtable app **General Bots:** ```basic SET HEADER "Authorization", "Bearer " + GET CONFIG "airtable-key" ' Read records records = GET "https://api.airtable.com/v0/{baseId}/{tableName}" ' Create record POST "https://api.airtable.com/v0/{baseId}/{tableName}", #{ fields: #{ Name: name, Email: email, Status: "New" } } ``` ### HubSpot **Zapier:** HubSpot app **General Bots:** ```basic SET HEADER "Authorization", "Bearer " + GET CONFIG "hubspot-token" ' Create contact POST "https://api.hubapi.com/crm/v3/objects/contacts", #{ properties: #{ email: email, firstname: first_name, lastname: last_name, company: company } } ' Create deal POST "https://api.hubapi.com/crm/v3/objects/deals", #{ properties: #{ dealname: deal_name, amount: amount, pipeline: "default", dealstage: "appointmentscheduled" } } ``` ## What You Gain ### No Operation Limits ```basic ' Process thousands of records without worrying about limits SET SCHEDULE "every hour" records = GET "https://api.example.com/all-records" FOR EACH record IN records PROCESS_RECORD(record) ' No per-operation cost NEXT record ``` ### Native AI Integration ```basic ' AI-powered automation USE KB "company-docs" incoming_email = params.body category = LLM "Categorize this email as: support, sales, billing, or other: " + incoming_email IF category = "support" THEN response = LLM "Draft a helpful support response to: " + incoming_email SEND MAIL TO params.from SUBJECT "Re: " + params.subject BODY response END IF ``` ### Multi-Channel Chat ```basic ' Same automation works across channels TALK "How can I help you?" HEAR request USE KB "help-docs" answer = LLM request TALK answer ' Available on Web, WhatsApp, Teams, Slack, Telegram, SMS ``` ### Built-in Productivity ```basic ' No need for separate calendar, task, email apps CREATE TASK "Follow up with " + customer_name DUE DATEADD(NOW(), 3, "day") BOOK "Call with " + customer_name AT meeting_time SEND MAIL TO customer_email SUBJECT "Confirmation" BODY message ``` ## Migration Checklist ### Pre-Migration - [ ] Export Zap/Scenario descriptions - [ ] Document all triggers and schedules - [ ] List all connected apps and credentials - [ ] Identify critical automations - [ ] Set up General Bots environment ### Migration - [ ] Create BASIC scripts for each workflow - [ ] Configure credentials in config.csv - [ ] Set up webhooks with same URLs - [ ] Configure schedules - [ ] Test each automation ### Post-Migration - [ ] Run parallel for verification - [ ] Compare execution results - [ ] Monitor for errors - [ ] Disable Zapier/Make automations - [ ] Cancel subscriptions ## Best Practices **Start with simple Zaps.** Migrate basic workflows first to learn BASIC syntax. **Combine multiple Zaps.** Often several Zaps can become one General Bots script. **Use native features.** Don't replicate Zapier patterns—leverage AI, chat, and productivity features. **Add error handling.** BASIC provides better error handling than visual builders. **Document your scripts.** Add comments explaining what each script does. ```basic ' Daily sales report ' Runs at 6 PM on weekdays ' Aggregates daily orders and sends summary to management SET SCHEDULE "0 18 * * 1-5" ' ... implementation ``` ## See Also - [SET SCHEDULE](../chapter-06-gbdialog/keyword-set-schedule.md) - Scheduling - [WEBHOOK](../chapter-06-gbdialog/keyword-webhook.md) - Webhooks - [HTTP Keywords](../chapter-06-gbdialog/keywords-http.md) - API calls - [Platform Comparison](./comparison-matrix.md) - Full comparison