A webhook is the simplest way to get a form submission out of Taku and into another tool. Every time a visitor submits a form in a campaign, Taku sends the answers to a URL you choose, right away. That URL can belong to your own server, your CRM, or an automation tool such as Zapier, Make or Pabbly Connect. If you use one of those three, read their guide instead, it walks you through the clicks on their side.
Connecting a webhook
Open the campaign in the editor and scroll the sidebar down to Integrations. Click Add integration, then choose Webhook.
Paste your endpoint URL. It has to start with https://. Then click Test and add. Taku sends a sample submission to that URL and waits for the answer. If your endpoint replies with a success status, the webhook is added to the campaign. If it doesn't, you see the status it answered with, and you can fix the URL and try again.
Finally, save the campaign. Integrations are part of the campaign, so they go live together with everything else you changed.
A campaign can have up to ten integrations. Every form in the campaign sends to all of them, so if you run an A/B test with two variations, both variations post to the same place.
What Taku sends
Each submission arrives as a POST request with a JSON body that looks like this:
The part you will use most is data.fields. It holds the visitor's answers, one entry per input, under a short name called the input's key. Taku creates the key from the input's placeholder when you save the campaign, so a placeholder like "Company name" becomes company_name. You can change a key by editing the input in the form, but remember that anything already mapped to the old name will need to be mapped again.
data.contact repeats the visitor's email and name when the form collects them, so you don't have to look for them among the fields. data.form_id tells you which form of the campaign was submitted. data.page is the page the visitor was on. data.schema lists every input with its key, type and placeholder, for tools that need more than the flat answers.
The id at the top identifies the event. If Taku has to retry a delivery, the retries carry the same id, so you can safely ignore a duplicate you have already processed.
A test sent from the editor looks exactly the same, with one extra field at the top: "test": true.
Headers
Every request comes with two headers. X-Taku-Event-Id is the same value as id in the body. X-Taku-Payload-Version is the version of the payload shape, which is 2 for the format above.
When your endpoint is down
Taku waits up to ten seconds for a success status. Redirects are not followed. If the request fails because of a network problem, a timeout, or a status of 408, 429 or anything in the 500s, Taku tries again, up to five times, with a growing pause between attempts. The last attempt lands about an hour after the submission. Other statuses in the 400s are treated as a final answer and are not retried.
If a webhook keeps failing, the owners of the project receive one email a day about it. The submissions themselves are always kept in Taku, so nothing is lost, and you can always find them under the campaign's entries. Once your endpoint is back, new submissions flow again on their own.
Making sure a request came from Taku
Requests are not signed. If the endpoint is your own, put a secret token in the URL, for example https://example.com/hooks/taku?token=a-long-random-string, and check for it on your side. Treat URLs from Zapier, Make and Pabbly the same way: they contain such a token already, which is why you should not share them.
Which URLs are allowed
Only https:// URLs to public hosts. Addresses on private networks, localhost and cloud metadata ranges are refused when you add the webhook and again on every delivery.
Webhooks created before September 2026
If you set up a webhook before September 2026, it keeps receiving the original payload: a flat object with space_id, popup_id, visitor_id, visitor_email, visitor_name and a data array of input_id and value pairs. When you are ready to switch to the format above, click the edit icon on the webhook in the Integrations section, change Payload version to Version 2, and click Test and save. Going back to the original format is not possible, so re-map your fields on the receiving side right after.