Skip to main content Skip to main content

How to Test Zapier Webhooks (Catch Hook and Send Hook)

· 5 min read

Zapier's webhook support goes in both directions, and which direction you are dealing with changes how you test it. Catch Hook turns Zapier into a webhook receiver: you send a request to a Zapier-provided URL, and that triggers a Zap. Send Hook is the opposite: Zapier sends a POST request to a URL you control. If you conflate the two, you will end up testing the wrong thing and wasting time.

Catch Hook: sending data to Zapier

When you add a "Webhooks by Zapier" trigger to a Zap and choose "Catch Hook," Zapier generates a unique URL for that Zap. Your application is responsible for sending HTTP POST requests to that URL. The Zap fires whenever a request arrives.

Zapier accepts JSON, form-encoded data, and plain text. For JSON payloads, Zapier flattens nested objects into dot-notation keys. If you POST {"user": {"email": "[email protected]"}}, Zapier exposes it as user__email in subsequent Zap steps. This matters for how you reference fields downstream.

To test the trigger, Zapier shows a "Test trigger" button that tells you to send a request. Once a request arrives, Zapier parses the sample payload and bakes those field names into the Zap. Every subsequent action in the Zap will reference that initial sample structure.

Testing Catch Hook before connecting to Zapier

Stop reading raw JSON

Payloader shows you what your Zapier webhook actually did — in plain English. See the event, amount, status, and more at a glance.

Start free trial →

The sample payload that Zapier captures during "Test trigger" becomes the field map that all downstream Zap actions are built on. If you send a poorly structured payload during testing, you will build your entire Zap on bad field names, and refactoring it later means manually remapping every action.

Before you point your application at the Zapier Catch Hook URL, use Payloader to verify the payload structure first. Create a Payloader endpoint and configure your application to POST to it instead of the Zapier URL. Payloader captures the incoming request, shows all headers, and displays the body in a formatted, readable view.

Once you confirm the JSON structure is correct, the field names make sense, and no required keys are missing or misspelled, swap in the Zapier Catch Hook URL. The first real payload Zapier sees will be clean and ready to build on.

Send Hook: Zapier POSTing to your server

The "Send Hook" action (also under "Webhooks by Zapier") is used when you want Zapier to deliver data to an external URL as part of a Zap. Zapier sends an HTTP POST request to a URL you specify, optionally with custom headers, a custom JSON body, or HTTP Basic Auth credentials.

By default, Zapier sends the payload as JSON with a Content-Type: application/json header. You can also switch it to form-encoded if your server expects that format. The payload itself is built from the Zap's data mapper, so fields from previous steps get interpolated in at runtime.

Zapier also supports setting custom HTTP headers in the Send Hook configuration. This is how you would pass an Authorization header with a Bearer token or an X-API-Key to a protected endpoint.

Capturing Send Hook output with Payloader

When you are building a Zap that uses Send Hook, one of the hardest things to debug is whether the Zap's data mapping is producing the payload you expect. Zapier's own test output only shows you a summary, not the exact bytes it sends.

Set your Payloader endpoint URL as the Send Hook destination and run the Zap. Payloader captures the full HTTP request, including every header and the exact JSON body. You can see immediately whether the field values are being interpolated correctly or whether a reference to a prior step is resolving to an empty string.

This is particularly useful for catching mapping issues where a field works in the Zap editor preview but sends unexpected data at runtime. Payloader's request log lets you compare multiple runs side by side, so you can see exactly when and how the payload changed.

Forwarding to your local server

When you are writing the server code that will receive Zapier's Send Hook, you need to receive real Zapier requests during development. Zapier cannot POST to localhost, so you need a public URL that routes traffic to your machine.

Use Payloader's forwarding feature: set your Payloader URL as the Send Hook destination in the Zap, then configure Payloader to forward incoming requests to your local server address (for example, http://localhost:8000/webhooks/zapier/). When Zapier fires the Zap, Payloader catches the request, records it, and immediately forwards it to your local process.

If your local handler returns an error, you do not need to re-trigger the entire Zap. Use the Replay button in Payloader to resend the exact same request to your local server until your code handles it correctly.

Common Zapier webhook issues

JSON vs form-encoded: Zapier's Send Hook defaults to JSON, but you can change it. If your server parses the request body with a form decoder and Zapier is sending JSON, you will get an empty body. Check the Content-Type header in Payloader to confirm which format Zapier is actually using.

The flat payload structure: Zapier flattens nested objects using double-underscore notation. If you send {"order": {"id": 123}} to a Catch Hook, Zapier sees it as order__id: 123. When you later use Send Hook to forward data from that Zap, Zapier will send the flat representation, not the original nested structure. Your receiving server needs to account for this.

Arrays: Zapier handles arrays poorly. If your payload contains an array of objects, Zapier will only process the first item by default. If your application sends arrays, restructure the payload to avoid them or use Zapier's "Looping by Zapier" add-on to iterate over items explicitly.

The 30-second timeout: Zapier requires your Send Hook destination to respond within 30 seconds. If your server takes longer, Zapier marks the task as an error and may retry. Make sure your endpoint responds quickly, even if actual processing happens asynchronously.

Wrapping up

Catch Hook and Send Hook are distinct enough that they require different testing approaches. For Catch Hook, verify your payload structure with Payloader before Zapier ever sees it, so your field map is correct from the start. For Send Hook, point Zapier at a Payloader URL to inspect the exact payload Zapier generates, then use Payloader's forwarding to route traffic to your local development server once the structure looks right.