Webhooks are a powerful way to integrate your applications and services with Webflow, allowing you to receive real-time updates whenever specific events occur on your site. By setting up webhooks, you can automate workflows, trigger external processes, and synchronize data across different platforms without any manual intervention.
When an event occurs, Webflow will send a POST request to a specified URL.
The webhook body will be a JSON resource object that relates to the event. The request headers will include:
Content-Type header set to application/jsonx-webflow-timestamp with the time the webhook was sentx-webflow-signature header containing the request signature. Read on for information about validating request signatures.Below is an example of webhook event data.
In this tutorial, we’ll walk through creating a webhook to listen for new submissions to a contact form on a site. Whenever someone submits this form, Webflow will send a notification to the specified destination. Additionally, we’ll cover how to verify that the webhook requests you’re receiving are genuinely from Webflow, ensuring secure and reliable communication with your application.
If you’d prefer a way to set up webhooks without using the API, you can easily configure them through the Webflow dashboard. Please note, that webhooks created through the dashboard will not include the request headers needed to validate request signatures.
forms:read scope.Before we get started working with the API, we’ll first need to create a form and publish our site. If you already have a working form on your site, you can skip this step. To create a site with a form, we’ll use the Biznus template, which already has a form on its contact page.
Clone the Biznus template to your development Workspace.
Go to the Contact Page to view your form. Here, you can review your form’s fields. Ensure each field has a unique name. These field names will be used as keys in the webhook’s payload.

Publish the site by clicking the publish button in the top right corner.
Webhooks require the following elements to function:
Once we have these elements, we can create the webhook by sending a POST request to the Create Webhook endpoint.
Get the Site ID. There are two ways to get your Site ID, you can access the ID via site settings, or send a request to the List Sites endpoint.
In the designer, click the Webflow Icon in the top left corner, and select “Site Settings” from the menu.
In your site settings, scroll down to the “Overview” section to find your Site ID

Get your destination URL. Navigate to webhook.site and copy your unique URL. This URL will be used as the destination where Webflow will send webhook events.

Send a POST request to the Create Webhook endpoint. In the request, you’ll include the site_id, url, and triggerType of form_submission.
Additionally, the form_submission trigger supports a filter parameter, allowing you to specify the name of the form you’d like to receive notifications for. This is particularly helpful if you have multiple forms on a site.
You can also use the interactive API Reference to quickly send a POST request to the Create Webhook endpoint without writing any code.
Review the response. After successfully establishing your webhook, you should receive a confirmation similar to the one shown below:
Once you’ve successfully created the Webhook to listen for new form submissions, you can test it by navigating to the form on your site and submitting a response.
Once you’ve submitted a response, head over to webhook.site to view the POST request from Webflow. If the request is successful, you’ll see the Request Details, Headers, and Payload sections. These details should match the JSON object shown below.
Notice the headers included in the response: x-webflow-timestamp and x-webflow-signature. These headers are crucial for verifying the authenticity of the webhook.
Your service should return a 200 response to show that the webhook was successfully captured. If the response status is anything else, the webhook will be retried up to three more times at which point the request will be considered failed and will no longer be retried.
Webflow considers the following scenarios as failure conditions:
If Webflow repeatedly encounters failure conditions while attempting to deliver a webhook payload, we will take the following action:
To reactivate your webhook or if you have any questions regarding a deactivated webhook, please don’t hesitate to reach out to our support team.
Understanding the limits imposed by Webflow can help you design and manage your webhooks more efficiently:
This is the full list of webhook events available in Webflow. For complete documentation of webhook events with payloads, please see the webhook events documentation.
Webflow provides methods to verify that requests are genuinely coming from the Webflow API by using signatures included in the request headers. These signatures vary based on the creation method of the webhook.
x-webflow-timestamp : The time the webhook was sent, represented in Unix epoch time format.x-webflow-signature : The request signature, formatted as a SHA-256 HMAC hash. It uses either the site token secret or the OAuth app’s client secret as the signing key.To ensure the authenticity of a webhook request from Webflow, validate the request signature using the provided headers and your webhook’s associated signing key.
Depending on the creation method of the webhook, you’ll receive a different signing key.
Webflow recommends use of the provided SDK method to verify the incoming webhook requests’ signatures.
As signature implementations are subject to change, Webflow will support updates to the method to ensure smooth transitions for developers. All you will need to do is update the package version to benefit from these changes.
Extract data from the HTTP Request
headers : Keep the headers as a record-like objectbody : Stringify the entire request bodyAwait the results
If you need to validate the request signature without use of the SDK, follow the steps below to achieve the same effect as the SDK method.
Generate the HMAC hash
x-webflow-timestamp header.:) separator. The format should be:
Compare the generated hash with the provided signature
Compare the generated HMAC hash with the x-webflow-signature header from the request. A match confirms the request’s legitimacy; otherwise, it should be considered potentially tampered with or fraudulent.
Verify the timestamp
Check the x-webflow-timestamp header to ensure the request is recent. A request older than 5 minutes may indicate a replay attack. Calculate the request’s age as follows:
If the difference exceeds 5 minutes (300,000 milliseconds), consider the request potentially compromised.
See below for examples that accept an incoming HTTPS request and validate the signature: