Zapier Catch Hook Setup
Send FormPilot submission webhooks into Zapier workflows.
Use Zapier's Webhooks by Zapier trigger to receive FormPilot
submission.created webhooks and map them into spreadsheets, CRMs, email
steps, and task tools. This is webhook-compatible Zapier setup, not an official
FormPilot Zapier app.
The webhook payload and signature contract is owned by the webhooks reference. Keep that page as the source of truth for event names, headers, payload fields, retry behavior, and versioning.
Before You Start
You need:
- A paid or trial FormPilot workspace with webhooks enabled.
- A workspace role that can manage webhooks.
- A Zapier plan that supports Webhooks by Zapier.
- A published FormPilot form for sending a real
submission.createdsample.
Zapier's Catch Hook trigger is the right starting point for most FormPilot Zaps
because FormPilot sends a JSON POST body that Zapier can parse into fields.
Use Catch Raw Hook only if you intentionally need unparsed request data or raw
headers for custom verification; Zapier applies a smaller 2MB limit to Catch
Raw Hook payloads.
Create The Zapier Hook
- In Zapier, create a new Zap.
- Choose Webhooks by Zapier as the trigger app.
- Choose Catch Hook as the trigger event.
- Continue through the setup step and copy the generated webhook URL.
- Leave Zapier open on the trigger test step.
Zapier gives each Catch Hook a unique URL. Treat that URL like a secret because anyone with the URL can send data to that Zap.
Add The URL In FormPilot
- In FormPilot, open Dashboard -> Settings -> Integrations.
- In the webhook endpoint form, enter a name like
Zapier - New quote. - Paste the Zapier Catch Hook URL into the endpoint URL field.
- Click Add endpoint.
- Store the one-time signing secret only if your Zap will use custom code to verify signatures. Basic Zapier Catch Hook workflows usually do not use it.
FormPilot sends these signed headers on every delivery:
FormPilot-Webhook-IdFormPilot-Webhook-TimestampFormPilot-Webhook-Signature
For no-code Zapier workflows, the important body fields are usually
event_type, test, form, submission, answers, field_labels,
attachments, and summary.
Send Test Data
Click Test on the FormPilot endpoint row first. This sends a signed
webhook.test diagnostic payload to Zapier. Zapier can use it to detect the
general field shape, but production automations should not run from test
diagnostics.
After Zapier detects the test payload, submit the real public form once and
test the Zap trigger again. Use the real submission.created payload for field
mapping because live answers keys are the actual field ids from your form.
Filter Out Test Diagnostics
Add a Zapier filter immediately after the webhook trigger:
| Field | Condition | Value |
|---|---|---|
event_type | exactly matches | submission.created |
test | exactly matches | false |
This prevents the admin-only webhook.test diagnostic from creating junk CRM
records, spreadsheet rows, emails, or tasks. Any payload where test: true is
a diagnostic, not a live customer submission.
Map Useful Fields
Use these fields first:
| Zapier target | FormPilot field |
|---|---|
| Spreadsheet event id | event_id |
| Spreadsheet submitted time | submission.submitted_at |
| Form name | form.title |
| Customer answer values | answers.<your_real_field_id> |
| Human-readable labels | field_labels.<your_real_field_id> |
| Attachment count | attachments length |
| Summary text | summary.text, when summary.status is succeeded |
Do not map production automations from the readable fake ids in webhook.test,
such as customer_name or service_type. Those ids exist only to make the test
payload easy to inspect. Submit the real form and map from its
submission.created payload instead.
Example Payload Excerpt
This excerpt shows the fields Zapier users usually map. See the webhooks reference for the full payload.
{
"event_id": "evt_123",
"event_type": "submission.created",
"created_at": "2026-06-01T12:00:00.000Z",
"workspace_id": "org_123",
"test": false,
"form": {
"id": "form_123",
"title": "Pressure washing quote",
"slug": "pressure-washing-quote"
},
"submission": {
"id": "sub_123",
"submitted_at": "2026-06-01T12:00:00.000Z"
},
"answers": {
"field_abc": "Test Customer",
"field_def": "Driveway pressure washing"
},
"field_labels": {
"field_abc": "Customer name",
"field_def": "Service type"
},
"attachments": [],
"summary": {
"status": "not_requested",
"text": null
}
}Suggested Zap Patterns
- Google Sheets: create one row per
submission.created, withevent_idas the first column for dedupe. - CRM: create a lead or contact from customer answers, then store
event_idandsubmission.idon the record. - Email: send an internal alert using the customer name, requested service, and public form title.
- Tasks: create a follow-up task with the submitted time and dashboard review link if your workflow includes one.
FormPilot delivery is at least once. If Zapier or a later Zap step retries,
your destination may see duplicates. Store and check event_id when the
destination supports deduplication.
Troubleshooting
If Zapier does not detect a sample:
- Confirm the Zap trigger is Webhooks by Zapier -> Catch Hook.
- Confirm the FormPilot endpoint URL exactly matches the Zapier hook URL.
- Send a FormPilot test delivery while Zapier is waiting for trigger data.
- If you want a real field mapping sample, submit the public form once and test the trigger again.
- Check FormPilot's recent delivery status for HTTP status and retry state.
If a Zap creates records from tests:
- Add the filter for
event_type === "submission.created"andtest === false. - Delete records created from
webhook.test. - Re-test with a live form submission before turning the Zap on.
If a Zap receives duplicate live submissions:
- Deduplicate on
event_id. - Check whether Zapier retried a later action step.
- Keep FormPilot manual replay for failed live deliveries only.
If Zapier receives a burst of webhook deliveries:
- Check the Zap's history for throttled or delayed runs.
- FormPilot retries non-
2xxresponses with backoff, but Zapier may still process accepted requests later during high webhook activity. - Keep the Zap focused on one live
submission.createdrecord per run.
Helpful Zapier references: