vibes.diy/docs Home Discord
creator docs · works with

Works with Zapier

Send each new record from your app to Slack, Google Sheets, a CRM or any tool Zapier reaches, and bring records in from them: a Google Forms response, a new row, an email.

What you can build

Apps whose records belong somewhere else too: an intake form whose submissions land in your practice-management tool, a volunteer sign-up that fills a spreadsheet, a contact form that pings your team's Slack, an order form that adds a row to your CRM. Your app keeps the form and the record; Zapier carries a copy into whichever tool the Zap points at.

How it connects

A Catch Hook URL, saved on your app. You make a Zap whose trigger is Webhooks by Zapier → Catch Hook; Zapier hands you a URL starting https://hooks.zapier.com/hooks/catch/. You save it on your app's Settings → Secrets as ZAPIER_HOOK_URL, and your backend.js posts each new record to it. The URL is the credential, so it stays in the secret. The platform holds no token for the far end, and your app works fully before any Zap exists — connecting one turns the delivery on.

Send records out

Your app can How
Post each new record to a Zap backend.js reacts to the saved record and sends its fields as JSON
Mark what was sent The record is marked sent once Zapier accepts it; a retry can occasionally send one twice, so let your Zap skip a record id it has already seen
Retry on its own A send Zapier refuses is tried again with growing pauses over a few minutes, and one that never lands shows in your app's logs

Setting it up takes about ten minutes, most of it in Zapier:

  1. In Zapier, create a Zap with Webhooks by Zapier as the trigger and Catch Hook as the event. Copy the hook URL.
  2. On your app's Settings page, add the secret ZAPIER_HOOK_URL and paste the URL. From a terminal: npx vibes-diy secrets set ZAPIER_HOOK_URL --vibe you/your-app.
  3. Ask the builder: "When someone submits the form, send the submission to my Zapier hook in ZAPIER_HOOK_URL."
  4. Submit one record, press Test trigger in Zapier to see its fields, add the action step (Slack, Sheets, your CRM), map the fields and turn the Zap on.

Bring records in

A Zap can hand your app a new record from any tool Zapier reaches (a Google Forms response, a new row in a sheet, an email, a Slack message), and it lands in your app's own database, ready for your screens. Ask the builder in your own words ("every new Google Forms response arrives from Zapier") and it writes the route. Then set up three things once:

  1. A shared secret. Pick a long random value and save it: npx vibes-diy secrets set ZAPIER_INBOUND_SECRET --vibe you/your-app, or use the app's Settings page.
  2. The Zap. The trigger is your tool. The action is Webhooks by Zapier → POST to https://vibes.diy/vibe/you/your-app/_api/zapier/lead, payload type JSON, with your fields mapped and the tool's own id for the record mapped to id. Add a header named x-zapier-secret carrying the same secret.
  3. Anonymous writes on. A Zap carries no vibes.diy sign-in, so the record arrives as an anonymous write. Publishing from the editor turns that on; after a CLI push, run npx vibes-diy app anon-write you/your-app on.
Your app can How
Check the sender The header is compared with your secret; a delivery without it gets 401 and writes nothing
Keep one record per thing The record's own id keys the document, so a second delivery lands on the same record
Show only what your Zap sent Each delivery is sealed with your secret, and within a minute your app's scheduled check turns every sealed arrival into a record

Until the secret is set, the route answers 503 and the rest of your app works as usual. The builder's recipe is in the backend.js reference, under Records in from Zapier.

Starter prompts

  • Make a contact form for my studio that sends every new message to Slack through Zapier.
  • Build a volunteer sign-up sheet that adds each new volunteer as a row in Google Sheets through a Zapier Catch Hook.
  • Make a client intake form for my practice that sends each submission to my CRM through Zapier.

Good to know

  • Name the tool and the builder reaches for the hook. A record that only needs to live in your app stays in your app; a hook is for the moment it has to land in a tool somebody else runs.
  • Include the record's id in what you send when a duplicate would matter on the far end, so the Zap can skip one it has already seen.
  • Delete the Zap to cut the cord. The URL stops working the moment the Zap is gone.
  • Webhooks by Zapier is a Zapier feature, so your Zapier plan decides whether it is available to you; Zapier's pricing page lists which plans include it.

Go deeper