Scanlo: tracked QR codes that keep working

A product I build and operate myself. A printed QR code points at a short link, the short link redirects at the edge and logs the scan, and the owner learns which flyer, table card or window sticker actually gets used.

Problem
A small business prints a QR code for Google reviews or payments and never learns whether anyone scans it. If the link behind it changes, the print is wasted.
What runs
A redirect Worker on separate short domains, a scan log written after the redirect, analytics queries in Postgres, onboarding and monthly summary emails on schedules.
How it is watched
Worker tests in the Workers runtime, migrations rehearsed on a local stack and diffed against production, an admin view that counts codes actually scanned, not just created.
Stack
Cloudflare Workers and KV, Supabase (Postgres with row-level security, Edge Functions, pg_cron), React with static pre-rendering, Stripe, Resend.
Code
Private repository. A walkthrough is available on request.
Scanlo report for a payment hub over 90 days: 56 scans opened the hub page, 37 tapped a payment method, 23 Venmo and 14 Cash App
The report for one payment hub: how many scans opened the page, how many went on to tap a payment app, and which one.

The problem

A QR code on a counter card or a flyer is a link nobody can see. Most generators either give a static code, which tells the owner nothing, or a tracked one that stops working when the subscription lapses, which turns a box of printed cards into rubbish.

Scanlo makes trackable QR codes for one job at a time: collecting Google reviews, taking payments or tips, opening a booking page. I built it and I run it.

What it does

  • Every code encodes a short link, not the destination, so the destination can be changed after printing without changing a pixel.
  • The short link is answered by a Cloudflare Worker: one KV lookup, a redirect with the campaign tags merged in, and the scan is recorded after the response has gone, so logging can never slow a redirect or break it.
  • Scans are logged without cookies and without storing an IP address. The Worker reads the country and network at the edge and discards the rest, and flags bots so they do not inflate the counts.
  • Some codes open a small page of links instead of a single redirect: several payment apps, or several review sites, behind one printed code.
  • A live QR image can be embedded on the business's own website, and taps from the website are counted separately from scans of print.

How it stays under control

  • A printed code works forever. No billing state disables a redirect. A lapsed or downgraded account loses editing and history, never the link on the printed card. This is a written rule of the codebase, not a promise in the pricing page.
  • The redirect domains are not the product domain. They can be rotated if one ends up on a blocklist, without touching the site or the app.
  • Plan limits are enforced in the database, by row-level security and SQL functions, so the browser cannot unlock a paid feature. Every new destination is checked against Google Safe Browsing on create and on edit.
  • The KV store is a copy, kept in step by the database. A trigger pushes every change to the Worker. Unknown links are cached separately and briefly, so bots probing random addresses cannot use up the daily KV write allowance.
  • The numbers go to the owner. A product that sells tracking cannot keep it behind a login, so a monthly email now carries each account's scans, with the paid figures left out of the data for free accounts rather than hidden in the template.

Screenshots

Monthly summary email: 148 scans in September, 21 automated hits left out, scans per code with its placement, and 39 scans from the code embedded on the business's website
The top of the monthly summary, which brings the figures to the owner instead of waiting for a dashboard visit: scans per code and placement, crawler hits named and left out, website taps counted apart from cameras. Rendered from the invented fixtures the email is tested with.

What a business could reuse from this

Anything that has to keep working after it leaves your hands: printed codes, links in signed contracts or packaging, webhooks other systems depend on. Put a redirect you control in between, record what passes through it, and send the results to the people who will not log in to look.

Want something like this, built around your process?

Tell me what happens today and how often. A few sentences are enough.

Describe a process