All docs
3 min read

Make recipe

Make sits between Zapier and n8n: visual scenario builder, generous free tier, fewer apps than Zapier but better pricing at volume.

Setup

1. Create a custom webhook

In Make: Scenarios → New scenario → Webhooks → Custom webhook → Add. Name it (Formspring contact). Make returns a URL — copy it.

Click Re-determine data structure and Make will wait for a sample request to learn the shape.

2. Wire it up

In Formspring: Webhooks → Add webhook → Generic. Paste the Make URL. Hit Send test.

Back in Make, the structure determination completes. You can now reference payload.email, payload.message, meta.ip_country, etc. in downstream modules.

3. Verify the signature

Add a Tools → Set variable module right after the webhook to compute the expected HMAC, then a Tools → Compose a string to compare and a Router that 401s on mismatch. It's clunky in pure Make. The cleaner option is a tiny verifier endpoint (Cloudflare Worker, Vercel function) in front of Make that does the HMAC check and forwards only verified payloads to the Make URL.

If your form has low security requirements (e.g. internal tools), you can skip verification and trust the URL is private — but for anything public-facing, verify.

4. Add scenario steps

Common modules:

  • HTTP → Make a request: forward to your API.
  • Google Sheets → Add a row: log the submission.
  • Email → Send an email: confirmation to the submitter, alert to your team.
  • Filter between modules: only route certain form_name values, only when meta.spam_score < 0.2, etc.

Conditional routing

Make's Router module fans out into multiple branches with filter conditions on each. Useful patterns:

  • Branch by body.type: submission.created → CRM + email; submission.flagged → moderation queue.
  • Branch by body.form_id: contact form → Slack; demo request → calendar booking + sales CRM.
  • Branch by field value: payload.priority = "urgent" → page on-call; everything else → standard flow.

Parsing JSON

Make parses the webhook body automatically when structure is determined. If you receive an arbitrary payload (form fields vary across forms), use Parse JSON with a generic structure to access keys dynamically.

For attachments, the payload.attachment.url is a signed URL valid for one hour. Use HTTP → Get a file to fetch the bytes inside that window before the URL expires.

Error handling and retries

Make has built-in error handlers per module. Right-click a module → Add error handler. The recommended setup:

  • Break error handler with retry: 3 retries, 5 seconds apart. Make's runtime will pause and resume.
  • After Break exhausts, route to a Send email error notification with the failing payload.

This stacks with Formspring's own retry: if Make fails entirely (5xx returned to Formspring), our retry kicks in too. Net result: 3 internal Make retries × up to 7 Formspring retries = generous resilience.

Operations cost

Make charges per operation. A scenario with 5 modules costs 5 ops per execution. Filters that short-circuit don't count beyond the filter point — use them aggressively to keep ops down.

What's next