Connecting Duda Forms to FunnelTrack with Zapier

Duda doesn't send form submissions to FunnelTrack directly, so we bridge them with Zapier: Duda triggers a Zap on every submission, and the Zap forwards it to a FunnelTrack custom webhook. To tie each submission back to the visitor's ad session, you add two hidden fields — ft_sid and ft_uid — that the FunnelTrack pixel fills in automatically.

What you'll need

  • •A Zapier premium plan — the Duda trigger and Webhooks by Zapier action both require a paid Zapier plan
  • •Site Admin access to your Duda site
Part 1

Prepare your Duda site

Deploy the FunnelTrack pixel, add the injector, and add two hidden fields so every submission carries the visitor's session.

1

Add the FunnelTrack pixel

In Duda, open Site → Settings → Head HTML (or your site-wide header) and paste the FunnelTrack pixel at the top of the <head>so it loads on every page. You'll find your pixel script in the Pixel section of FunnelTrack.

Duda site-wide Head HTML with the FunnelTrack pixel added
Duda → Site Settings → Head HTML — paste the FunnelTrack pixel at the top.
2

Add the ft_sid / ft_uid injector script

Add this injector to your site's body-end.html(Duda's site-wide end-of-body custom code) so it runs after the form loads. It reads the visitor's session and visitor IDs from the pixel and writes them into two hidden form fields (matched by label) right before submit — so the values ride along in every submission.

<script>
(function () {
  "use strict";
  var LABELS = { sid: "ft_sid", uid: "ft_uid" };
  function getIds() {
    var ft = window.ft || window.tracker;
    if (!ft) return { sid: "", uid: "" };
    return {
      sid: typeof ft.getSessionId === "function" ? ft.getSessionId() || "" : "",
      uid: typeof ft.getUserId === "function" ? ft.getUserId() || "" : "",
    };
  }
  function inputsForLabel(label) {
    var out = [], seen = [];
    function add(el) {
      if (!el || el.tagName !== "INPUT") return;
      if (seen.indexOf(el) !== -1) return;
      seen.push(el); out.push(el);
    }
    var lower = label.toLowerCase();
    var wrappers = document.querySelectorAll('.advanced-form-field[data-label], .advanced-form-field[label]');
    for (var i = 0; i < wrappers.length; i++) {
      var w = wrappers[i];
      var wl = (w.getAttribute("data-label") || w.getAttribute("label") || "").trim().toLowerCase();
      if (wl === lower) { var inp = w.querySelector("input"); if (inp) add(inp); }
    }
    var labelEls = document.querySelectorAll("label");
    for (var j = 0; j < labelEls.length; j++) {
      var le = labelEls[j];
      if ((le.textContent || "").trim().toLowerCase() !== lower) continue;
      var forId = le.getAttribute("for");
      if (forId) { var byFor = document.getElementById(forId); if (byFor) add(byFor); }
      var sib = le.parentNode ? le.parentNode.querySelector("input") : null;
      if (sib) add(sib);
    }
    var direct = document.querySelectorAll('input[name="' + label + '"], input#' + label);
    for (var k = 0; k < direct.length; k++) add(direct[k]);
    return out;
  }
  function setField(el, value) {
    if (!el || !value || el.value === value) return;
    el.value = value;
    try {
      el.dispatchEvent(new Event("input", { bubbles: true }));
      el.dispatchEvent(new Event("change", { bubbles: true }));
    } catch (e) {}
  }
  function fill(sid, uid) {
    var i, fields;
    if (sid) { fields = inputsForLabel(LABELS.sid); for (i = 0; i < fields.length; i++) setField(fields[i], sid); }
    if (uid) { fields = inputsForLabel(LABELS.uid); for (i = 0; i < fields.length; i++) setField(fields[i], uid); }
  }
  function run() {
    var v = getIds();
    fill(v.sid, v.uid);
    if (typeof MutationObserver !== "undefined") {
      var observer = new MutationObserver(function () {
        var cur = getIds(); if (cur.sid || cur.uid) fill(cur.sid, cur.uid);
      });
      observer.observe(document.body || document.documentElement, { childList: true, subtree: true });
    }
    var start = Date.now();
    (function poll() {
      var cur = getIds(); if (cur.sid || cur.uid) fill(cur.sid, cur.uid);
      if (Date.now() - start < 10000) setTimeout(poll, 200);
    })();
    document.addEventListener("submit", function () {
      var cur = getIds(); fill(cur.sid, cur.uid);
    }, true);
  }
  if (document.readyState === "loading") document.addEventListener("DOMContentLoaded", run);
  else run();
})();
</script>
Duda body-end.html with the ft_sid / ft_uid injector script added
Add the injector to your site-wide body-end.html.
3

Add two hidden fields to your form

In the Duda form editor, add two Short Text fields.

Duda form field type picker with Short Text highlighted
Add each field as a Short Text field.

Label them exactly as below — the injector matches by the field's label, since Duda's field names are auto-generated numbers:

First hidden field label
ft_sid
Second hidden field label
ft_uid
Duda form editor adding the ft_sid Short Text field, already populated with a session id
Field titled ft_sid — the injector fills it once the pixel loads.
Duda form editor adding the ft_uid Short Text field, populated with a visitor id
Field titled ft_uid — filled the same way.
4

