Skill Tracer
Skills › Marketing Skills › conversion-tracking › detect-webflow-forms.json

detect-webflow-forms.json

103 lines · skills/conversion-tracking/assets/gtm-recipes/detect/detect-webflow-forms.json at 88c79f6

1{
2 "exportFormatVersion": 2,
3 "exportTime": "2026-07-02 00:00:00",
4 "containerVersion": {
5 "path": "accounts/0/containers/0/versions/0",
6 "accountId": "0",
7 "containerId": "0",
8 "containerVersionId": "0",
9 "container": {
10 "path": "accounts/0/containers/0",
11 "accountId": "0",
12 "containerId": "0",
13 "name": "Conversion Detection - Webflow Forms",
14 "publicId": "GTM-XXXXXXX",
15 "usageContext": [
16 "WEB"
17 ],
18 "fingerprint": "0",
19 "tagManagerUrl": "https://tagmanager.google.com/#/container/accounts/0/containers/0/workspaces/0"
20 },
21 "tag": [
22 {
23 "accountId": "0",
24 "containerId": "0",
25 "tagId": "1",
26 "name": "Conversion Detection - Webflow Forms Submission Listener",
27 "type": "html",
28 "parameter": [
29 {
30 "type": "TEMPLATE",
31 "key": "html",
32 "value": "<script>\n(function () {\n if (window.__ctWebflowForms) return;\n window.__ctWebflowForms = true;\n window.dataLayer = window.dataLayer || [];\n var listeners = [], timeout = 30000;\n window.__ctWebflowSubscribe = function (listener) {\n if (listener && typeof listener === 'object') listeners.push(listener);\n };\n function isForm(form) {\n try { return !!(form && String(form.tagName || '').toLowerCase() === 'form' && form.closest && form.closest('.w-form')); }\n catch (e) { return false; }\n }\n function notify(phase, form, candidate) {\n var handled = false;\n for (var i=0;i<listeners.length;i++) {\n try { var fn=listeners[i] && listeners[i][phase]; if (typeof fn==='function' && fn(form,candidate)===true) handled=true; } catch(e) {}\n }\n return handled;\n }\n function visible(el) { try { return !!el && window.getComputedStyle(el).display !== 'none'; } catch(e) { return false; } }\n function emit(form) {\n var name=''; try { name=form.getAttribute('data-name') || form.id || ''; } catch(e) {}\n if (!notify('onCandidate', form, true)) window.dataLayer.push({event:'webflow_form_submitted',form_name:name});\n }\n function submit(event) {\n try {\n var form=event.target; if (!isForm(form)) return;\n notify('beforeAttempt', form, false);\n var wrap=form.closest('.w-form'), done=wrap.querySelector('.w-form-done'), fail=wrap.querySelector('.w-form-fail');\n if (!done) return;\n var old=form.__ctWebflowWatch;\n if (old) { notify('onOverlap', form, false); old.cancel(false); form.__ctWebflowWatch=null; }\n var staleFail=visible(fail), settled=false, observer=null, poll=null, kill=null, jq=window.jQuery;\n function stop(rejected) { if(settled)return; settled=true; if(observer)try{observer.disconnect();}catch(e){} if(jq)jq(document).off('ajaxComplete',check); if(poll)clearInterval(poll); if(kill)clearTimeout(kill); if(form.__ctWebflowWatch===state)form.__ctWebflowWatch=null; if(rejected)notify('onRejected',form,false); }\n var state={cancel:function(){stop(false);}};\n function check() {\n if(settled)return;\n // Webflow sets success only after its server accepts the form. A redirect\n // skips the success box, so check that state after its AJAX callback.\n var wf=jq && jq(form).data('.w-form');\n if(wf && wf.form && wf.form[0]===form && wf.redirect && wf.success===true){ stop(); emit(form); return; }\n if(visible(done)){ stop(); emit(form); return; }\n if(!visible(fail)){staleFail=false;return;}\n if(!staleFail)stop(true);\n }\n if(typeof MutationObserver==='function'){observer=new MutationObserver(check);observer.observe(wrap,{attributes:true,attributeFilter:['style','class'],subtree:true,childList:true});}\n if(jq)jq(document).on('ajaxComplete',check);\n poll=setInterval(check,300); kill=setTimeout(function(){stop(true);},timeout); form.__ctWebflowWatch=state;\n } catch(e) {}\n }\n if(typeof document!=='undefined'&&document.addEventListener)document.addEventListener('submit',submit,true);\n})();\n</script>"
33 },
34 {
35 "type": "BOOLEAN",
36 "key": "supportDocumentWrite",
37 "value": "false"
38 }
39 ],
40 "firingTriggerId": [
41 "2147479553"
42 ],
43 "tagFiringOption": "ONCE_PER_EVENT",
44 "monitoringMetadata": {
45 "type": "MAP"
46 },
47 "consentSettings": {
48 "consentStatus": "NOT_SET"
49 }
50 }
51 ],
52 "trigger": [
53 {
54 "accountId": "0",
55 "containerId": "0",
56 "triggerId": "2",
57 "name": "CE - Webflow Form Submitted",
58 "type": "CUSTOM_EVENT",
59 "customEventFilter": [
60 {
61 "type": "EQUALS",
62 "parameter": [
63 {
64 "type": "TEMPLATE",
65 "key": "arg0",
66 "value": "{{_event}}"
67 },
68 {
69 "type": "TEMPLATE",
70 "key": "arg1",
71 "value": "webflow_form_submitted"
72 }
73 ]
74 }
75 ],
76 "filter": []
77 }
78 ],
79 "variable": [
80 {
81 "accountId": "0",
82 "containerId": "0",
83 "variableId": "1",
84 "name": "DLV - Webflow Form Name",
85 "type": "v",
86 "parameter": [
87 {
88 "type": "TEMPLATE",
89 "key": "name",
90 "value": "form_name"
91 },
92 {
93 "type": "INTEGER",
94 "key": "dataLayerVersion",
95 "value": "2"
96 }
97 ]
98 }
99 ],
100 "fingerprint": "0",
101 "tagManagerUrl": "https://tagmanager.google.com/#/container/accounts/0/containers/0/workspaces/0"
102 }