QRCDN
Studio · no account needed

The modernQR platform

The full stack behind a printed code: brand studio, links that never die, scan analytics, and an API. Open source, MIT.

01How it works

Create codes that work forever

  1. 01Design your style

    Pick your ink, module shape and corner style once. That kit becomes your look.

  2. 02Create new codes

    Every code you make inherits the kit. Export SVG or PNG, no watermark, no limits on static codes.

  3. 03Update links anytime

    Repoint a code after it is printed. The code on the wall never changes, only where it sends people.

  4. 04Track scan analytics

    Every scan by day, country, city, device and referrer. Rolled up daily, honest about bots.

03Studio

Design your perfect brand

The real engine under a real light: turn a dial and the object follows. Everything else waits in the studio, free.

Module
Eye
Ink
+
  • Scannability instrument

    Every kit scores against the real engine as you design. All the combos on this panel read 100.

  • Logo knockout

    Drop a mark in the center. The engine carves its space and holds error correction above the floor.

  • Print-ready export

    SVG and PNG, sRGB inks, quiet zone baked in. No watermark at any tier.

Open the studio

Free, no account required

04Brand kits

Every code syncs instantly

Set your kit once. Edit it anytime: every attached code re-renders in the same breath, from menu tents to ticket stubs.

qrcdn.com/menutable tent
qrcdn.com/hoursdoor sticker

Emberkit

ink
#131316#ffffff#90daff
paper
#ffffff#18181b#04131d
modules
rounded · 0.88square · 1.00circle · 0.78
eyes
leafsquarecircle
attached codes
4
qrcdn.com/eventsticket
qrcdn.com/launchposter
  • One kit, every surface

    Modules, eyes, ink, and logo live in the kit. Attach any code and it prints on brand, from a menu tent to a poster.

  • Edits propagate instantly

    Save a change and every attached code re-renders in place. Reprints always pick up the current look, and scans are never touched.

  • Old looks stay safe

    Keep a legacy kit and its codes keep the old style. Detach a code and it freezes exactly as printed, never restyled.

05Dynamic links

Update a destination anytime

Print the code once. Change where it goes as often as you like.

Retarget anytime

Point a printed code somewhere new in seconds. Unlimited on both plans, never a numeric cap.

Never cached

A 302 with no-store, never a 301. Every scan asks us where to go, so an edit is never stuck in someone's browser.

qrcdn.com/cafe

Live at the edge

Changes reach the redirect Worker in seconds, five minutes worst case, on Cloudflare's network.

Your code never dies

Free codes are never deactivated, and a downgrade never breaks a printed code.

06Access controls

Control who can visit

Put a password on a code, give it an end date, or pause it outright. The printed code never changes. What changes is who gets through.

Forwarded302 · no-store

All clear

No controls in the way. The scan forwards in one hop, never cached.

QRCDN

This code is password-protected.

Enter the password to continue.

/p/K7M2X9A

Password

Pro

Hashed with scrypt, checked server-side. The destination never appears in the gate's HTML.

QRCDN

This code isn't live right now.

The person who printed it may have paused it, or it hasn't been claimed yet.

/u/K7M2X9A

Pause

Free
·

Expiry

Pro

Paused and expired codes park here, indistinguishable from unclaimed ones. By design: a scan never reveals why.

A gate, not a vault. A password stops a scan from forwarding. It does not make the destination secret: once someone gets through, the address is in their browser and they can pass it on. Unlock attempts are throttled, which is an abuse backstop rather than a lock.

Explore access controls

07Analytics

Track every scan globally

Every scan is a place and a moment. By day, country, city, device and referrer, rolled up daily and honest about bots.

Scans by daylast 30 days · each mark is one scan

Scans

2,350

scans · 30 days · 1,669 unique devices

Peak day

231

posters went up

Unique devices

1,669

sha256, never raw IPs

Top countries

United States67%
United Kingdom19%
Germany9%
San FranciscoPro
New YorkPro

Devices

Mobile81%
Desktop12%
Tablet7%

Top sources

Direct scan74%
instagram.com14%
google.com8%
bots never make the numbers · UA and HEAD checks at ingestsha256(ip + daily rotating salt) · raw IPs never stored30-day history free · 365-day + city-level on Pro

08Scannability

Know it scans before you print it

The studio checks contrast, module shape and logo coverage as you design. Its limits are not guesswork: they are calibrated against real decode campaigns, and set below the point where anything actually failed.

The instrument

Logo 24%

Scannable · V3 · ECC H

Every check clear with the knockout carved. This exact readout runs live in the studio as you design.

