Openli (formerly Legal Monster)
Connect Openli (formerly Legal Monster) with Webflow to hold back tagged tracking scripts until visitors consent and keep an audit trail of each consent.
A Webflow site ships with no consent banner, so analytics and ad scripts you add can set cookies on page load. The default Always track visitors setting in Webflow Analyze does not wait for consent either.
Pasting the Openli cookie widget snippet into Footer code puts Openli's consent banner on every page. Openli then scans the site for cookies, and the scripts you tag wait until a visitor accepts. By default, Openli stores the IP address and browser user agent with each consent as evidence. The same legal.js library also adds consent collection to forms and embeds your published policies.
Openli, formerly Legal Monster, now sits in the Cerivo group after Triple acquired Openli. Openli's pricing page lists Privacy Hub plans and no cookie consent plan, while its sign-up flow still opens with a cookie scan. Ask Openli which subscription includes the cookie widget before you build on it.
Agencies and developers who build Webflow sites for EU and Nordic clients get a banner that holds back tagged scripts until a visitor accepts. Marketing ops teams can gate pixels and collect newsletter consent they can later withdraw on request. Data protection officers (DPOs) may already keep vendor records and records of processing activities (RoPA) in Openli's Privacy Hub. A Privacy Badge or a synced sub-processor page puts that work on the Webflow site.
How to integrate Openli (formerly Legal Monster) with Webflow
No Openli or Legal Monster app exists in the Webflow Apps Marketplace, so the cookie widget snippet is the install path. Openli's current install guide says the snippet must go immediately before the closing body tag of your site's main template, and on Webflow that is Footer code. Openli also keeps a Webflow-specific guide under "Legacy integrations" and marks it as no longer actively tested, though it may still work. Its steps match the current guide, so treat it as a legacy reference rather than the main path. The snippet still loads legal.js from widgets.legalmonster.com, and Zapier still lists the app under the Legal Monster name.

