Help for event organizers

Search all guides

What do you need help with?

Find a task, setting or problem. Search covers the full content of every guide.

    Guides for event organizers

    How to configure form measurement

    On this page

    Administration: changes to an existing event.

    See where visitors come from and where they complete an order. First choose whether your website or the organizer's container owns measurement. Checkout works without optional consent.

    Choose where measurement runs

    Website mode sends embedded form events to your website's dataLayer. Your website owns GA4, Google Ads, Meta and consent. Use the website's existing measurement destinations to connect its visit with checkout. Saved embeds keep their selected measurement destination. Choose website dataLayer measurement in the embed generator before copying the code.

    Unit mode runs the organizer's configured GTM container or scripts inside an isolated measurement frame. It uses the form's consent notice or explicitly enabled website consent transfer. Standalone forms use this mode. Browsers separate the frame's storage from your website: matching G-IDs do not guarantee a shared visit or campaign source. Festapp does not copy GA, Ads or Meta cookies or extend their lifetime.

    For the most accurate measurement, we recommend embedding the form directly on your website in website mode. Measurement then runs in your website's GTM and your banner controls consent, so the visit source and conversions match the rest of your website measurement. A standalone form link uses the form's own consent notice. Taking over consent from your website banner is supported for selected banners (currently Complianz, CookieConsent v3 by orestbida and Cookiebot). We try to keep this support up to date, but after your website banner changes or updates it may take some time before the takeover works again. Meanwhile the form asks the visitor itself.

    Enable measurement for the organizer and form

    1. Open the organizer's settings and Measurement. Enable measurement for the organizer, enter the Google Tag Manager container ID such as GTM-XXXX, and a full HTTPS Privacy policy URL. Enter the container ID rather than installation code.Open organizer events
    2. Choose the cookie notice layout and optional custom title/text. Default wording follows the visitor's language; custom wording is shared across languages. Configure Custom scripts (advanced) with your measurement administrator and appropriate consent gates.
    3. If platform approval is missing, select Request measurement approval. A pending platform confirmation means the request was sent, not that measurement is active. Contact support if the request cannot be sent.
    4. In Measurement, enter My websites: up to 10 exact HTTPS origins, one per line, including any www, without a path or trailing slash. Save settings and select Request measurement approval. Each website shows Approved or Pending platform confirmation. After adding another website, submit a new request even if measurement is already approved. Saving a website does not approve it. Do not request approval for websites you do not operate.
    5. Open the saved form, enable its Allow measurement setting and save. Enable each form separately. Its status explains disabled measurement, missing destination/privacy policy, platform restrictions or an unverified runtime.Open forms in the app

    In website mode, establish denied defaults before tags and let your CMP update consent after a saved choice. Tags without native Consent Mode support, including Meta Pixel, Clarity and custom HTML, need explicit consent checks in your tag manager. Loading GTM or receiving an event does not itself authorize cookies or advertising data sharing.

    For Unit mode, Take over consent from the banner of approved websites confirms that you operate the approved websites and that their notice covers the form, purposes, recipients, organizer measurement on *.pages.dev and Festapp as processor. Visitors must be able to withdraw consent. Without an explicitly connected source, an embedded form can read Google Consent Mode established by a CMP such as Complianz, Cookiebot or CookieYes. Marketing requires all three advertising permissions; the automatic bridge denies marketing when TCF is present.

    A standalone link requires a saved CMP choice covering the same scope. Your website administrator can configure the standard Complianz adapter once through the data-festapp-consent attribute on the embed.js script: organization, Unit, the form metadata's consentRevision and the corresponding CMP policyId. That notice must cover purchasing in the form. The adapter transfers acceptance and refusal, checking saved categories and the current policy version. Unknown, outdated or unsupported configurations such as forced statistics keep the form notice. Google Consent Mode alone does not establish a saved choice. Other CMPs can use FestappEmbed.connectMeasurementSource. Changed processing scope requires a new choice and updated version mapping; a runtime-only deploy does not change consent scope. After connecting the source, a link can use:

    Standard adapters support Complianz, CookieConsent v3 by orestbida, and Cookiebot. For Complianz, an example is:

    <script defer src="https://tickets.festapp.net/embed.js"
     data-festapp-consent='{"provider":"complianz","organization":1,"unit":2,"consentRevision":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","policyId":"42"}'></script>

    For CookieConsent v3, use the configuration below. Replace IDs and revisions with actual values. The positive integer revision must match the banner's current and saved policy revision and the archived mapping to the form metadata's consentRevision. The notice must cover the form. Changed coverage requires a new choice and updated revisions.

    <script defer src="https://tickets.festapp.net/embed.js"
     data-festapp-consent='{"provider":"cookieconsent","organization":1,"unit":2,"consentRevision":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","revision":42,"categories":{"analytics":"analytics","marketing":"marketing"}}'></script>

    When using npm, expose the API: import * as CookieConsent from 'vanilla-cookieconsent'; window.CookieConsent = CookieConsent;. Use opt-in mode. Optional categories maps both distinct website category names, defaulting to analytics/marketing. Preselected, mandatory or per-service mapped categories, zero or mismatched revisions, expiry and broken APIs keep the form notice. TCF keeps marketing denied. Other-tab changes are checked every second; reload the website if storage and instance state disagree. GCM alone cannot replace a saved choice.

    For Cookiebot, the ordinary loader from the Cookiebot Manager in opt-in mode is enough. Its data-cbid must match the configuration below. Both automatic (auto) and manual (none) blocking are supported. Known GDPR applicability without CCPA is required. Replace all example IDs, origin and revisions:

    <script id="Cookiebot" src="https://consent.cookiebot.com/uc.js"
     data-cbid="12345678-1234-1234-1234-123456789abc" data-blockingmode="auto"></script>
    <script defer src="https://tickets.festapp.net/embed.js" data-cookieconsent="ignore"
     data-festapp-consent='{"provider":"cookiebot","organization":1,"unit":2,"consentRevision":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","cbid":"12345678-1234-1234-1234-123456789abc","origin":"https://organizer.example","consentValidFrom":"2026-11-11T00:00:00.000Z","maxAgeSeconds":15552000}'></script>

    Cookiebot's SDK has no comparable policy revision. Required consentValidFrom is the effective instant of the archived notice (UTC ISO with milliseconds and Z); earlier choices cannot transfer. Set required maxAgeSeconds no higher than the Cookiebot lifetime and at most 365 days; the example uses 180 days. origin must exactly match your website's HTTPS origin. When coverage changes, renew Cookiebot consents and update the cutoff and form metadata's consentRevision. CBID and consent IDs are not policy revisions; the administrator verifies form coverage. Implied/opt-out, expiry, changed CBID/domain and unknown state keep the form notice without GCM fallback. Statistics maps to analytics and marketing to marketing; TCF keeps marketing denied. A choice in another tab ends the transfer; the form then asks locally. Keep the helper and loader in the DOM.

    <script defer src="https://tickets.festapp.net/embed.js"></script>
    <a data-festapp-consent-link target="_blank"
       href="https://tickets.festapp.net/form/YOUR-FORM">Buy tickets</a>

    Transfer requires an ordinary new-tab click from an approved website. Missing referrers, noopener/noreferrer, incompatible window-isolation policy and other opening methods fall back to the local notice. Imported choices stay only in this visit for at most 24 hours. Withdrawal on the website is synchronized; closing the website, source disconnection or expiry of the short renewable connection revokes the import. Reloads require a fresh transfer. An explicit choice saved in the form takes precedence, lasts 180 days and can be changed through the floating Consent settings button.

    Configure GTM tags

    Download the paused website GTM preset. In a new workspace, use Merge and Rename conflicting tags, triggers and variables. All 18 tags in the Festapp folder are paused. Fill the GA4 ID, GAds ID, both GAds conversion labels and FB Pixel ID constants. Keep the website's Google tag and Conversion Linker. The official Meta template loads and initializes the pixel itself; verify its integration with the existing pixel and no duplicate views or conversions. This preset belongs in the website container, not the isolated Unit container.

    Each trigger requires form_embedded = true and a specific form event. GA4 separates ecommerce and generic events to avoid inheriting a previous website event's ecommerce state. Keep form_page_view distinct from the native website page_view. Remove overlapping conversion tags before enabling these.

    EventsMeaning and data
    form_page_view, page_viewEmbedded form view in either destination, or a standalone form view respectively. Public context includes page type and language.
    form_start, form_submit_errorStarting the form or a submission error, without field contents or visitor error messages.
    view_item, add_to_cart, remove_from_cartPublic items, quantity, prices and currency in ecommerce.
    begin_checkout, add_payment_infoCheckout progress and payment method selection, not payment confirmation.
    purchaseA completed order with value, currency and unique transaction_id. It does not itself confirm money received.
    generate_leadFree registration, waiting list or sale-opening interest, with lead_source, event_id, currency and zero value. It is not a purchase.

    user_data contains only bounded email and phone values available on conversions. The native User-Provided Data variable is used by GA4 purchase/lead tags and both Google Ads conversion tags. First configure the required GA4/Ads data capabilities and account policies; importing the preset changes neither. Meta Purchase and Lead use Advanced Matching. Google receives E.164 phone numbers; Meta receives digits including the country code, without the leading +. Automatic DOM contact detection is disabled. Clearing the current dataLayer state erases neither its history nor Meta's matching state. In the Unit runtime, festapp_consent is technical state, not evidence of a saved CMP choice.

    The preset uses advanced Google Consent Mode: Google tags have No additional consent required and rely on built-in checks and the website CMP's state. The website must establish consent before tags; the preset grants no consent. Meta additionally requires ad_storage, which your CMP must map to Meta tracking and any customer matching, including withdrawal. Meta-enabled Conversions API is explicitly disabled. The Ads registration action counts completed free registrations only; waitlist and sale-opening interest remain other leads. A descriptive published-version name is Added Festapp form tracking for GA4, Google Ads and Meta.

    What your notice and privacy policy should describe

    Describe the organizer as controller, Festapp as processor, measurement and advertising purposes, the actual services/recipients, and any sharing of order email/phone with advertising systems. Include the isolated *.pages.dev measurement domain when using Unit mode. Specify retention and further transfers according to your actual service configuration. For transferred consent, explicitly cover form purchases, purposes, validity and withdrawal both on the website and in the form. Retain the relevant notice wording and saved decision revision; changing the wording does not update an old consent record.

    Verify and troubleshoot

    • No measurement: check organization, organizer and form enablement, platform approval, destination, HTTPS privacy policy and exact approved website. In website mode, check the helper script and dataLayer events.
    • Consent stays denied: check the saved CMP record, every advertising permission and the transfer switch. For links, also check the configured adapter, saved choice and matching CMP policy/form scope. Do not bypass a refusal with granted defaults.
    • Your own website appears as a referral: use website mode for embeds and the native website's destinations. Normal GA4 cross-domain settings and _gl apply to supported navigation between those domains; they do not bypass frame storage isolation. Cookie copying and automatic identity transfer into the Unit runtime are unsupported.
    • Before publishing: use GTM Preview / Tag Assistant to check denied, granted and withdrawn consent, one approved test order, value, currency and order ID. Preview has limitations inside the isolated Unit frame. A successful import proves neither conversion delivery nor campaign attribution: verify both in your actual destination account. Unpause reviewed tags only after those checks.

    Continue with website embedding or form settings.