Zapier
Send XPAC Forms submissions to a Zap through a Zapier Catch Hook.
Zapier adds a Zapier panel to each form in Forms. Each zap in it sends the submission as JSON to a Zapier Catch Hook once Forms has saved it. Zaps are sent in the background, so a slow Zapier never slows the form.
It needs XPAC Forms. Without it, admins see a notice asking for it.
Connect Zapier
There is no key to save. In Zapier, create a Zap with Webhooks by Zapier as the trigger and Catch Hook as the event, then copy the webhook URL from its Test tab.
Add it to a form
Give each form field a short Name in its block settings, such as email. Zapier
shows answers under these names, and new fields start with random ones.
Open the form's Zapier panel, click Add zap and paste the URL into Webhook URL.
Click Send test in the zap. It sends sample answers built from the form's saved fields, with the zap's current settings. In Zapier, click Test trigger to load the sample.
The zap's settings:
- Title: shown in the list and in delivery errors. Untitled zaps show as "Zap 1", "Zap 2" and so on.
- Webhook URL: the Catch Hook URL, exactly as Zapier shows it. A URL not on hooks.zapier.com gets a warning. Addresses on this server or a private network are refused.
- Fields to send: All fields sends every field under its Name. Blank or hidden fields are sent empty (a file field as an empty list), so the Zap always sees the same fields. Selected fields sends only your rows, each with a Name in Zapier, a Source (Form field or Fixed value) and a Value. Blank answers are left out.
- Send choice labels: sends the choice text the visitor saw instead of its stored value. On for new zaps. Zaps saved before it existed keep sending stored values.
- Send file links: sends a public link for each uploaded file. Off by default. Links never expire. A file kept private by Keep uploaded files private can't be sent, and the zap fails.
- Include submission metadata: adds
_xpac, shown below. - Include visitor IP and browser: shows once metadata is on. Off for new zaps. Zaps saved before it existed keep sending both.
Password and confirmation fields are never sent. Only people who can view form submissions can add a zap or change its URL.
{
"_xpac": {
"form_id": 42,
"entry_id": 731,
"site_url": "https://example.com/",
"delivery_id": "9f2c41d07b6e4a8d93e1c5f0a2b7d864",
"timestamp": "2026-09-28T10:15:00+00:00",
"ip_address": "",
"user_agent": ""
}
}timestamp is when the zap was sent. ip_address and user_agent stay empty unless
Include visitor IP and browser is on. The test sample has _xpac.sample set to
true, so a Filter step in the Zap can drop it.
A zap can arrive twice
If the connection drops after Zapier accepted a submission, XPAC sends it again. When
a duplicate would hurt, turn on metadata and have the Zap skip a _xpac.delivery_id
it has already seen. It stays the same on every retry and differs for each zap.
When a send fails
Each result is on XPAC → Forms → Deliveries and in the submission's own Deliveries row:
- Waiting: queued, or waiting for its next try.
- Delivered: Zapier accepted it.
- Failed: not sent. The error names the zap and says why.
- Skipped: nothing to send, for example because no zap's condition matched.
- Dismissed: you dismissed it, or the submission is in spam or the trash.
Zapier has 10 seconds to reply, and only a 2xx reply counts. Timeouts, rate limits and server errors are tried again after 1, 5, 30 and 120 minutes, five tries in all. Other errors fail at once. A Zap that is off or deleted answers 404: turn it on, then retry.
Each zap that went through is marked done, so a retry sends only the zaps that failed. When one zap fails for good while others went through, the delivery is Failed right away and doesn't count toward a pause.
Retry now sends a failed or dismissed delivery again with the form's current settings, so fix the zap first. Retry works for 30 days after the submission.
After 5 failed submissions in a row on one form, Zapier pauses on that form. Rate limits and errors about one submission's data don't count. While it's paused, new submissions are saved but show as Failed, XPAC still tries one an hour, and the first one that goes through ends the pause. The site admin gets one email when it pauses, and Deliveries shows the pause with a Resume and retry button that resumes and sends the failed submissions again.
For developers
xpac_zapier_field_value: filters each answered field. File fields arrive as arrays of URLs.xpac_zapier_request_body: filters the whole body. Return aWP_Errorto fail without sending.xpac_zapier_request_timeout: seconds to wait. Default 10, from 1 to 30.xpac_zapier_send_unanswered_fields: return false to leave blank fields out of All fields.xpac_zapier_send_ip_address: return false to send the IP address empty.xpac_zapier_allow_unsafe_url: return true to send to this server or a private network. It turns off WordPress's protection for that request.xpac_zapier_response_log_entries: replies kept per zap on the submission. Default 5, from 0 to 20.xpac_zapier_response(action): runs after each reply, with the reply, the URL and the submission.
Each delivery also sends its delivery ID in an Idempotency-Key header, and a test
sends X-XPAC-Sample: 1. A Catch Hook doesn't pass headers to the Zap. Only a Catch
Raw Hook does. Signatures are in the Zapier hook reference.