Each part of the integration runs through a different route:
- Cookie widget snippet: The
legal.jssnippet in Footer code shows the banner and releases tagged scripts after consent, with no server of your own. - Code Embed widgets: The same library renders policy embeds, the Privacy Badge and the signup consent widget inside Webflow pages.
- Zapier: Zapier's Legal Monster app can save a consent from a Webflow form submission or withdraw email-marketing consent.
- APIs: The Webflow Data API and Openli's REST API handle consent webhooks, sub-processor sync and script deployment, and each of those patterns needs a server you host.
Most sites need only the snippet, and the other routes add to it. Custom code requires a Core, Growth, Agency or Freelancer Workspace, or an active Site plan. Openli requires you to remove any existing cookie blocker or banner before the first scan.
Paste the snippet in Footer code
The banner displays once the snippet is live and a cookie policy is published. After you add your domain, Openli scans it on a regular basis and assigns cookies it recognizes to a category, which you should still check. Visitors can then accept or reject analytics and marketing cookies separately.
- In the Openli dashboard, select the correct project (bottom left), then open Cookies > Manage Domains and add your domain.
- Wait for the scan, then review the results and categorize any unknown cookies by hand.
- Create a cookie policy under Agreements and click Publish now!, as Openli's quickstart describes.
- Open Widgets, select the cookie widget and copy the code.
- In Webflow, go to Site settings > Custom code > Footer code, paste the snippet and click Save changes.
- Click Publish. The pasted code initializes the banner with a call like
legal.widget({ type: "cookie", widgetPublicKey: "..." }). The loader also exposeswindow.legalfor the methods used in the next sub-sections. Custom code does not run in expand canvas view and is not live until you publish. Check the banner on the published URL rather than inside Webflow. Head code and Footer code each accept 50,000 characters.
Block scripts and embeds until consent
The banner alone does not stop cookies, because any script you leave untagged still runs on page load. Openli's quickstart states that "You must make changes to your HTML to enable blocking". Every analytics or marketing script needs a type change and a category attribute, in site-level and page-level custom code alike. Necessary cookies need no tag and stay enabled.
- Change the script's type and add a category, for example
<script type="text/plain" data-cookieconsent="analytics">, following the blocking cookies reference. Use"marketing"for ad pixels. - For YouTube or other iframes, wrap the embed markup in a
<script type="text/plain" data-cookieconsent="marketing">. That script writes the iframe into a.legalmonster-embed-containerdiv, as shown in the embedded media guide. - For code that needs to react to consent, register listeners before the
legal.widget(...)call. For example, usewindow.addEventListener("legalmonster.cookie.analytics.accepted", handler, { once: true }). The consent state API also exposeswindow.legal.getCookieConsentState(), which returns{ analytics: true|false, marketing: true|false }. Openli's consent events can fire more than once, so handlers that load a script should guard against double execution.
Webflow's own tracking features need separate handling:
- Webflow Analyze and Optimize: Set the tracking default to Don’t track by default, which waits for consent before tracking begins, per the compliance article. Webflow says that option needs a consent management solution.
- Webflow consent APIs: Webflow's consent management APIs apply only to Analyze and Optimize. Inside
wf.ready(), an Openlilegalmonster.cookie.analytics.acceptedlistener can callwf.allowUserTracking(), and the matchingrejectedevent can callwf.denyUserTracking(). Openli does not document this pairing. - Meta Pixel: With Delay for cookie consent on, Webflow's Meta Pixel guide releases the pixel when a script calls
fbq('consent', 'grant'). An Openlilegalmonster.cookie.marketing.acceptedlistener can make that call, though Openli does not document it. - Google Analytics: Openli holds back only scripts you tag, and the Measurement ID field in Site settings adds a Google tag you cannot edit. Webflow's Google Analytics guide says to add the GA4 tag in one place only, so we recommend leaving that field empty and adding the tag to Head code as a tagged script.
Webflow's consent tooling reaches only its own features, so every third-party script depends on the Openli tags you add.
Embed policies and the Privacy Badge with Code Embed
Openli can render your published cookie policy or another agreement inside a Webflow page. A Privacy Badge links to an agreement you pick in Openli, typically your privacy policy. Both go into a Code Embed element on the relevant page, and both must run after the cookie widget snippet has loaded.
- In Webflow, open the Add panel, drag a Code Embed onto the page and add a container such as
<div id="cookie-policy-container"></div>or<div id="privacy-badge"></div>. - For a policy, add a script calling
legal.document("#cookie-policy-container", "policy-public-key");with the agreement's public key, per the embed policies guide. - For a badge, call
legal.widgetwithtype: "privacy-badge-v1", theagreementPublicKeyandtargetElementSelector: "#privacy-badge", per the Privacy Badge install guide. - Save the embed, then click Publish. A Code Embed sits in the page body, so it can run before the Footer code snippet. Wrap the
legal.document(...)or badge call inwindow.addEventListener("load", ...)so it runs after the snippet. Script tags inside a Code Embed show a placeholder on the canvas; check them on the published site. Each embed accepts up to 50,000 characters. If a page should carry the legal text without showing the banner, follow Openli's guide to embedding agreements without a widget. It loads a dummy widget withlegal.load(...)beforelegal.document(...). Every Openli agreement, DPAs included, has its own Public Key, and the embed shows the latest published version.
Add the signup consent widget to Webflow forms
Forms collect names and emails. Openli's signup widget adds consent to an existing form and records it against the visitor's email. For email-marketing consent, Openli's Universal Consent guide says that feature requires an Openli Website Compliance subscription.
- Give the Webflow form, its email input and its name input stable IDs or classes. The
targetElementSelectormust match exactly one element. - Call
legal.widget({ type: "signup", widgetPublicKey, targetElementSelector, nameInputSelector, emailInputSelector }), per the signup consent reference. The target element must sit inside the form. Place the call in page-level custom code (Pages panel > Page settings > Custom code > Before</body>tag) or in a Code Embed below the form, and wrap it inwindow.addEventListener("load", ...)so the Footer code snippet has run first. - Set
submitButtonSelectorsto restrict which submit buttons Openli watches; by default it watches all of them. - Click Publish and submit a test entry, then confirm the consent appears in the Openli dashboard. Openli's reference says to check on your server that the input named
openli-consenthas the valueon, unless you renamed it withvalidationFieldName. That field should appear in thedataobject of the form submission payload. Confirm this with a test submission before a webhook handler relies on it. The Universal Consent guide also lets you set a form's audience to business users or consumers. It documents a dashboard webhook foremail_marketing_consent_created, which the webhooks section below returns to.
Connect Webflow forms to Openli with Zapier
Zapier still lists Openli under its old name, and its Legal Monster and Webflow pairing page shows two Legal Monster actions. Save Consent to a Document records a consent without the on-page signup widget. It requires a Document and a User Identifier, and its optional fields cover the user's email and name, consent method, consent text, user agent, IP address, language, page URL and form button text. Withdraw Consent to E-Mail Marketing handles opt-outs.
Build one Zap from the Webflow New Form Submission trigger to Save Consent to a Document for signups. Build a second from an unsubscribe form to Withdraw Consent to E-Mail Marketing. Openli's Universal Consent guide takes the other direction, catching Openli's dashboard webhook with Webhooks by Zapier, and it lists a Zapier premium account as a requirement.
Build with the Webflow and Openli APIs
The API route suits teams that need consent events in their own backend, or Openli's vendor data published on the Webflow site automatically. Openli's REST API v1 lives at https://app.openli.com/api/v1/ over HTTPS and authenticates with an x-api-key header, while some public endpoints use project_public_key instead. Every pattern below needs a server or serverless function you host, and four references cover the work:
- Openli REST API: The Openli API reference documents consent withdrawal, services, personal data, sub-processors and webhooks.
- Webflow Data API: Webflow's Data API reads and writes CMS collections and lists form submissions.
- Webflow webhooks: A
form_submissionwebhook sends each Webflow form entry to your server as it arrives. - Webflow MCP server: An AI agent connected to the Webflow MCP server can manage a site's custom code and registered scripts as well as its CMS items, per the MCP overview.
The three builds below combine these pieces.
Validate Webflow form consent with webhooks
- A
form_submissionwebhook delivers every Webflow form entry to your server. There you can check the Openli consent field and act on it. Openli's own webhooks then notify you when consent is created or withdrawn, so both directions reach the same handler. Register the Webflow webhook withPOST https://api.webflow.com/v2/sites/{site_id}/webhooksand the body{"triggerType": "form_submission", "url": "..."}. It needs thesites:writescope, per the create webhook reference. An optionalfilter.namerestricts it to one form. - In your handler, verify the
x-webflow-timestampandx-webflow-signatureheaders. The signature is a SHA-256 HMAC overtimestamp:body, keyed with your site token secret or OAuth client secret. Treat requests older than 5 minutes as possible replays, per working with webhooks. - Read
name,formId,formElementId,submittedAtand thedataobject from the form submission event payload. Confirm the Openli consent input is present before writing the contact to your CRM. - Register Openli's side with
POST /api/v1/webhooks. Passtarget_urland a comma-separatedeventsvalue ofconsent_created,consent_withdrawn, per the Openli webhooks reference.GET /api/v1/webhookslists them andDELETE /api/v1/webhooks/:public_keyremoves one. - Handle unsubscribes with
POST /api/v1/consents/withdraw_all_email_marketing_consent?email=.... A 200 response means no user was found, and a 204 means consent was withdrawn, per the consents reference. The Universal Consent guide's dashboard webhook uses the eventemail_marketing_consent_created, while the API reference listsconsent_createdandconsent_withdrawnfor webhooks registered through the API. Neither page publishes a payload schema or signing header, so inspect a live delivery before you parse it. Webflow webhook deliveries that fail retry up to 3 more times at 10-minute intervals. Webflow then marks the delivery as failed. For backfills or missed deliveries, useGET /v2/sites/{site_id}/form_submissions. It filters byelementIdand pages withoffsetand alimitof up to 100.
Sync sub-processor lists to a Webflow CMS collection
- Openli's Privacy Hub holds the vendor and sub-processor records your DPA promises to disclose. The Services API exposes them as JSON. A scheduled job can mirror that data into a Webflow CMS collection. Your privacy page then lists current sub-processors without anyone editing HTML. Openli's webhooks fire only on
consent_createdandconsent_withdrawn, so the job runs on a timer or on demand. CallGET https://app.openli.com/api/v1/serviceswith yourx-api-keyto receive each service'snameandpublic_key, per the services reference. - For each service, call
GET /api/v1/services/:service_public_key/subprocessors. The sub-processors reference returnssubprocessor_name,subprocessor_description,vendor_name,vendor_addressandusage_description. It also returns adata_processing_locations[]array withcountry_nameandcountry_code. The personal data endpoint addscategory,purposeandnature_of_processingif the page should show them. - Fetch existing items with
GET /v2/collections/{collection_id}/itemsand diff them against the Openli response. - Create new items with
POST /v2/collections/{collection_id}/items, wherefieldDatarequires at leastnameandslug, per the create item reference. Mapsubprocessor_nametonameand derive the slug yourself; no documented field mapping exists. - Update changed items with
PATCH /v2/collections/{collection_id}/items. Then publish them withPOST /v2/collections/{collection_id}/items/publishand anitemIdsarray, per the publish item reference. - Render the collection on the privacy page with a Collection List showing vendor, purpose and processing location. The
/items/livevariants create or update published items directly. They skip the separate publish call when the page should update immediately. For sites with multiple locales, passcmsLocaleIdon each item to target a locale.
Deploy the widget script with the custom code API
Agencies that run many Webflow sites can apply the Openli snippet to each site by script instead of pasting it by hand. Openli does not document this route. The custom code endpoints accept only OAuth tokens from a Webflow App, not site or Workspace tokens, per Webflow's custom code guide.
- Register the snippet's JavaScript, without its
<script>tags, as one inline script withPOST /v2/sites/{site_id}/registered_scripts/inline. The body takessourceCode, aversionand adisplayName, and the register inline reference caps inline scripts at 2,000 characters. Openli's snippet, loader andlegal.widget(...)call together, fits under that cap. Registeringlegal.jsitself as a hosted script is a weaker option: the hosted script reference requires anintegrityHash, and a fixed hash stops the file loading whenever Openli changeswidgets.legalmonster.com/v1/legal.js. - Apply it with
PUT /v2/sites/{site_id}/custom_code, per the upsert custom code reference. Pass the scriptidin thescripts[]array with alocationoffooter, itsversionand anyattributes. The call replaces the site's applied scripts, so include every script the site should keep. - Publish with
POST /v2/sites/{site_id}/publish, which accepts an optionalpageId, per the publish reference. API-applied code only takes effect after the publish. TheGET /v2/sites/{site_id}/custom_code/blocksendpoint lists what is currently applied. Use it to audit which client sites already carry the Openli snippet.
What you can build with the Openli Webflow integration
These builds combine the snippet, the Code Embed widgets and the APIs on a real Webflow site.
- Consent-gated analytics and pixels: Tag every GA4 and Meta Pixel script on a marketing site with
type="text/plain"and adata-cookieconsentcategory. Set Analyze to Don’t track by default. Write the YouTube hero video iframe only after a marketing accept. - Newsletter signup with provable consent: Add the Openli signup widget to a footer form. After a test submission confirms that the Openli consent input appears in the
form_submissionpayload, check it before adding the contact to your email tool. Wirewithdraw_all_email_marketing_consentto an unsubscribe form. - Self-updating sub-processor page: Feed a
/legal/sub-processorsCollection List with a scheduled job usingGET /api/v1/services/:service_public_key/subprocessors, so the public list matches the DPA. - Embedded legal center with a Privacy Badge: Render the cookie and privacy policies on a
/legalpage with Code Embed elements andlegal.document(...). Add aprivacy-badge-v1widget that links to your privacy policy. Publish a new version of an embedded policy in Openli, and the page shows it on the next load.
Read our guide to the Webflow CMS API before you build the sub-processor sync.
Frequently asked questions
Yes. Webflow's custom code settings and the Code Embed element both need a Core, Growth, Agency or Freelancer Workspace, or a site with an active Site plan. Openli's legacy Webflow guide says the same thing in its own words: "you must have paid plan on Webflow". Without a paid Workspace or Site plan, the snippet has nowhere to go.
Use Footer code. Openli's cookie consent guide says the snippet goes immediately before the closing
bodytag, which is where Webflow renders Footer code. Thelegal.jsreference prefers the loader as the first script in the head. If you move it to Head code, calllegal.widget(...)only after the DOM is ready, as the cookie consent guide requires. For Openli's legacy Google Consent Mode setup, put only its data layer snippet in Head code, so it runs before Google Analytics and Openli load. The Openli snippet itself can stay in Footer code.No. Openli states it "has no current plans to add support for Google's Consent Mode v2 at any point" and recommends an alternative solution if you need v2, per its Google Consent Mode page. Openli files that page under legacy integrations and no longer actively tests it, and the setup works only with GA4. It sets
ad_storageandanalytics_storageto "denied" with await_for_updateof 5000 ms. Google's consent mode overview also definesad_user_dataandad_personalization, and Openli's guide sets neither. Openli also does not support IAB TCF v2.0. Sites that need Consent Mode v2 can look for a consent tool that supports it among Webflow's compliance apps.Create one Openli project per language, each with its own cookie policy and widget
locale. Then add each localized domain or path under Manage cookie domains. Openli's multi-language projects guide giveshttps://example.com/en/andhttps://da.example.com/as examples, and says the projects feature belongs to Cookie Business subscriptions. In Webflow, you can localize a page's head and body custom code, so each locale can run its own Openli widget. Secondary locales inherit the primary locale's code until you edit them, per localize page settings. Supportedlocalevalues includeen-us,da-dk,nl-nl,de-de,no-no,nb-no,sv-se,es-es,fr-fr,fi-fi,lt-ltandpl-pl. English is the fallback when a language is not supported in the visitor's jurisdiction, per the widget language guide.Yes, though Openli documents no webflow.io-specific procedure. Webflow lets you publish to the
yoursite.webflow.iostaging subdomain without pushing those changes to your custom domain, per the publishing overview. Openli scans the domains you add, so add the webflow.io address under Cookies > Manage Domains. Then publish to staging and check the banner, the blocked scripts and the consent entries in the dashboard before you publish to the custom domain.
Description
Openli (formerly Legal Monster) adds a cookie consent banner and consent logging to a Webflow site through custom code, and holds back the scripts you tag until a visitor accepts. Its REST API can also feed sub-processor lists into a Webflow CMS collection.
This integration page is provided for informational and convenience purposes only.

EasyCookie
Connect EasyCookie with Webflow to add GDPR-compliant cookie consent and Google Consent Mode v2 to your site.
Cookiebot
Use Cookiebot with Webflow to collect visitor consent, control when cookies load, and support compliance with GDPR, CCPA, and similar privacy regulations on your published site.

CookieScript
Connect Cookie-Script with Webflow to display consent banners, block cookies until consent is given, and maintain GDPR and CCPA compliance records.
Osano Cookie Consent
Connect Osano Cookie Consent, a consent management platform, with Webflow to enforce cookie compliance, block non-essential scripts before consent, and display geo-targeted banners across 50+ countries.
Securiti Cookie Consent
Connect Securiti Cookie Consent, a consent management platform, with Webflow to display geo-targeted cookie banners, block tracking scripts before consent, and maintain GDPR, CCPA, and IAB TCF v2.0 compliance.


