Dynamic QR codes

Change where a printed QR code points — with a redirect you own, free, no subscription.

A dynamic QR code is a static code that encodes a URL you control, which HTTP-redirects to the real destination. To repoint a printed code, you edit the redirect — never the code. This is exactly what paid QR services sell as a subscription; with your own domain it's a redirect rule you control.

Setup

  1. Pick a URL on a domain you own — e.g. qr.your-domain.com/launch or your-domain.com/go/launch. The path is the code's identity: one printed thing = one path, so each can be repointed and measured independently.

  2. Redirect it to the destination with a temporary redirect (302 or 307) — never 301. Browsers and QR scanners cache permanent redirects, which would freeze your "dynamic" code forever.

  3. Serve valid HTTPS on the redirect host (any modern host or Cloudflare does this automatically) — that's what keeps phones from showing a warning on scan.

  4. Add UTM parameters to the redirect destination for attribution:

    https://your-site.com/?utm_source=qr-domain&utm_medium=qr&utm_campaign=launch

    Camera apps send no referrer, so untagged scans register as direct traffic. Keep utm_source/utm_medium identical across codes and make utm_campaign the per-code slug. The UTMs live in the redirect target, never in the printed code — you can add or change them after printing.

  5. Generate and print the code with the QR tool's Dynamic mode — it encodes your redirect URL and produces a ready-to-paste setup prompt for your AI assistant with your URLs filled in.

On Cloudflare specifically

If the domain is on Cloudflare: a Redirect Rule (Rules → Redirect Rules) matching the URI path, status 302, does everything — no server needed. For a dedicated redirect domain with no site behind it, first create a proxied dummy DNS record (A / @ / 192.0.2.1, orange cloud) so traffic reaches the edge, and add a catch-all rule last so unmatched paths land somewhere sensible instead of an error page. Many codes? Bulk Redirects gives you one editable list instead of one rule each.