Integrations and Marketplace Apps
|
This content was generated with the assistance of AI and should be verified against the official Webflow documentation before being relied on in production. This sub-section’s Webflow bibliography lists the reference material consulted while preparing these pages. |
This page describes how a Webflow site connects to other tools, as the official documentation stated it on 2026-10-28, the date on which its facts were checked. Webflow is a SaaS platform with no version numbers, so everything below is dated and the pages that track change over time are linked at the end. Plans are named by tier only and this page never quotes prices. Installing a Marketplace app needs a Workspace role that is allowed to authorize apps; analytics and tag scripts need custom code, which needs a paid plan; the Browser API consent calls need a site with Webflow Analyze or Optimize enabled and tracking turned on; and a free Developer workspace is enough to try every webhook example below, because nothing here publishes to a production domain. The Plans, Workspaces, Seats and Roles page explains how those tiers relate.
The running example is Fernbrook Gardens, the fictitious botanical garden of this sub-section. The garden publishes in
English, Spanish (/es) and German (/de); see Localization. The marketing manager
wants visitor statistics, the group-visit enquiry form copied into a customer-relationship tool and a Slack message, a
newsletter form, and a cookie banner that is correct in three languages. The webmaster wants to do that with as few
scripts and as little data leaving the site as possible. This page shows the options and what each one costs in privacy
and maintenance.
Four ways to connect a site
Webflow does not run server-side code on a published page, so every integration is one of four shapes. Choosing the shape first makes the rest of the decision easier.
| Shape | How it works | Fernbrook example |
|---|---|---|
Native setting |
A field in Site settings that Webflow turns into a tag on every page |
Google Analytics measurement ID, Google site tools |
Marketplace app |
An OAuth app that reads or writes parts of the site through the Data API, or embeds a Designer extension |
A HubSpot app that embeds forms; a Designer extension that shows SEO checks |
Script in the page |
A snippet of custom code or a tag manager that runs in the visitor’s browser |
The Google Tag Manager container, the consent banner |
Event to automation |
A webhook or a Zapier or Make trigger that fires when something happens in the site and runs steps elsewhere |
The enquiry form posts to a Slack channel and a spreadsheet |
The diagram shows where each shape sits between the visitor, Webflow and the outside tools.
Two limits keep the picture honest. Webflow does not execute your code on its servers for a normal site, so anything that must run when a form is submitted runs in an outside service or in a backend you control, or in Webflow Cloud (see Webflow Cloud). And every outside tool that receives data from the browser or from a webhook becomes a processor of visitor data, which is the reason that the consent and security sections below matter as much as the setup steps.
Marketplace apps
The Webflow Apps Marketplace at https://webflow.com/apps lists apps that extend the Designer, the Dashboard or the published site. On 2026-10-28 the page offers 22 filter categories, including AI, Analytics, Automation, Ecommerce, Forms and Surveys, Marketing, MCP and Agents, SEO and Utilities, and several hundred apps. Each listing is tagged as free, as having a free plan or as paid; the price of a paid app is set by its developer, not by Webflow, and is separate from the Webflow plan. Apps are built by third parties, or by Webflow itself for apps such as the Google site tools app, using the mechanisms described on Apps Overview and OAuth and published through the process on Publishing Apps and the Marketplace.
An app is one of three kinds, and the kind decides what it can touch.
-
A Data Client app uses the Data API with an OAuth access token. It can read or change only the resources that its scopes name, such as forms, CMS collections or assets.
-
A Designer Extension runs inside the Designer in an iframe and uses the Designer API to change the page. See Designer Extensions and the Designer API.
-
A hybrid app combines both and talks to its own backend. See Hybrid Apps.
Installing an app
The documented rules for who can install an app are short.
-
A new app is visible only inside the Workspace that registered it. External users cannot install it until Webflow has approved and published it in the Marketplace, although its developer may test with external users beforehand.
-
Only a Workspace admin can create apps, see client secrets, upload bundles or change app settings; that is about developing apps, not installing them.
-
The developer chooses whether the app can be authorized for one site only or for several sites or the whole Workspace. The registration setting is named Restrict app installation to a specific site and is off by default.
-
Scopes are chosen when the app is registered and are locked once it is published. Adding a scope needs a new approval from Webflow, and users then authorize the app again through the OAuth URL, which now lists the new scope.
The installation of an app proceeds in the same order each time.
-
Open the app’s Marketplace listing and read its description, its support and privacy links, its pricing and its reviews.
-
Choose Install and sign in to Webflow if asked. Webflow shows an authorization screen that lists the app, the sites or the Workspace that it will be connected to, and the permissions that it requests.
-
Read the permission list before accepting. Each permission corresponds to a scope, for example read access to forms or write access to CMS items, and the next section explains how to judge them.
-
Pick the sites. Authorize the one site that needs the app, and not the whole Workspace, whenever the choice is offered.
-
Return to the app, which stores an access token for that authorization. Test it on a Developer workspace site or a staging site before authorizing it on the production site.
Reviewing scopes before you accept
A scope is the unit of permission in the Data API. The convention is resource:read and resource:write, for example
forms:read, cms:read, cms:write, sites:read and custom_code:write. The full list and the rules for tokens are on
Data API Authentication and Scopes. For an installation
decision the useful questions are these.
| Question | Why it matters |
|---|---|
Does each scope match the stated job of the app? |
A newsletter form embed needs access to forms; it does not need CMS write access. Webflow’s Marketplace guidelines tell developers to request only what they need and not to ask for Workspace-level scopes when site-level access is enough. |
Is access limited to one site? |
An app authorized for the Workspace can see every site in it, including ones that are not yet public. |
Is there a write scope on production content? |
A write scope on CMS items or custom code can change what visitors see. Treat it like giving someone Designer access. |
Where does the data go? |
Read the app’s privacy policy. Form data or CMS data copied to the developer’s servers is a transfer of visitor data to a processor, which belongs in the garden’s privacy notice. |
Who can revoke it? |
Know in advance who may remove an app’s authorization, and check the list of connected apps after every team change. |
A practical habit for Fernbrook is a one-page register that lists each connected app, the scopes that it holds, the sites that it can reach, the owner on the garden’s staff and the date of the last review. When a staff member leaves, the register shows which tokens must be removed. The scopes that an app holds are also visible to the app developer in the app settings, and the Marketplace guidelines warn that changing the OAuth URL before an update is approved produces a scopes mismatch error for users, which is a reason to expect a short delay when an app asks for more access.
Source: Apps: Register an app and Apps: Submitting your app.
Apps and custom code
An app that changes the published page usually does so through the custom code endpoints of the Data API, which accept only OAuth app tokens. It registers a script and applies it to a site or page. Applying scripts with a PUT replaces the whole list, so a well-behaved app reads the list, adds its entry and writes it back. When two apps both manage scripts, the second can erase the first if it is careless. After installing an app that adds a script, open the site’s custom code settings and the page source of the published site, and confirm that your own head and footer code are still there. The mechanism is described on Data API: Assets, Forms and Custom Code.
Google Analytics and Google Tag Manager
Webflow offers two ways to add Google measurement to a site, and a third that goes around them. Pick one and write down why, because running two at once counts every visit twice.
The native Google Analytics field
Site settings, in the Integrations tab, has a Google Analytics field that takes a GA4 measurement ID. On 2026-10-28
Webflow’s article states that only GA4 measurement IDs are accepted; a site that still shows a UA- tracking ID belongs to
the retired Universal Analytics and must be migrated in Google Analytics first. After the ID is saved and the site is
published, Webflow inserts the Google tag in the head of every page. The same article advises placing the tag in only one
place, either the field or the custom code, so that the tag does not fire twice.
The tag that results is the standard Google tag. This is the shape of what ends up in the page, with a placeholder ID.
<!-- Google tag (gtag.js), measurement ID is a placeholder -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-XXXXXXXXXX"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-XXXXXXXXXX');
</script>
Google site tools
Google site tools for Webflow is a Marketplace app made by Webflow. It connects Google Analytics 4, Google Search Console and Google Tag Manager through one Google sign-in and can add a Tag Manager container without code. It holds the authorization to both accounts, so it follows the review rules above: authorize it for the Fernbrook site only, sign in with a Google account that belongs to the garden and not to a person, and remove the connection when the person who made it leaves. The listing is at https://webflow.com/integrations/google-site-tools-for-webflow.
Google Tag Manager by hand
The third option is to paste the container snippet into the site’s custom code. A Tag Manager container then holds the GA4 tag, a Facebook pixel, a Hotjar script and so on, and the marketing manager changes them without asking the webmaster to edit the site. The cost is that the container becomes a place where arbitrary code can be added by anyone with access to it. Treat container access like Designer access.
The container has two parts, a script for the head and a noscript iframe for the start of the body. Webflow’s custom code
settings have a head box and an end-of-body box. The noscript fallback is optional on a site that already requires
JavaScript, and it is only valid HTML in the body, so many sites paste only the head part into the site-wide head code.
<!-- Site settings, Custom code, Head code. GTM-XXXXXXX is a placeholder container ID -->
<script>
(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer','GTM-XXXXXXX');
</script>
Custom code is limited to 50,000 characters per head or footer box, which a container snippet uses a tiny part of, and it
runs on the published site only. The Designer canvas does not run it, and the preview and comment modes render on a
canvas.webflow.com host that a content security policy must allow. To see a tag working, publish to the staging domain
and use the Tag Manager preview mode or the Realtime report of GA4. The
Custom Code: Head, Footer and Embeds page describes the boxes in
detail, and Third-Party Libraries and Scripts covers loading
other scripts.
Tracking Webflow forms and clicks
A published Webflow form submits through the Webflow form handler and shows the success state without a page reload. A tag manager sees that only if the page sends an event. The simplest method is a custom event pushed to the data layer from the form’s success handling. Because the exact moment depends on how the form is configured, the Fernbrook snippet listens for the form’s own submit, which fires before the success message and is good enough for a count of attempts.
// Footer code. Pushes one dataLayer event per form submit; the tag manager decides what to do with it.
window.dataLayer = window.dataLayer || [];
document.addEventListener('submit', function (event) {
const form = event.target;
if (!(form instanceof HTMLFormElement)) return;
window.dataLayer.push({
event: 'form_submit_attempt',
form_name: form.getAttribute('data-name') || form.id || 'unnamed',
page_language: location.pathname.startsWith('/es') ? 'es'
: location.pathname.startsWith('/de') ? 'de' : 'en'
});
}, true);
Source: Browser API: wf.ready for the readiness model, and
Google Tag Manager: Custom tags for loading scripts in a tag
manager. The submit listener itself is plain DOM and not a Webflow API.
The data-name attribute is what Webflow writes into a form from its name in the Designer, so naming each form clearly in
the Designer is also naming it for analytics. See Forms for the generated markup.
Consent and the Browser API
A visitor in the European Union must usually agree before analytics cookies are set. A consent tool, whether a commercial consent management platform or a banner that you write, decides whether scripts are allowed. Webflow adds one more thing to decide, because Webflow Analyze and Optimize track visitors on their own.
The Browser API is the JavaScript object wf that Webflow includes on sites that have Analyze or Optimize enabled. It is
available only when tracking is on, which is set in the Insights tab under Settings and Tracking, by turning on Start
tracking visitor data. It can be called from custom code in the head box, from a tag manager, or from any script on the
site. Three methods manage the visitor’s tracking choice.
| Method | Effect |
|---|---|
|
Returns the stored choice of the visitor, which the documentation compares with the values |
|
Records that the visitor accepts Webflow tracking; the banner example passes |
|
Records that the visitor refuses Webflow tracking |
Every call goes inside wf.ready(), which waits until the Browser API has loaded. Two consequences are worth stating.
First, the consent calls govern Webflow’s own tracking for Analyze and Optimize; they do not switch Google Analytics, a
Facebook pixel or a HubSpot tracking code on or off. Those scripts need their own gate, as the next sections show. Second,
privacy compliance remains the site owner’s responsibility, and the documentation says its banner example is a starting
point that may not satisfy every privacy law. It is not legal advice, and the garden’s data-protection adviser should
approve the final wording.
Connecting a consent management platform
If the garden uses a consent management platform (CMP), the platform’s callback should call the Webflow methods when the
visitor makes or changes a choice. The documentation’s general pattern is the following, shown here in the shape used by
the page, with the garden’s own fernbrookConsent object standing in for a platform’s event.
// Site settings, Custom code, Head code. A generic CMP hands over { analytics: true | false }.
wf.ready(function () {
function applyConsent(consent) {
if (consent && consent.analytics) {
wf.allowUserTracking();
} else {
wf.denyUserTracking();
}
}
// Run once for a choice that was stored on an earlier visit
if (window.fernbrookConsent) {
applyConsent(window.fernbrookConsent.current());
}
// Run again whenever the visitor changes the choice
document.addEventListener('fernbrook-consent-changed', function (event) {
applyConsent(event.detail);
});
});
The same page publishes samples for OneTrust, which reads the OptanonConsent cookie and reacts to the
OneTrust.OnConsentChanged event, and for TrustArc, which reads a stored preference object; it states that Webflow does
not support those samples. Read them as examples of the callback pattern and test them on the staging domain.
A banner of your own, in three languages
A small site can do without a platform. The documentation’s second example builds a banner in the Designer, hides it when
a choice is stored and shows it otherwise, with Accept calling wf.allowUserTracking({ activate: true }) and Decline
calling wf.denyUserTracking(). The Fernbrook version below keeps the logic and adds what a multilingual site needs:
the text comes from the locale in the URL, and the Google tag is loaded only after acceptance. Because the banner is part
of the page, its text should be a localized element rather than a string in the script; the script here carries the
strings only to stay self-contained.
// Site settings, Custom code, Head code. #consent-banner, #consent-accept and #consent-decline
// are elements built in the Designer; GA_ID is a placeholder measurement ID.
const GA_ID = 'G-XXXXXXXXXX';
const TEXT = {
en: { accept: 'Accept', decline: 'Decline' },
es: { accept: 'Aceptar', decline: 'Rechazar' },
de: { accept: 'Akzeptieren', decline: 'Ablehnen' }
};
function loadGoogleTag() {
if (document.getElementById('ga-loader')) return;
const s = document.createElement('script');
s.id = 'ga-loader';
s.async = true;
s.src = 'https://www.googletagmanager.com/gtag/js?id=' + GA_ID;
document.head.appendChild(s);
window.dataLayer = window.dataLayer || [];
window.gtag = function () { window.dataLayer.push(arguments); };
window.gtag('js', new Date());
window.gtag('config', GA_ID);
}
wf.ready(function () {
const banner = document.getElementById('consent-banner');
const lang = location.pathname.startsWith('/es') ? 'es'
: location.pathname.startsWith('/de') ? 'de' : 'en';
const choice = wf.getUserTrackingChoice();
if (banner) {
document.getElementById('consent-accept').textContent = TEXT[lang].accept;
document.getElementById('consent-decline').textContent = TEXT[lang].decline;
}
if (choice === 'allow') { loadGoogleTag(); if (banner) banner.style.display = 'none'; return; }
if (choice === 'deny') { if (banner) banner.style.display = 'none'; return; }
if (banner) banner.style.display = 'flex';
document.getElementById('consent-accept').addEventListener('click', function () {
wf.allowUserTracking({ activate: true });
loadGoogleTag();
banner.style.display = 'none';
});
document.getElementById('consent-decline').addEventListener('click', function () {
wf.denyUserTracking();
banner.style.display = 'none';
});
});
To check the result, open the browser’s developer tools on the published staging page and run wf.getUserTrackingChoice();,
which is the check the documentation recommends. A cleared browser shows no stored choice, and after the Accept button it
returns the allow value.
Several points need care.
-
The API exists only on some sites. On a site without Analyze or Optimize,
wfis not defined, and the script above throws. Guard withtypeof wf !== 'undefined'if the same code is shared between sites, and gate Google scripts on your own stored choice then. -
A scripted banner does not run on the canvas. Custom code runs on the published site only, so the banner has to be checked on the staging domain.
-
Gate every third party, not only Webflow’s own. A YouTube embed, a map, a Google Font loaded from Google’s servers and a HubSpot tracking code all contact third parties. See Typography and Fonts for the font case.
-
The banner must be as easy to refuse as to accept, and the refusal must work without extra clicks; that is a legal point that the site owner confirms with an adviser, not a Webflow setting.
-
Consent is per visitor and per browser. A stored choice does not follow a visitor to another device.
Automation tools: Zapier and Make
Webflow has no workflow builder of its own since the sunset of Logic. Two automation platforms are the tools that Webflow named when it announced the sunset, Zapier and Make, and many others exist. Both connect to Webflow through an OAuth authorization of their own Webflow app, so the scope review above applies to them too. This page presents them neutrally; nothing here endorses one over the other, and either can be replaced by a small function of your own.
What each platform offers for Webflow
On 2026-10-28 the platforms' own pages describe these building blocks.
| Zapier | Make | |
|---|---|---|
Form trigger |
A New Form Submission trigger that is listed as instant; you choose the site and the form, and one test submission must exist |
A Watch Events module in the Webhook group for events, and form modules to list, get and update submissions |
CMS actions |
Create Item, Update Item and Find Item |
Modules for creating, updating and listing collection items |
Catch any event |
A Webflow + Webhooks by Zapier path and a generic Catch Hook trigger |
A custom webhook module that receives any JSON |
Connection |
OAuth to the Webflow account, then a site and a form are selected |
A connection is created in the scenario; Webflow’s site settings list what the connection was granted, including forms data |
The details change as the platforms change their apps. When a trigger is missing or its field list is old, the platforms' recommendation, repeated in their own forums, is to run the trigger once in test mode and submit the form again so that the platform reads the current fields. Each Webflow form needs a unique name, because both platforms identify a form by name.
Webhooks, the generic route
When the native trigger of a platform does not fit, a Webflow webhook can call any HTTPS URL. The webhook is created with
the Data API, needs a site token or an app token with the forms:read scope for the form trigger, and can be limited to
one form with a filter on the form name. The Data API allows at most 75 webhooks per trigger type per site. The destination
must answer with status 200; any other status, a redirect, a certificate error or a timeout counts as a failure, Webflow
retries three more times at ten-minute intervals, and then deactivates the webhook and sends an email. The secret key, when
present in the response, appears only for webhooks created with a site token from the Dashboard, and it must be stored
securely.
Create a Fernbrook webhook that sends enquiry-form submissions to a Zapier catch hook. The token and the site ID come from the environment, and the URL is a placeholder.
# Developer workspace site. WEBFLOW_API_TOKEN needs the forms:read scope; the hook URL is a placeholder.
curl -X POST "https://api.webflow.com/v2/sites/$WEBFLOW_SITE_ID/webhooks" \
-H "Authorization: Bearer $WEBFLOW_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"triggerType": "form_submission",
"url": "https://hooks.zapier.com/hooks/catch/0000000/abcdefg/",
"filter": { "name": "Group Visit Enquiry" }
}'
Source: Data API: Working with webhooks.
Webflow then sends a JSON body with the headers Content-Type: application/json, x-webflow-timestamp and
x-webflow-signature. The structure of a form submission event, condensed and with Fernbrook data, is this.
{
"triggerType": "form_submission",
"payload": {
"name": "Group Visit Enquiry",
"siteId": "000000000000000000000000",
"data": {
"Name": "Marta Ruiz",
"Email": "marta@example.com",
"Group size": "24",
"Preferred language": "es"
},
"submittedAt": "2026-10-28T09:15:00.000Z",
"id": "000000000000000000000001",
"formId": "000000000000000000000002"
}
}
Source: Data API: Working with webhooks.
In Zapier the Catch Hook trigger shows these fields, with the data entries as separate values, so a later step can
map Email to a mail action or Group size to a spreadsheet column. In Make the custom webhook module learns the
structure from the first request, after which the fields appear in later modules. The Fernbrook scenario then has three
steps: post a message to the garden’s team chat with the group size and language, append a row to a bookings sheet, and
send an acknowledgement in the language the visitor picked. The language comes from a hidden form field, set from the
locale of the page, so that the acknowledgement is Spanish for /es and German for /de.
Dashboard-created webhooks carry no signature headers, so they cannot be verified in the way described below. If a request must be trusted, create the webhook through the API with a site token or an app and verify it.
Verifying that a call came from Webflow
A catch-hook URL is a secret path and not an authentication. Anyone who learns it can post to it. For a webhook that creates records or sends messages, put a verifying step in front. Webflow signs the request with an HMAC-SHA256 of the timestamp, a colon and the raw body, using the webhook’s secret key, and expects receivers to reject requests older than five minutes. A small relay, which the automation platform then calls, is a short function.
// Node 22, a relay in front of Zapier or Make. WEBHOOK_SECRET is the secretKey returned when the webhook was created.
import crypto from 'node:crypto';
export function isFromWebflow(headers, rawBody, secret) {
const timestamp = headers['x-webflow-timestamp'];
const signature = headers['x-webflow-signature'];
if (!timestamp || !signature) return false;
const sent = Number(timestamp);
const sentMs = sent > 1e12 ? sent : sent * 1000; // Unix epoch time: accept seconds or milliseconds
if (!Number.isFinite(sentMs) || Math.abs(Date.now() - sentMs) > 5 * 60 * 1000) return false;
const expected = crypto
.createHmac('sha256', secret)
.update(timestamp + ':' + rawBody)
.digest('hex');
const a = Buffer.from(expected);
const b = Buffer.from(signature);
return a.length === b.length && crypto.timingSafeEqual(a, b);
}
Source: Data API: Working with webhooks. The comparison with
timingSafeEqual is a standard Node practice and not part of the Webflow page. The full receiver is built on
Webhooks.
If the call to the platform is made directly from Webflow, nothing can be verified and the secrecy of the URL is the only protection. For the garden, a harmless Slack message is acceptable on a secret URL, whereas a step that changes a booking should sit behind the relay.
HubSpot forms
HubSpot is a customer-relationship platform whose forms can live on a Webflow page. On 2026-10-28 Webflow’s Help Center describes the HubSpot App from the Marketplace as the main way to do it, and keeps a separate article for the legacy app. Check which version a site has before following either article. The app supports three approaches.
| Approach | Notes |
|---|---|
iframe embed |
The form is chosen in the app and managed entirely in HubSpot; later edits appear on the live site without a Webflow publish. The iframe itself cannot be styled from Webflow. |
Developer embed |
The form is rendered into the page so that Webflow can style it. It needs a HubSpot Marketing Professional or Enterprise plan, and a form edited in HubSpot must be refreshed in Webflow to synchronize. |
Native Webflow form mapped to HubSpot |
A script watches static forms, and as long as the field names match those of a HubSpot form, the submissions are mapped to HubSpot. |
One effect surprises site owners. A submission to an embedded HubSpot form goes to HubSpot and not through Webflow’s form
handler, so Webflow neither stores it nor counts it against the submission limit of the Site plan, and the notifications,
the Forms panel and the form_submission webhook of this page do not see it. A form that must reach both systems should
be a native Webflow form, mapped to HubSpot, with a webhook for everything else. The data-protection consequence is that
HubSpot becomes the processor of those submissions and its tracking code needs the same consent gate as Google’s. For the
native form, see Forms.
Replacing Logic flows
Logic was Webflow’s own workflow automation tool, with flows that reacted to form submissions, Ecommerce orders and CMS changes. Webflow’s Help Center states that as of 2025-06-27 it sunset Logic: the flows were disabled, and forms that had been connected to a flow became standard Webflow forms. Webflow’s recommendation was to rebuild the flows with Zapier or Make. The sunset of User Accounts followed on 2026-01-29; see Product Changes and Deprecations.
A flow is rebuilt in three steps: write down the trigger, the steps and the conditions of each old flow; choose a trigger in the new tool; and test with a Developer workspace site before pointing the tool at the production site.
| Old Logic concept | Replacement |
|---|---|
Form submission trigger |
The Zapier New Form Submission trigger, the Make Watch Events module, or a |
Ecommerce order trigger |
Zapier order triggers, or an |
CMS item changed |
A |
Conditions and branches |
Filters and paths in the automation tool |
Email, Slack or spreadsheet steps |
The same steps in the tool, or Webflow’s own form notifications for plain email |
Scheduled flow |
A schedule trigger in the tool, or a scheduled job in your own backend or Webflow Cloud |
Because Logic is gone, any tutorial or video that tells you to open the Logic panel is out of date, and a Dashboard article that mentions Logic describes a product that no longer runs. Treat flows that appear in a site’s history as inactive. A simple replacement for Fernbrook’s volunteer form is a webhook with a filter for that form, which sends the submission to the volunteer coordinator’s chat channel through an automation tool and leaves the file upload link inside Webflow, where access can be controlled.
Source: Webflow Help Center: Logic sunset.
Pitfalls
-
Two analytics tags at once. A GA4 ID in Site settings and a Tag Manager container that also holds a GA4 tag count each visit twice. Keep one.
-
A Universal Analytics ID in the field. The field takes GA4 measurement IDs only. A
UA-ID produces no data. -
The consent API covers Webflow, not Google. The three methods govern Webflow Analyze and Optimize. Gate every other script yourself.
-
wfis undefined without Analyze or Optimize. A consent script copied between sites fails on one that has neither. -
Embedded HubSpot forms skip Webflow. They are not stored in Webflow, do not trigger Webflow webhooks and do not use up the submission limit.
-
Forms change names. Renaming a form in the Designer breaks a Zapier trigger or Make filter that selected it by name.
-
Webhooks switch themselves off. After the retries fail, Webflow deactivates the webhook and sends an email. Monitor the email address, and recreate the webhook after an outage.
-
Dashboard webhooks cannot be verified. They carry no signature, so use API-created webhooks for anything sensitive.
-
Scripts replaced by apps. An app that applies scripts with a PUT can overwrite another app’s entry. Check the custom code after every install.
-
Re-authorization surprises. When an app adds a scope, its users must authorize again. Review the new list instead of clicking through.
-
Orphaned connections. A connection made by a former employee’s account stops working when the account is removed. Use shared accounts for tools and keep the register current.
-
Tutorials that predate the Logic sunset. They may tell you to build a flow in a panel that no longer exists.
Security and privacy
-
Scopes are the main control. Prefer a site-level authorization, read-only scopes and a dedicated token per purpose. A site token expires after 365 days of inactivity; an OAuth token lasts until it is revoked. See Data API Authentication and Scopes.
-
Keep secrets out of the page. Webhook secret keys, API tokens and client secrets belong in environment variables of a backend or in the vault of the automation platform, never in custom code, an embed or an attribute, because everything in the published page is public.
-
Know who processes the data. Google, HubSpot, Zapier, Make and Slack each receive some visitor data. List them in the garden’s privacy notice and sign data-processing agreements where the law requires them.
-
Minimize what is forwarded. A thank-you email needs the address and the language, not the whole submission. Remove personal data from automation histories after the retention period.
-
Gate before you load. Under European rules a tracking script that loads before consent is the usual cause of complaints. Load Google and HubSpot scripts from the consent callback, as in the example above.
-
Review quarterly. Open the connected apps of the Workspace and the site, compare them with the register and remove the ones that nobody can explain.
What the requester-provided book says
The book Webflow by Example predates the Apps Marketplace as it exists today, Webflow Analyze and Optimize, the Browser
API and the sunset of Logic, so none of those topics appear in it. The book treats third-party scripts as something that
the Designer cannot do at all, which was true of the free plans of 2021 and is wrong for any paid plan now, because custom
code is available there. For Google Analytics the book describes the Universal Analytics era, in which a UA- tracking ID
was pasted in the integration field; on 2026-10-28 the field takes GA4 measurement IDs only. It also does not discuss
consent at all. Where the book and the official documentation differ, this sub-section follows the official
documentation; see
Where Older Books and Tutorials Are Outdated.
Change history
| Date | Change |
|---|---|
2024-08-01 |
Marketplace apps built on version 1 of the Data API were de-listed |
2025-03-31 |
Version 1 of the Data API stopped being supported; only version 2 examples are shown on this page |
2025-04-14 |
Webhooks created with a site token after this date return a |
2025-06-27 |
Webflow Logic was sunset: flows disabled, connected forms became standard forms |
2026-01-29 |
User Accounts was sunset; |
2026-10-28 |
Date on which the facts of this page were checked against the official documentation |
For later changes, follow https://webflow.com/updates and the developer changelog, and see Product Changes and Deprecations.
Where to go next
-
Webhooks for a complete receiver with signature verification.
-
Forms for the form handler, spam protection and notifications.
-
Apps Overview and OAuth to build an app of your own.
-
Analyze and Optimize for the tracking that the consent API controls.
-
Custom Code: Head, Footer and Embeds for where scripts go.
-
Performance Optimization for the cost of third-party scripts.