Double-Counting the Checkout Funnel
A subscription retailer's checkout is a single-page application. After a release, page views are 38% higher than the previous month while orders are flat. Bounce rate fell from 41% to 19%. The Adobe Experience Cloud Debugger shows two /b/ss/ page-view requests for most checkout steps: one from a tag rule on History Change and one from a developer function that calls s.t() after updating s.pageName. Outbound link tracking uses s.tl(), but the link report shows no custom events. The team also sees s.t() calls on the order confirmation page from both the router and the confirmation tag.
1. Identify the root cause and the correct tracking model for the SPA.
Read the worked answer
s.t() is a page-view call. Every call increments page views and resets page-view state. Two calls per checkout step produce two page views, so the 38% inflation is expected. The bounce-rate drop is consistent: more page views per visit makes a visit less likely to be a single-page visit. Orders are flat because purchases are not double-counted or are deduplicated, which confirms the extra hits are page views.
Correct model: one page-view call per logical page, owned in one place. The router should trigger a Direct Call rule that sets pageName, pageType, and clears previous page-level eVars, then calls s.t() once. Remove the History Change beacon or route it into the same Direct Call rule. The confirmation tag should set purchase variables and let the router's page-view call send them, or use s.tl() if the confirmation is a separate interaction. Never let two owners call s.t() for the same page. Keep s.tl() for outbound links, downloads, and other non-page interactions.
2. Why are custom events missing from the outbound link report, and how do you fix it?
Read the worked answer
s.tl() sends a link hit. Only variables listed in s.linkTrackVars are included, and only events listed in s.linkTrackEvents are sent. If the custom event is missing from both lists, it is not transmitted even if it is set in the s object.
Before the call, set s.linkTrackVars = 'events,prop4,eVar4' and s.linkTrackEvents = 'event12', then call s.tl(this,'o','Partner link'). Clear the lists afterwards so page-view hits are not polluted. Also confirm the event is enabled in the report suite and that the link name is passed as the third argument. Validate in the debugger by checking that the link request contains pe=lnk_o and the event parameter.
3. How would you validate the fix and explain the metric changes to stakeholders?
Read the worked answer
Validate in a staging suite with a fixed script: one page-view request per route, pe absent for s.t(), pe=lnk_o for outbound links, and one purchase event per order. Compare the order confirmation page's purchase event count to the backend order count for 48 hours.
Explain to stakeholders that page views and bounce rate will not return exactly to the old values because traffic mix and seasonality change. What should return is the relationship: page views per visit should drop to the pre-release range, and bounce rate should rise back toward the previous range. Do not use a single day to judge. Also check that the extra page views did not inflate visit counts, which would distort conversion metrics.