The decode boundary · effective logo ratio

this code · 0.309

fail 0.412
warn 0.395
every pass ≤ 0.407every fail ≥ 0.418

warn sits below the best observed pass · fail sits inside the gap where nothing was observed at all

Measured by a decoder, not by a camera. Those campaigns rendered each style to an image and decoded it with zxing, the library most scanning apps are built on. That is a real test and it is not the same as a phone reading a printed sheet under a shop light, so the thresholds are set conservatively and we say which kind of test they came from.

160+ style combinations · 2 adversarial zxing decode campaigns · warn 0.395 · fail 0.412

09API

Automate with our API

Create, retarget, pause, measure: the whole surface, owner-scoped to a key.

POST/api/v1/codes201 · "url": "https://qrcdn.com/…"Create a dynamic code.
Request
curl -X POST https://www.qrcdn.com/api/v1/codes \
  -H "Authorization: Bearer qrcdn_live_…" \
  -H "Content-Type: application/json" \
  -d '{"name": "Storefront flyer", "destination": "https://example.com/promo", "slug": "mybrand26"}'
Response
// 201 Created
{
  "slug": "MYBRAND26",
  "name": "Storefront flyer",
  "destination": "https://example.com/promo",
  "status": "active",
  "scanCount": 0,
  "brandKitId": "8a9f1c2e-4b3d-4e5f-9a0b-1c2d3e4f5a6b",
  "expiresAt": null,
  "passwordProtected": false,
  "url": "https://qrcdn.com/MYBRAND26",
  "createdAt": "2026-07-23T09:14:02.000Z"
}
GET/api/v1/codes"codes": [ … ] newest firstList every dynamic code owned by this key.
Request
curl https://www.qrcdn.com/api/v1/codes \
  -H "Authorization: Bearer qrcdn_live_…"
Response
{
  "codes": [
    {
      "slug": "8K2QRX",
      "name": "Storefront flyer",
      "destination": "https://example.com/promo",
      "status": "active",
      "scanCount": 142,
      "expiresAt": null,
      "passwordProtected": false,
      "url": "https://qrcdn.com/8K2QRX",
      "createdAt": "2026-07-01T12:00:00.000Z"
    }
  ]
}
GET/api/v1/codes/{slug}"scanCount": 142Fetch one code by slug.
Request
curl https://www.qrcdn.com/api/v1/codes/8K2QRX \
  -H "Authorization: Bearer qrcdn_live_…"
Response
{
  "slug": "8K2QRX",
  "name": "Storefront flyer",
  "destination": "https://example.com/promo",
  "status": "active",
  "scanCount": 142,
  "expiresAt": null,
  "passwordProtected": false,
  "url": "https://qrcdn.com/8K2QRX",
  "createdAt": "2026-07-01T12:00:00.000Z"
}
PATCH/api/v1/codes/{slug}"destination": "…/new-promo"Retarget, pause, and/or set a code's expiry.
Request
curl -X PATCH https://www.qrcdn.com/api/v1/codes/8K2QRX \
  -H "Authorization: Bearer qrcdn_live_…" \
  -H "Content-Type: application/json" \
  -d '{"destination": "https://example.com/new-promo"}'
Response
{
  "slug": "8K2QRX",
  "destination": "https://example.com/new-promo",
  "status": "active",
  "expiresAt": null
}
GET/api/v1/codes/{slug}/analytics"today": { "scans": 3 }Scan analytics for one code: the same data your dashboard renders.
Request
curl "https://www.qrcdn.com/api/v1/codes/8K2QRX/analytics?range=30" \
  -H "Authorization: Bearer qrcdn_live_…"
Response
{
  "range": 30,
  "code": {
    "slug": "8K2QRX",
    "name": "Storefront flyer",
    "destination": "https://example.com/promo",
    "status": "active",
    "scanCount": 142,
    "expiresAt": null,
    "passwordProtected": false,
    "url": "https://qrcdn.com/8K2QRX",
    "createdAt": "2026-07-01T12:00:00.000Z"
  },
  "series": [
    { "day": "2026-06-24", "scans": 12, "uniques": 9 }
  ],
  "totals": { "scans": 142 },
  "today": { "scans": 3 },
  "topCountries": [
    { "key": "US", "count": 88 }
  ],
  "topDevices": [
    { "key": "mobile", "count": 120 }
  ],
  "recentEvents": [
    {
      "ts": "2026-07-23T09:10:44.000Z",
      "country": "US",
      "region": "CA",
      "city": "San Francisco",
      "device": "mobile",
      "referer": "https://instagram.com"
    }
  ]
}
Scoped keys

