Skip to content

Butterbase CRM

App ID: app_44zjayftl7b3 · Region: us-east-1 · 56 functions · 33 clones

An AI-native CRM. Contacts and companies enrich themselves, Gmail and Calendar sync in on a schedule, meetings get recorded and summarised by a notetaker bot, and an agent proposes deals off the activity it sees. Campaigns and social publishing are built in.

This is the largest template in the catalog and the easiest to stand up: every environment variable it needs is filled in automatically at clone time. There is no third-party API key you must obtain before it will boot.

The Companies view of a freshly cloned Butterbase CRM, with seed data already in place

enrich-person · enrich-company · summarize-company · find-duplicates · trigger-enrichment · crm-record-activity

Records enrich from public sources on demand or on write. Duplicate detection runs across the contact set, and companies get an AI-written summary.

ingest-gmail · ingest-calendar · auto-sync-google (cron) · upsert-sync-settings

Mail and calendar pull into the activity timeline on a schedule. Per-user sync settings decide what’s ingested.

start-meeting-bot · cancel-meeting-bot · notetaker-webhook · ingest-meeting-transcript · get-meeting-notes · crm-upsert-meeting · migrate-meetings-to-substrate

A bot joins the call, transcribes it, and writes structured notes back onto the meeting record. The webhook secret for this is minted for you during the clone.

agent-chat · ai-search · ai-suggest-filters

Natural-language chat over the CRM, semantic search across records, and AI-generated list filters.

propose-deals · accept-deal-proposal · agent-proposals-expire (cron)

An agent proposes deals from observed activity; a human accepts. Unaccepted proposals expire on a schedule.

lead-search · lead-save · lead-cost-preview · list-lead-lists

Search for leads, preview the credit cost before committing, and save results into lists.

create-campaign-list · start-campaign · pause-campaign · process-campaign-sends (cron) · resolve-pending-emails (cron) · reply-to-inbox-item

Build a list, start a sequence, and let the cron workers handle sending and reply resolution.

create-social-post · edit-social-post · clone-social-post · publish-social-post · send-social-post · delete-social-post-from-platform · process-scheduled-social-posts (cron) · comment-on-social-post · discover-comment-targets · run-comment-discovery (cron) · execute-comment-campaign · fetch-post-replies (cron) · get-subreddit-flairs · configure-social-toolkit

Draft, schedule, and publish posts across platforms, plus a comment-campaign engine that finds targets and engages on a schedule.

register-integration · unregister-integration · list-workspace-integrations · cleanup-orphan-integrations (cron) · invite-member · accept-invite · check-allowlist · substrate-proxy · list-substrate-entities

  1. Open Templates in the dashboard.
  2. Click butterbase-crm, then Clone.
  3. Name your app. The region is fixed to the template’s (us-east-1) in the dashboard.
  4. The env-vars step says “Nothing to enter” — every key this app needs is platform-provided. Click straight through.
  5. Click Start clone and wait. 56 functions take a few minutes to redeploy.

Cloning Butterbase CRM: the env-vars step reads "Nothing to enter" because every key is platform-provided

Terminal window
butterbase clone app_44zjayftl7b3 ./my-crm --name "My CRM" --region us-east-1
manage_app action: "clone"
source_app_id: "app_44zjayftl7b3"
name: "My CRM"
region: "us-east-1"

Then poll:

manage_app action: "get_clone_job", job_id: "<job_id>"
POST /v1/templates/app_44zjayftl7b3/clone
{ "name": "My CRM", "region": "us-east-1" }
manage_app action: "get_clone_job", job_id: "<job_id>"

If the meetings webhook was rebuilt, a warning contains a freshly minted wsec_* shown exactly once. Capture it — it’s already wired into notetaker-webhook, but you’ll want it on record.

Every function in this template uses only platform-convention keys:

KeyUsed byFilled with
BUTTERBASE_API_KEY27 functionsA fresh bb_sk_* scoped to your new app
BUTTERBASE_API_URLai-suggest-filters, lead-search, lead-saveYour control API URL
BUTTERBASE_APP_IDai-suggest-filters, lead-search, lead-save, configure-social-toolkitYour new app id
NOTETAKER_WEBHOOK_SECRETnotetaker-webhookA minted wsec_*
BB_SUBSTRATE_KEYsubstrate-proxyA minted bb_sk_*

Spot-check one:

manage_function action: "get", app_id: "<your_app_id>", function_name: "agent-chat"

Gmail and Calendar ingest need your Google client id and secret — the source’s did not transfer.

manage_oauth action: "configure"
app_id: "<your_app_id>"
provider: "google"
client_id: "..."
client_secret: "..."
redirect_uris: ["https://api.butterbase.ai/auth/<your_app_id>/oauth/google/callback"]

Enable the Gmail and Calendar scopes on the Google side. Until this is done, ingest-gmail, ingest-calendar, and auto-sync-google will run and find nothing.

4. Connect the integrations you actually want

Section titled “4. Connect the integrations you actually want”

Social publishing and comment campaigns run through Integrations. Register only the platforms you’ll use:

manage_integrations action: "list_available" # what you can connect
manage_integrations action: "list_connected" # what this app already has

The cron jobs (process-scheduled-social-posts, run-comment-discovery, fetch-post-replies) are harmless with nothing connected — they’ll no-op.

start-meeting-bot dispatches a bot into calls. Confirm you’re happy with that before pointing it at real meetings, and check the recording-consent rules that apply where you and your participants are.

manage_app action: "update_cors"
app_id: "<your_app_id>"
allowed_origins: ["https://mycrm.com", "http://localhost:5173"]

The clone comes up with the CRM frontend already live, re-pointed at your app — the overview page shows the URL. Open it and confirm it loads before doing anything else.

To edit it, pull the source locally:

Terminal window
butterbase repo init <your_app_id>
butterbase repo pull
cd <dir> && npm install && npm run build

Then redeploy — see Frontend Deployment. The frontend’s VITE_* variables are separate from function env vars and are not inherited.

56 functions is a large surface. Before real data goes in:

  • manage_app action: "get_config" — check the access mode.
  • Read the RLS policies that came across; see Row-Level Security.
  • Note which functions are http triggered and reachable, and lock down anything you aren’t using.
  1. manage_schema action: "get" — schema is present.
  2. invoke_function on ai-search — a 500 almost always means a missing env var.
  3. Sign up a test user through your auth config.
  4. Connect one Google account and run ingest-gmail.
  5. Load the frontend and click through contacts.

This template is AI-heavy — enrichment, summarisation, chat, and search all draw AI credits, and several cron jobs run unattended. Set a spending cap before you leave it running.