botbook/src/14-migration/zapier-make.md

489 lines
12 KiB
Markdown
Raw Normal View History

2025-12-03 19:56:35 -03:00
# Zapier and Make Migration Guide
Migrating workflows from Zapier or Make (formerly Integromat) to General Bots.
<img src="../assets/gb-decorative-header.svg" alt="General Bots" style="max-height: 100px; width: 100%; object-fit: contain;">
## 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