Hide the two fields

Hide both fields so visitors don't see them. In the Duda editor, right-click each field and choose Hide From → All Screen Sizes. The values are still submitted — they're just not visible.

Duda right-click menu with Hide From → All Screen Sizes on the ft_sid and ft_uid fields
Right-click each field → Hide From → All Screen Sizes.
5

Submit a test form submission

On your published page, submit a real test entry so the hidden ft_sid / ft_uidfields carry live values. You'll pull this submission into Zapier in the next part.

Submitting a test entry on the live Duda form
Submit a live test entry so ft_sid / ft_uid carry real values.
Part 2

Create the FunnelTrack custom webhook

This is the endpoint Zapier will POST each submission to.

1

Create a Web custom webhook

In FunnelTrack, go to Integrations → Custom Webhooks and create a new webhook. Choose the Webaction source — Duda submissions happen on your website, and Web endpoints stitch to the visitor's pixel session via ft_sid.

FunnelTrack create custom webhook dialog with the Web action source selected
Create a Web custom webhook for your Duda form.
2

Copy the webhook URL

Copy the endpoint's URL — you'll paste it into Zapier in the next part. It contains the secret key, so keep it private.

FunnelTrack custom webhook detail showing the ingest URL to copy
Copy the custom webhook URL (it includes your secret key).
Part 3

Build the Zap

Trigger on a Duda submission, then POST it to your FunnelTrack webhook.

1

Trigger: Duda → New Form Submission

Create a new Zap and pick Duda as the trigger app with the New Form Submission event. Connect your Duda account and select the site.

Zapier Duda trigger with a website selected
Select the Duda site the form lives on.

Choose the form you want to track, then pull in a test submission (the one you submitted at the end of the last part). To track all Duda forms on your chosen site, leave the form selection blank.

Zapier Duda trigger with a specific form selected
Choose a form — or leave blank to track every form on the site — then pull in a test submission.
2

Action: Webhooks by Zapier → POST

Add an action step, choose Webhooks by Zapier, and select the POST event.

Zapier action step with Webhooks by Zapier POST selected
Webhooks by Zapier → POST.
3

Set the URL and payload type

Paste your FunnelTrack webhook URL into the URL field and set Payload Type to JSON.

Zapier POST action with Payload Type set to JSON
Payload Type: JSON.
Zapier POST action full settings with the URL, JSON payload type, and Data fields
The full POST action — URL, JSON payload type, and the Data fields.
4

Test the action

Run the Zap's test step to POST your test submission to FunnelTrack. A success response means FunnelTrack now has a sample payload to map.

Zapier test results showing a successful POST to FunnelTrack
A successful test POST — FunnelTrack now has a sample payload.
Part 4

Map fields & route in FunnelTrack

Turn the sample payload into mapped identity fields and route the event to your destinations.

1

Check for the sample data

Back on the custom webhook in FunnelTrack, confirm the test payload arrived. The payload-field picker now lists every field Zapier sent (with a sample value beside each).

FunnelTrack custom webhook showing the received sample payload
The sample payload from your Zap test, ready to map.
2

Map ft_sid to the Session ID

Map ft_sid to FunnelTrack Session ID— this is what stitches the submission to the visitor's pixel session and inherits its click IDs and attribution.

FunnelTrack mapping ft_sid to the FunnelTrack Session ID field
Map ft_sid → FunnelTrack Session ID (Required).
3

Leave the dedup key empty

Duda / Zapier fires one clean submission per entry, so you don't need a deduplication key — leave that field empty.

FunnelTrack custom webhook with the deduplication key field left empty
No dedup key needed for Duda submissions — leave it blank.
4

Map your User Data

Under User Data, map Full Name, email, and phonefrom the Duda payload. FunnelTrack splits Full Name into first + last automatically, and the picker shows each field's sample value so you can confirm you've matched the right one.

FunnelTrack User Data mapping Full Name, Email, and Phone from the Duda payload
User Data — map Full Name, Email, and Phone.
5

Configure routing & save

Choose which ad platforms should receive this event, set each destination's event name, and save your configuration.

FunnelTrack custom webhook routing to ad platform destinations
Route the event to your destinations and save.
Part 5

Activate

Turn the webhook and the Zap on so live submissions flow.

1

Activate the webhook

Set the FunnelTrack webhook to Active so it processes incoming events instead of just logging them.

Activating the FunnelTrack custom webhook
Click Activate on the custom webhook.
FunnelTrack custom webhook showing an Active status
The webhook is now Active.
2

Turn the Zap on

Publish / turn on your Zap in Zapier. Every new Duda submission now flows through Zapier into FunnelTrack and out to your destinations.

Zapier showing the Duda-to-FunnelTrack Zap turned on
Turn the Zap on — you're live.
3

Verify in your logs

Submit a live test entry, then open the Event Delivery Log in FunnelTrack. You should see an IN row for your webhook (received), plus an OUT row per destination showing the dispatched conversion marked delivered.

FunnelTrack Event Delivery Log showing an inbound Duda Lead Form row received and an outbound row to Google Ads delivered
Event Delivery Log — inbound received, outbound delivered per destination.

Need a hand? Back to Help.