QRDone

About.

QRDone is an independent QR code studio for cafés, creators, restaurants, and small shops. Most QR tools treat the code as a black-and-white afterthought. We treat it as a design surface and a tool you can actually print without it dying mid-quarter.

What you can make

  • Single QRs in 12 hand-crafted visual styles, with logo upload and brand colours.
  • UPI Pay QRs that drop the customer straight into Google Pay, PhonePe, or any UPI app.
  • WhatsApp QRs with a pre-filled message, plus the usual link, WiFi, vCard, email, phone, and location types.
  • Multi-action smart QRs: one scan opens a menu of call, WhatsApp, directions, save contact, WiFi connect, custom links.
  • Bio pages: a Linktree-style profile at /m/<id> with theme, avatar, and a stack of links.
  • Trackable short links with live scan counts and breakdowns by country, device, and source.
  • Bulk generation. Paste a CSV, get a ZIP of styled QRs.
  • Brand kits. Save colours + logo once, apply everywhere.

How tracking works

Every trackable, bio, and multi-action QR encodes a /q/<id> redirect, not the public /m/<id> page itself. Hits on /q count as scans; hits on the public page (a friend pasting the link into chat, your own preview, social shares) do not. The split means your scan counter reflects real QR scans instead of inflated link-share noise.

No ads, no investors

Everything works without an account. Local QRs and brand kits stay in your browser. Trackable links, bio pages, and multi-action pages need a small backend (Redis at Upstash) so the short URL resolves from anywhere. Even there we only store what's needed for the link to work.

Built with

Next.js 16 (Turbopack), React 19, Tailwind v4, Framer Motion, qr-code-styling, Upstash Redis, and Supabase for auth + the saved catalog. Tiny stack on purpose, so nothing important sits behind a paywall someday.

Open source

Made by

QRDone is built and maintained by Roshan Ramani. Find me on X / Twitter or LinkedIn. If a feature would help you, send a DM. The site stays free because keeping it free is the entire point.