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

12 KiB

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:

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:

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:

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:

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:

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:

' 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:

' 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:

' 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:

' 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:

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:

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

' 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

' 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

' 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

' 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.

' 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