Bearer auth: a key only ever sees its own codes.

10,000 req/mo

Pro's monthly API allowance, metered per key.

Style JSON

Send a full style on create; the code freezes to it.

Kit attach

Omit style and the code follows your default kit's edits.

Vanity slugs

Pro: choose the printed path, 4 to 17 print-safe characters.

Pause and resume

One PATCH stops scans; resume whenever you like.

Expiry control

Set or clear expiresAt; immediate expiry is legitimate.

Private 404s

Not-found never reveals whether a code exists or is merely not yours.

10Comparison

Industry-leading features

The whole feature set, including what everyone offers. Where we lead is marked, and every row is something you can go and check.

Feature comparison across the industry
FeatureQRCDNFree generatorsShortener add-onsEnterprise platforms
Survives a downgrade, Free codes are never deactivated: a downgrade pauses features, never redirectsYes, never deactivated: pauses features, never redirectsNo, trial traps commonNo, link plans lapsePartial, contract-dependent
Retargeting, Change where a printed code points, live in secondsYes, live in secondsNo, reprint to changeYes, core productYes, standard
Styled codes, free, Full styling in the studio: free, no account, no watermarkYes, no account, no watermark: the public studioPartial, watermarks or sign-up wallsPartial, QR is a paid add-onYes, behind a login
Brand kit sync, Edit the kit once and every attached code follows: 2 kits free, hard syncYes, edit once, every code follows: 2 kits free, hard syncNo, no kit conceptNo, one code at a timePartial, templates, sync varies
Scannability instrument, Scannability enforced by an instrument calibrated on real decodes: warns before you exportYes, calibrated on real decodes: warns before you exportNoNoNo
Scan analytics, Scans by day, place and deviceYes, day, place and deviceNo, none, or pixelsPartial, click countsYes, full breakdowns
IP privacy, Raw IPs never stored: hashed with a daily rotating saltYes, raw IPs never stored: hashed, daily rotating saltPartial, policies varyNo, click logs keep IPsPartial, varies
Retention, Scan history: 30 days free, 365 on ProYes, 30 days free, 365 on ProNo, nonePartial, 60 daysYes, contract-length
API included, 10,000 requests a month on Pro: one scoped endpoint, 404 reveals nothingYes, 10,000 a month on Pro: one scoped endpoint, 404 reveals nothingNoPartial, rate-limited add-onsPartial, often costs extra
Open source, The engine and the platform, MIT licensed: read it before you trust itYes, MIT: read the engine yourselfNoNoNo
Price transparency, $0 free, $8 a month on annual: the price is on the pageYes, $0 / $8/mo annualPartial, until the trapYesPartial, quote form
Teams and SSO, Team seats and SSO are enterprise's lane today: accounts here are single-ownerNo, single owner todayNoPartial, team plans on someYes, built for teams, SSO at contract tier: their lane today

Category patterns, not claims about any specific vendor.

See the full sheet on pricing

12Trust & privacy

Lifetime guarantees

  1. 01We never switch off a free code.pricing policy, in the terms
  2. 02Stop paying and your codes go read-only, never dark.D14, in the terms
  3. 03If our site goes down, your codes keep redirecting.architecture, in the open

302 + no-store, never 301 · KV in front of Postgres · retarget propagates instantly, ≤ 5 min worst case · raw IPs never stored

scan for the terms

13Pricing

Start free, pay when you print at scale

$0 gets 3 dynamic codes that never stop redirecting. Nothing here expires and nothing switches off.

Free

Your first printed codes

forever

$0 per month

Unlimited static codes

3 dynamic codes, retarget any time

2 brand kits

30-day scan analytics

Start free

Pro

Print runs that grow

annual

$8 per month

billed annually $96/yr · save 33%

Everything in Free, plus:

250 dynamic codes

Unlimited brand kits

365-day analytics, city-level geo

API access, 10,000 calls a month

Vanity short links and bulk generation

Expiry and password protection

See everything in Pro

checkout opens at launch, start free today

Enterprise

Print at institutional scale

custom

Let's talk

priced to what you print

Everything in Pro, plus:

Volume past the Pro cap

Self-host the redirect worker, MIT

Custom terms on request

A direct line to the people who built it

Talk to us

Not sure which plan fits? Tell us what you are printing and how many people will scan it, and we will tell you which one you actually need.

Contact us

Create your first code in minutes

Start free. No card, no trial clock.

Start free

your code never dies