← Form tracking demos Fixed — with the failure shown alongside

7 · Multi-step quiz funnel

Three steps, one page, no navigation between them. The contact step is built in JavaScript when the visitor reaches it — long after the Tag finished substituting placeholders. Build the hidden field there and it stays a placeholder. Put it in step one instead and the problem disappears.

What are you tracking?

Step 1 of 3 — the hidden Click ID field lives here

How much do you spend monthly?

Step 2 of 3

Where should we send the results?

Step 3 of 3 — this step is built now, not at page load

The fix: put the field where the Tag can still reach it. Step one exists in the markup at page load, so a hidden field there is substituted like any other. By the time the visitor reaches step three the value is already sitting in the form, and the final step reads it instead of asking for a substitution that will never come.
What still fails, shown above for comparison. The second field is created in JavaScript when step three renders, with its own --CLICK-ID-- default. The substitution pass has long finished, so it keeps the literal text. Steps one and two looked fine only because they carried no Click ID at all — the problem surfaces exactly at the step that matters.
Fire an event when the last step loads. A quiz funnel has no page loads between steps, so nothing marks progress on its own. Triggering an event as the contact step renders tells you how many people reached the point of being asked for their details — which is the number you need to know whether the drop-off is in the questions or in the ask.
function showFinalStep() {
  buildContactFields();

  AnyTrack(function () {
    AnyTrack('trigger', 'ViewContent');
  });
}
Why ViewContent and not a name of your own. It is one of AnyTrack's standard events, so it maps itself to each connected platform. A custom name — QuizStep3, say — is allowed (40 characters, no spaces) but then you have to create a matching custom conversion on Meta, Google and TikTok by hand before any of them can optimise toward it.
And the submit is a real one. The whole wizard is a single <form>, so the final button completes a genuine submit — the form event fires without any manual triggering. It POSTs, so the email never lands in a URL.