Troubleshooting

The fixes for the issues we see most often. If you don't find your problem here, email support@tracerev.com with your site_id.

The pixel isn't firing

Check 1: the script tag is in <head>

Open your store, view source, search for track.js. If it's missing, the snippet wasn't saved or the theme is caching old HTML. Try a forced reload, then re-check.

Check 2: data-site is set

The script needs data-site="site_xxx". Without it, the pixel exits early. Confirm the value matches the Site ID from your dashboard's Settings tab — it should start with site_.

Check 3: ad blocker

Some aggressive ad blockers (uBlock with custom filters, Brave shields on max) block requests to non-essential third-party domains. Test in a fresh incognito window with extensions disabled.

Check 4: CSP / report-only headers

If you have a Content Security Policy, you need to allow the script source and the collect endpoint:

text
script-src 'self' https://tracerev.com;
connect-src 'self' https://tracerev.com;

Charges aren't showing up in Attribution

Check 1: Stripe is connected

Settings tab should show your connected Stripe account ID. If it shows the "Connect Stripe" button, the OAuth handshake didn't complete — re-run it.

Check 2: backfill is in progress

Brand-new connections backfill 12 months of history. For accounts with thousands of charges this takes a few minutes. Refresh the dashboard; rows trickle in.

Check 3: webhook is reaching us

For new charges (post-connect), Trace relies on Stripe webhooks. In your Stripe Dashboard → Developers → Webhooks → click the Trace endpoint. Look for delivery failures (non-2xx responses). If you see them, email support with the failure timestamps.

Lots of charges show as "unattributed"

Unattributed means Trace couldn't resolve the charge to a visitor via either metadata or email match. Common causes:

  • SDK not wired into checkout. Without metadata.trace_visitor_id, attribution depends entirely on email match. Add the SDK to your Checkout Session creation. SDK reference →
  • Different emails between identify and checkout. Customer signs up for the newsletter as alex@gmail.com but checks out as alex+work@gmail.com. Email-match fails. Mitigate by capturing email at multiple points and calling identify() on each.
  • Direct traffic. If a customer typed your URL directly with no UTMs and no referrer, there's nothing to attribute even if we resolve the visitor. They'll show up under direct/none in the channel breakdown.
  • Pre-pixel charges.Charges that happened before you installed the pixel can't be attributed retroactively. They'll always be unattributed.

UTMs aren't being captured

Trace reads UTMs from the current page URL on every pageview, then stores them on the event. Attribution uses the visitor's earliest event with a UTM (first-touch).

Common UTM mistakes

  • UTMs only on the landing page. Your ad URL has UTMs, but a redirect strips them before the pixel fires. Use 302s that preserve query strings, or land directly on the destination.
  • Hash-routing. If your UTMs are after a # instead of a ?, the browser strips them server-side. Always use query strings.
  • Lowercase mismatch. Trace treats utm_source=Meta and utm_source=meta as different sources. Pick a convention (lowercase recommended) and stick to it across all your platforms.

Recommended UTM conventions

ParamWhat goes thereExamples
utm_sourceThe platform / publishermeta, google, reddit, klaviyo, partner
utm_mediumThe format / channel typecpc, organic, email, affiliate, post
utm_campaignCampaign or send namespring-sale, q3-launch, podcast-tim-ferriss
utm_contentCreative variantvideo-a, carousel-b, blog-cta
utm_termKeyword (search ads only)magnesium-glycinate, sleep-supplement

Refunds aren't reducing my revenue

Refund handling is on the roadmap
Today, refunds in Stripe do not deduct from Trace revenue rows — the original charge stays at its full amount. If refund volume matters for your reconciliation, sum refunds in your Stripe Dashboard separately and subtract. We're shipping refund-aware revenue in v2.

I'm on Shopify — why use the SDK?

Shopify's native checkout doesn't let you customize Stripe metadata easily. For Shopify stores, Trace relies on the email-match path, which works fine if you're calling trace.identify() at email capture (newsletter, account, quiz).

If you have a custom Shopify Plus checkout extension or Shopify Functions, you can pass trace_visitor_id through their checkout extensibility hooks. Email support if you need a hand wiring this up.

Getting in touch

Email support@tracerev.com. Include your site_id, the time window of the issue, and a couple of charge IDs we can investigate.