Every GTM tag has a Firing Options setting that controls how many times the tag fires when its trigger conditions are met. The default is "Unlimited" — meaning the tag fires every single time the trigger condition is satisfied, no matter how many times per page load or session. For most tags, this is correct. A scroll depth trigger can fire at 25%, 50%, 75%, and 90% and you want the tag to follow each one. But for conversion tags — Google Ads conversion tracking, Meta Pixel Purchase, GA4 purchase event — Unlimited is a disaster: a purchase confirmation page that reloads for any reason will double-count conversions. Understanding the three firing options is the difference between reliable data and inflated metrics.
This distinction matters more than most GTM settings because the consequences are invisible. Your tags keep firing, your reports keep populating, and nothing looks broken — until you notice revenue in GA4 is 15% higher than your payment processor and start wondering what happened. This guide explains how each firing option works, when each is appropriate, and includes practical recommendations for every tag type on a typical ecommerce or lead-gen stack.
The Three Firing Options
Once per Event
The tag fires each time the trigger condition is satisfied. If a trigger fires 5 times during a page session, the tag fires 5 times. This is the semantically correct behavior for any event where each individual occurrence matters — every scroll milestone, every video progress checkpoint, every link click. "Once per event" and "Unlimited" are described identically in most GTM documentation, but they carry different intent: "Once per event" emphasizes that the firing is tied to the event occurrence, while "Unlimited" implies there is no cap. In current GTM both behave the same way.
Use Once per Event for: GA4 scroll tracking, video progress events (10%, 25%, 50%, 75%, 90%), link click events, form interaction events, and any tag where you want one tag fire per trigger occurrence.
Wrong for: purchase confirmations, lead form submission thank-you pages, checkout completion events — anywhere that an accidental page reload should not re-fire the tag.
Once per Page
The tag fires at most once per page load, regardless of how many times the trigger is satisfied. If the same trigger fires 10 times during a single page session, the tag fires exactly once. GTM tracks this internally per pageview — navigate to a new page and the counter resets, so the tag can fire again on the next page.
This is useful when a trigger can legitimately fire multiple times on a single page but you only care about the first occurrence. The classic example: a scroll trigger configured to fire at 25%, 50%, 75%, and 90%. If you only want to record "user scrolled" (not which percentage threshold they crossed), set your tag to Once per Page. It will fire when the first threshold is crossed and ignore the subsequent ones.
Use Once per Page for: purchase and lead conversion tags on confirmation pages, scroll-to-bottom engagement tags, "user saw this section" visibility events where you want one signal per page load regardless of how many times the element enters the viewport.
Unlimited
No cap. The tag fires every single time the trigger fires, for the entire duration of the page session. This is the GTM default for most tag templates, including GA4 Event tags. For the vast majority of tags it is the right choice — you want a pageview tag to fire on every pageview, a click tag to fire on every qualifying click.
The risk surfaces specifically on confirmation pages. A Page View trigger on /order-complete fires once normally. But payment processors sometimes redirect back to the confirmation page after processing. Browser history navigation (back then forward) re-fires page triggers. Some single-page apps re-render the confirmation component and push a new history entry without a full navigation. Any of these cause the Unlimited tag to fire again.
The Firing Limit Setting
In addition to the three radio options above, GTM's Advanced Settings section contains a separate "Firing Limit" field. This is a number plus a per-period dropdown with three choices: per event, per page, and per session. The three radio options are a convenient shorthand — the Firing Limit field is the more granular underlying control.
Setting Firing Limit = 1, per session is the most useful configuration that the radio options cannot express on their own. It ensures a tag fires at most once per user session, regardless of how many pages they visit. This is the correct setting for remarketing pixel fires (one "site visitor" signal per session is plenty for audience building) and newsletter sign-up confirmation tracking (if your confirmation UI renders across multiple steps or pages).
The Firing Limit and the radio options interact: the radio option sets the primary mode, and the Firing Limit further restricts it. If you set "Unlimited" in the radio options but Firing Limit = 1 per session, the tag behaves like "once per session" — the Firing Limit wins. You can use the Firing Limit to implement caps the radio options don't cover, like "fire at most 3 times per session" for a re-engagement prompt.
The Conversion Double-Counting Problem
This is the most common real-world consequence of wrong firing options. The scenario: a purchase confirmation page (/order-complete) has a GA4 purchase event tag with trigger set to "Page View — URL contains /order-complete". The firing option is the default: Unlimited. The user lands on the confirmation page, the tag fires, the purchase is recorded. Then the user refreshes — maybe to check their order details, maybe because the page felt slow. The trigger fires again. The tag fires again. GA4 records a second purchase.
GA4's built-in deduplication on transaction_id should prevent the second event from being counted as a separate conversion — but this only works reliably when the same transaction_id is sent within a 1-hour window, and it specifically applies to GA4's key event reports. Google Ads conversion imports and GA4-linked attribution don't always apply the same deduplication logic. The BigQuery raw event export receives both events as separate rows regardless of deduplication — so any analysis built on raw event data will see inflated purchase counts. And if your transaction_id generation has any bug that produces non-unique IDs, deduplication fails silently across the board.
Two fixes, in order of preference:
Fix 1 — Set the tag to Once per Page. Open the tag in GTM, expand Advanced Settings, change Firing Options from Unlimited to Once per Page. This is the cleanest solution: GTM enforces the constraint before the tag fires, and it requires no code change on your site. A page reload still constitutes the same "page" in GTM's session model, so this correctly prevents re-fires on refresh.
Fix 2 — Use a JavaScript guard variable. If you cannot redeploy GTM immediately, add a Custom HTML tag that fires before your conversion tag (via Tag Sequencing) and sets window._conversionFired = true. Add a trigger condition to your conversion tag that checks this variable equals false. This approach is fragile — it doesn't survive a hard refresh — but it stops duplicate fires from same-page trigger re-evaluations in SPAs.
Practical Recommendations by Tag Type
Here is the correct firing option for every common tag type on a typical ecommerce or lead-gen stack:
GA4 Configuration tag: Unlimited. This is the base tag that establishes the GA4 session. It should fire with every container load.
GA4 Event tag — page_view, scroll, click, video: Unlimited / Once per Event. These events are meaningful every time they occur. A user scrolling to 90% three times is three data points worth capturing if you're using scroll depth as an engagement signal.
GA4 purchase / lead_generated conversion event: Once per Page, combined with a correct transaction_id or form_id parameter for server-side deduplication as a second line of defense.
Google Ads Conversion Tracking: Once per Page. Google Ads also has its own conversion deduplication on the order_id parameter, but don't rely on it as your primary control. Set it at the tag level.
Meta Pixel PageView: Unlimited. You want a PageView signal for every page navigation.
Meta Pixel Purchase / Lead: Once per Page. Meta's deduplication via event_id is available but only applies when you're also using the Conversions API. At the browser-pixel level, Once per Page is your safeguard.
TikTok Pixel conversion events: Once per Page for any purchase or lead event. TikTok deduplication requires matching event_id values between pixel and Events API — don't assume it covers all double-fire scenarios.
Hotjar / session recording init: Unlimited. The recording script should initialize on every page.
Chat widget initialization: Unlimited. Chat widgets need to load on every page navigation in an SPA.
Remarketing audiences (Google, Meta, LinkedIn): Unlimited for general site visitor tags. Consider Firing Limit = 1 per session if you want to reduce unnecessary pixel calls for users who browse many pages in a session — though most platforms handle this deduplication on their end.
How NiceLookingData Audits This
The GTM audit checks for conversion tags that have firing options set to Unlimited. Specifically, it looks at two categories: Google Ads Conversion Tracking tags (where Unlimited is almost never correct) and GA4 Event tags whose event name matches a key event name in the paired GA4 property.
A purchase event tag with Unlimited firing is flagged as a WARNING: the configuration is technically functional but creates measurable risk on any confirmation flow where the page can reload, re-render, or be revisited via browser history. The audit specifically cross-references GA4 key events when a paired GA4 property is available — if purchase is marked as a key event in GA4, the corresponding GTM tag gets extra scrutiny because the downstream impact of double-counting is greater.
The firing-options check is part of a broader set of tag configuration checks in the GTM audit, which also looks at tag pausing (active tags with no recent publishes), missing exception triggers on conversion tags, and tag sequencing dependencies that create silent ordering bugs.
Audit your GTM container for firing option issues
NiceLookingData's GTM audit checks conversion tags for Unlimited firing, cross-references your GA4 key events, and flags the tags where a page reload will cost you conversion accuracy.
Run the GTM Audit →FAQ
What are GTM tag firing options?
Tag firing options in Google Tag Manager control how many times a tag is allowed to fire when its trigger conditions are met during a page session. The three options are: Once per Event (fires each time the trigger fires), Once per Page (fires at most once per page load regardless of how many times the trigger fires), and Unlimited (fires every time with no cap). Firing options are found under Advanced Settings on any tag configuration screen.
What is the difference between Once per Event and Once per Page in GTM?
Once per Event fires the tag every time its trigger fires — if a scroll trigger fires at 25%, 50%, 75%, and 90%, a tag set to Once per Event fires four times. Once per Page fires the tag at most once per page load, regardless of how many times the trigger fires — the same scroll trigger would only cause one tag fire. Once per Page resets on each new page navigation; Once per Event resets with each trigger occurrence.
Why is my GA4 purchase event firing twice?
The most common cause is a GA4 Event tag with Unlimited firing on a trigger that fires on the purchase confirmation page. If the confirmation page reloads (user refresh, payment processor redirect, browser back-forward navigation, SPA re-render), the Page View trigger fires again and the tag fires again. Fix by setting the GA4 purchase tag's firing option to Once per Page under Advanced Settings.
How do I prevent duplicate conversions in GTM?
Set conversion tags (purchase, lead submission, checkout complete) to Once per Page in GTM's Advanced Settings. As a secondary safeguard, pass a unique transaction_id or order_id with every conversion event so GA4 and Google Ads can deduplicate on the platform side. Both layers are needed because the Once per Page constraint stops same-page duplicates, while the ID-based deduplication catches cross-session or cross-device duplicates.
What is the GTM Firing Limit setting?
The Firing Limit is a field in GTM's Advanced Settings that sets a numeric cap on how many times a tag can fire within a specified period. The period options are per event, per page, and per session. It is more granular than the three radio options: you can set a tag to fire a maximum of 2 times per session, or once per session across all pages. The Firing Limit overrides the radio option when it produces a stricter constraint — setting "Unlimited" with a Firing Limit of 1 per session means the tag fires once per session.
Should my GA4 tag be set to Unlimited firing?
It depends on the tag. The GA4 Configuration tag and most GA4 Event tags (page_view, scroll, click, video progress) should be Unlimited — these events are meaningful every time they occur. GA4 Event tags that fire on conversion pages (purchase, lead_generated, sign_up) should be set to Once per Page to prevent double-counting when the confirmation page reloads or re-renders.
How do I set up tag sequencing in GTM?
Tag sequencing is in Advanced Settings under "Tag Sequencing." You can specify that a tag should fire before another tag ("Setup tag") or after another tag ("Teardown tag"). Use cases include: firing a consent check before a marketing pixel, initializing a data layer variable before an event tag reads it, or running a cleanup function after a conversion fires. Tag sequencing fires both tags on the same trigger — it does not create a separate trigger for the sequenced tag.
What firing option should I use for Google Ads conversion tracking?
Set Google Ads Conversion Tracking tags to Once per Page. Google Ads has its own deduplication via the order_id parameter, but this only applies within a 24-hour window and requires consistent order IDs. Setting Once per Page at the GTM level is the more reliable primary control, with order_id as a secondary safeguard for edge cases.
Analytics consultant turned founder. After years running the same GA4 and GTM audits across client engagements, Ludde built the audit into a product — so the pattern-matching takes a minute, not a meeting. More about Ludde →
Check your GTM container.
Upload your GTM export or connect live. Our auditor checks 44 best practices and gives you actionable fixes.
