Zapier

Queue XPAC Forms submissions for delivery to a Zapier Catch Hook, with explicit field, file, and metadata controls.

Zapier extends Forms with a Zapier panel on every form. Each enabled action sends one JSON POST request to a Zapier Catch Hook after Forms has safely stored the entry.

Delivery is queued. A slow or unavailable Catch Hook does not hold the visitor's request open, and its result appears with the entry on the Deliveries screen.

Forms is required

This add-on does nothing without XPAC Forms. It shows an administrator notice instead of registering a panel or submission callback.

Set up a Zap

In Zapier, create a Zap using Webhooks by Zapier → Catch Hook as its trigger, then copy the complete HTTPS hook URL.

Edit the form in WordPress, open Zapier, choose Add zap, and paste the URL into Request URL.

Choose All Fields or Select Fields. In selected mode, give every row an outgoing Key, choose whether its Source is a Form field or a Fixed value, and then choose or enter the value.

Choose the optional file and metadata settings described below. Save the action, then update the form.

Submit a realistic test. Confirm the delivery in WordPress and inspect the Zapier trigger sample before enabling downstream actions.

Controls

ControlMeaningDefault
TitleAdministrator-only label used in the action list and delivery errors.Zap Name
Request URLComplete Catch Hook URL.empty
Fields to sendEvery eligible field, or an explicit mapping.All Fields
Forward public file URLsAllows public upload links to leave the site.off
Include submission metadataAdds form, entry, and site identity under _xpac.off
Status toggleTemporarily disables this action without deleting it.on

Conditional Logic can add a condition to an individual Zapier action. A condition that does not match is an intentional skip, not a failed delivery.

Payload rules

All Fields

The outgoing key is each field block's name; the value is that field's submitted answer. Unnamed fields and answers removed because a conditional section was hidden are omitted.

Two safety rules apply:

  • Password fields are never sent.
  • File fields are omitted unless Forward public file URLs is enabled.

Select Fields

Every row has an explicit source type. This prevents a renamed or deleted form field from silently becoming a fixed string. A Form field row whose field no longer exists fails the delivery with an actionable configuration error. A Fixed value row sends exactly the stored string.

Keys must be non-blank and unique. Missing, duplicate, unresolved, or malformed rows fail before any request is made. A hidden or unanswered field that still exists is simply absent from that submission's payload.

Review legacy custom-value rows once

Older versions stored a field reference and a fixed value in the same shape. A legacy row that still names an existing field remains unambiguous and keeps working. A non-resolving legacy row could be either a custom value or a renamed field, so delivery now fails closed. Open the action, choose Form field or Fixed value, and save it.

Files

File forwarding is off by default in both modes. When enabled, each attachment is sent as a URL, not as file bytes.

Only deliberately public uploads can be forwarded

A public upload URL does not expire and can be opened by anyone who receives it. Enable forwarding only when the visitor expects the selected files to reach Zapier and its downstream apps.

Forms uploads stored in private mode require an authenticated administrator. Zapier cannot use that route, so the delivery fails instead of sending an unusable or access-controlled link. If any opted-in attachment is missing or no longer has a public URL, the whole action fails rather than silently dropping one file from the list.

Submission metadata

Enable Include submission metadata to add:

{
	"_xpac": {
		"form_id": 42,
		"entry_id": 731,
		"site_url": "https://example.com/"
	}
}

_xpac is reserved while this option is enabled. The entry ID is stable across delivery retries and can be used by a Zap to reject a duplicate.

Delivery and retries

Forms stores the entry and durable delivery record before scheduling the Zapier request. The worker sends actions sequentially, with a ten-second response timeout (filterable but clamped to 1–30 seconds), and accepts only HTTP 2xx responses. Transport failures, rate limits, and server errors are classified for retry; permanent configuration and client errors remain visible for an administrator to fix and retry.

If one action succeeds and a sibling fails, the successful action is recorded and is not sent again when the delivery job retries.

External delivery is at least once

A connection can fail after Zapier accepted the request but before WordPress saw the response. WordPress must then treat the outcome as unknown, so a retry can produce a duplicate. Catch Hooks do not provide a transactional idempotency contract. Include _xpac.entry_id and deduplicate in the Zap or destination when duplicate side effects would be harmful.

The visitor's successful form response does not depend on Zapier. Monitor failures in XPAC → Forms → Submissions → Deliveries and keep the Forms delivery worker/Action Scheduler healthy.

URL safety

The URL must:

  • begin with http:// or https://;
  • contain a readable host;
  • contain no embedded username or password; and
  • avoid loopback, private/reserved IP literals, and unsafe ports.

The actual request uses WordPress's safe HTTP client, so DNS-time redirects and resolved private addresses are checked as well. Standard tokenized Zapier Catch Hook URLs, including query strings, are accepted.

xpac_zapier_allow_unsafe_url exists for controlled private-network deployments, but returning true disables important SSRF protections for that request. Prefer a narrow host check and keep the default on internet-facing sites.

Stored settings

Settings live in the form's edit-context form_settings meta. A current selected mapping looks like this:

{
	"zapier": {
		"items": [
			{
				"status": true,
				"title": "CRM intake",
				"request": {
					"url": "https://hooks.zapier.com/hooks/catch/123456/abcdef/"
				},
				"body": {
					"type": "selected",
					"includeFiles": false,
					"includeMetadata": true,
					"fields": [
						{
							"key": "email",
							"kind": "field",
							"field": "email"
						},
						{
							"key": "source",
							"kind": "literal",
							"field": "website"
						}
					]
				}
			}
		]
	}
}

The meta schema declares status, request data, body mode, source kind, file and metadata choices. Invalid structures written outside the editor fail as configuration errors rather than raising a PHP type error or sending a partial payload.

Developer filters

xpac_zapier_field_value runs for every submitted form field, including opted-in files after their IDs become public URL arrays. Its original first four parameters remain unchanged; three identifying parameters were appended:

apply_filters(
	'xpac_zapier_field_value',
	$field_value,
	$field_type,
	$data,
	$blocks,
	$field_name,
	$payload_key,
	$submission
);

xpac_zapier_request_body receives the complete array before JSON encoding and may return an array or WP_Error:

apply_filters(
	'xpac_zapier_request_body',
	$payload,
	$item,
	$submission
);

The package also exposes xpac_zapier_request_timeout and the advanced URL-safety override described above. It registers no public REST route of its own.

On this page