logo
Conversions

Fix conversions that are not being recorded

Why clicks grow while leads and sales stay at zero — the checks in order, from the switch to checkout on another domain, blockers and consent.

Avatar for undefined
CodeQR Team
Content Team

Conversions fail quietly. The click still works, the visitor still buys, and only the report is wrong. This page goes through the causes in the order worth checking, starting with the ones that cost nothing to rule out.

Availability

  • Plan: Pro and above, or the 14-day trial.
  • Where: the builder, SettingsConversion tracking, and your own site.

Start here

Open one of your links and read the response:

curl -sSI https://go.example.com/summer
HTTP/2 302
location: https://example.com/checkout?cq_id=qcdyQHsX1oajEock
set-cookie: cq_id=qcdyQHsX1oajEock; Path=/summer; Max-Age=2592000

Three things have to be true: the cq_id parameter on your destination, a cq_id cookie, and Max-Age=2592000. If any is missing, stop here — conversion tracking is off for that link, and nothing downstream can work. Turn it on per link, since the workspace-level switch does not currently save.

The chain, and where it breaks

Nothing is reporting the conversion

The most common cause, by a distance. CodeQR counts clicks by itself; leads and sales arrive because your server sends them. A workspace with thousands of clicks and zero leads usually never wired the second half — see Send lead and sale events from your server.

If you followed a browser snippet calling trackLead or trackSale, check the browser console: the loaded script does not expose those functions, so the call fails and no conversion is sent.

The checkout happens on another domain

Stripe, Hotmart, Kiwify and every hosted checkout run on their own domain, and cookies do not travel there. The click id has to be carried explicitly — through client_reference_id for Stripe, or by your server, which knows the id from the session. See Attribute Stripe payments to the right link.

The query parameter is stripped

A redirect on your own site, a marketing platform, or a framework that normalizes URLs can drop cq_id before anything reads it. Read it as early as possible, and keep it across your own redirects.

An ad blocker removed the script

Blockers target analytics scripts by URL and by CNAME, so a custom domain does not reliably get around them. The click is unaffected — it happens on the CodeQR side — but anything that depends on the browser script is lost for that visitor. Conversions sent from your server are immune, which is another reason to send them there.

The visitor declined cookies

A consent banner that blocks non-essential storage stops the click id from being stored. The visit still redirects, the purchase still happens, and the conversion cannot be attributed. This is expected behavior, not a defect, and it puts a ceiling on the conversion rate you can measure.

Tracking prevention shortened the window

Safari and Firefox restrict how long tracking state survives, and the rules apply hardest to cookies written by scripts. The CodeQR click cookie is set by the redirect response itself, which is treated differently, but a long gap between click and purchase remains the case most likely to be lost.

The amount is wrong rather than missing

amount is in the smallest unit of the currency. Sending 49.90 records 49 cents. The sale exists, the revenue is nonsense.

The purchase was on a different device

Someone scans a QR code on their phone and buys on their laptop. There is nothing to link the two sessions, and the sale is unattributed.

Things that look like bugs and are not

  • A bot did not create a lead. Bot traffic never becomes a click, so it never becomes a conversion.
  • Root-domain visits show zero. Opening your custom domain without a link is not recorded.
  • A repeated sale did not double the counter. If both calls carried the same invoiceId, that is idempotency working.
  • The sales list fails to load. Known issue in the Events tab; the counters and Customers are correct.

Verify it works

The end-to-end test that settles most arguments, on a link you control:

  1. Open the short link in a private window.
  2. Confirm on your site that document.cookie contains cq_id.
  3. Send a lead from your server with that id.
  4. Open Customers — the person appears with the click and the lead.

If step 2 fails, the problem is the setup. If step 3 returns 404, the click id is wrong or expired. If step 4 is empty after a 200, the lead had no click id and no known customer to attach to.

Troubleshooting

The lead call returns 404

The click id does not exist or has expired. Without conversion tracking it only lives an hour.

The lead call returns 200 and nothing appears

Accepted and dropped: no click id and no customer CodeQR already knows.

Conversions stopped after a site deploy

Check that the script survived the build and that your redirects still preserve cq_id.

My totals are far below what my payment processor reports

That gap is the sum of everything above — blocked scripts, declined consent, cross-device purchases, checkouts that lost the id. Reporting conversions from your server closes most of it.

Related articles