Most free QR code generators add tracking pixels, watermarks, or expire after 30 days. Here's how to find ones that generate clean, permanent codes client-side.
I made 200 QR codes last month for a client's restaurant chain. Menu links, WiFi passwords, feedback forms, Google review shortcuts — the whole deal. I used one of the top-ranked "free" QR code generators. Two weeks later, every single code stopped working. They'd expired. The "free" tier gave me dynamic codes with a 14-day lifespan, and that little detail was buried in paragraph nine of their terms of service.
That restaurant chain had already printed 200 table tents. At $3.50 each. You do the math.
This is not an isolated story. The QR code generator market is one of the most deceptive corners of the free-tools internet. Most of what you'll find on the first page of Google is designed to lock you into a subscription, harvest your analytics data, or both. But there are alternatives — tools that generate clean, permanent, trackingless QR codes entirely in your browser. This guide is about understanding the landscape and finding those alternatives.
I'm not using "scam" loosely. Let me be specific about what these tools are doing.
This is the big one. When you generate a QR code on most popular platforms, you're not getting a code that points directly to your URL. You're getting a code that points to their redirect server. Your QR code sends scanners to something like qr-platform.com/r/abc123, which then redirects to your actual URL.
Why do they do this? Two reasons:
A QR code printed on physical material should last forever. Paper doesn't expire. Stickers don't expire. But a dynamic QR code has the lifespan of whatever company generated it.
Even some generators that create "static" codes still phone home. They embed UTM parameters, redirect through their analytics servers, or append tracking identifiers to your URL. Your clean https://example.com/menu becomes https://example.com/menu?utm_source=qrgen&utm_medium=qr&ref=usr_48291.
If you're generating QR codes for your business, you probably don't want a third-party QR code company injecting their own tracking parameters into your customer journey. You definitely don't want them building a profile of your business based on every code you generate.
You design a beautiful QR code. Custom colors. Your logo in the center. Perfect size. You download it and... there's a semi-transparent watermark across the entire image. Or a "Generated by [Platform]" text in the corner. Or the resolution is deliberately downgraded to 72 DPI — fine for screens, garbage for print.
The platform knows you've already invested 10 minutes customizing. The upgrade prompt appears at exactly the moment of maximum sunk cost. It's a dark pattern, plain and simple.
Some platforms limit how many times a code can be scanned on the free tier. 100 scans, 500 scans, whatever. For a QR code on a restaurant table that gets scanned 50 times a day, you'll hit that limit in a week. Then the code shows an error page — or worse, a page advertising the QR platform.
Imagine your customer scans what they think is your menu and sees "Upgrade to Pro to restore this QR code." That's your brand taking the hit, not theirs.
Let's cut through the marketing fog. There are two types of QR codes, and understanding the difference will save you money and headaches.
A static QR code contains the data directly. When someone scans it, their phone reads the data straight from the pattern — no internet connection needed (except to follow a URL, obviously). The data is baked into the black-and-white pattern itself.
Pros:
Cons:
A dynamic QR code contains a short redirect URL. Scanning it hits a server, which redirects to the actual destination. The server owner can change the destination, track scans, and control access.
Pros:
Cons:
My take: For 90% of use cases, static codes are what you want. The ability to change the destination sounds great in theory, but in practice, how often do you actually change a URL after printing? If you need that flexibility, set up your own redirect (a simple page on your own domain) and encode that URL in a static code. You get the best of both worlds without depending on a QR platform.
Most people think QR codes are just for URLs. They're not. Here's everything a QR code can contain:
Any URL up to about 2,000 characters. This covers virtually every web address you'd ever need to encode. Keep URLs short when possible — shorter URLs produce simpler, more scannable codes.
This is one of my favorite use cases. A QR code can encode your WiFi network name, password, and encryption type. Guests scan the code, their phone auto-connects. No more spelling out xK7$mP2!qR9 to every visitor.
The format is: WIFI:T:WPA;S:NetworkName;P:Password;;
Print one of these on a nice card, frame it, put it in your guest room or restaurant. It's a genuinely better experience than a password on a chalkboard.
A QR code can contain a full digital business card — name, phone, email, company, job title, address, website. When scanned, it prompts the user to save the contact directly. No typing, no misheard email addresses.
This is massively underutilized on physical business cards. A small QR code in the corner that auto-saves all your details? That's actually useful, unlike the QR codes companies put on billboards that link to their homepage (looking at you, every real estate company).
Up to about 4,000 characters of raw text. Useful for instructions, serial numbers, product information, or any message you want to encode without requiring an internet connection to read.
Format: mailto:hello@example.com?subject=Inquiry&body=I%20saw%20your%20QR%20code
Scanning opens the user's email client with everything pre-filled. Great for feedback collection or support requests at physical locations.
Format: smsto:+1234567890:Your pre-filled message here
Same idea as email — scanning opens the messaging app with the number and message pre-filled.
Format: geo:40.7128,-74.0060
Opens the user's maps app to a specific location. Perfect for event venues, store locations, or hiking trail markers.
You can encode a full calendar event (vCalendar format) including title, location, start time, end time, and description. Scanning adds it to the user's calendar. Massively useful for event invitations and conference schedules.
A QR code doesn't have to be a boring black-and-white square. But there are rules you need to follow, or your code won't scan reliably.
The contrast rule is non-negotiable. The foreground (the dark modules) must be significantly darker than the background (the light modules). A minimum contrast ratio of 4:1 is recommended, but I'd aim for 7:1 or higher.
What works:
What doesn't work:
Never invert your QR code. White modules on a dark background looks cool but fails to scan on a surprising number of devices. Some modern scanners handle it, but "some" isn't good enough when you're printing 10,000 flyers.
You can place a logo in the center of a QR code because of something called error correction. QR codes have built-in redundancy — they can lose a percentage of their data and still scan correctly.
There are four error correction levels:
| Level | Label | Data Recovery | Best For |
|---|---|---|---|
| L | Low | ~7% | Maximum data capacity, clean codes without logos |
| M | Medium | ~15% | General use, small logos |
| Q | Quartile | ~25% | Medium logos, some artistic modification |
| H | High | ~30% | Large logos, heavy customization, harsh environments |
If you're adding a logo, use Level H (High). This lets you obscure up to 30% of the code and still have it scan. But don't push it — keep the logo under 20% of the total code area to leave a safety margin.
Critical: Your logo must be placed in the center. Don't cover the three large squares in the corners (those are finder patterns — the scanner uses them to locate and orient the code) or the smaller alignment patterns.
Some generators let you change the shape of individual modules — rounded corners, dots instead of squares, custom shapes. This is mostly cosmetic and usually fine, as long as the contrast and sizing are maintained. But I'd avoid anything too extreme. The more you deviate from standard square modules, the more you're relying on the scanner's tolerance.
QR codes have minimum size requirements that depend on the scanning distance. Print a code too small, and it won't scan. This chart has saved me from reprints more than once:
| Scanning Distance | Minimum QR Code Size | Common Use Case |
|---|---|---|
| 10 cm (4 in) | 2 cm × 2 cm (0.8 × 0.8 in) | Business cards, product labels |
| 30 cm (12 in) | 3 cm × 3 cm (1.2 × 1.2 in) | Table tents, menus, brochures |
| 1 m (3.3 ft) | 10 cm × 10 cm (4 × 4 in) | Posters, window displays |
| 3 m (10 ft) | 30 cm × 30 cm (12 × 12 in) | Banners, wall signs |
| 10 m (33 ft) | 1 m × 1 m (3.3 × 3.3 ft) | Billboards, building signage |
The general formula: QR code size = scanning distance ÷ 10. A code that will be scanned from 2 meters away should be at least 20 cm wide.
Also: always export at the highest resolution available. Vector formats (SVG) are ideal for print because they scale infinitely without pixelation. If you must use raster formats, aim for 300 DPI minimum at the final print size. A 3 cm QR code at 300 DPI is 354 × 354 pixels — make sure your export exceeds that.
I cannot stress this enough. Every single QR code you plan to print should be tested on at least three devices before it goes to the printer. Here's my testing checklist:
I've seen QR codes fail for reasons that would never occur to you: the printer's toner was low and the modules weren't dark enough. The paper had a slight blue tint that reduced contrast. The lamination caused a glare at certain angles. The URL had a typo. The code was placed behind glass and the reflection made it unscannable.
Test. Print a proof. Test again. Then print the full run.
If you need more than a handful of codes — say, unique codes for each product in inventory, individual tickets for an event, or employee ID badges — generating them one at a time is torture.
Good batch generation tools let you:
Some tools also support mail merge style generation where you have a template (like a vCard) with variable fields (name, email, phone) and the tool fills in each row from your spreadsheet.
For the restaurant project I mentioned at the start, batch generation from a spreadsheet would have saved me hours. Instead I was clicking "generate," "download," "rename," "generate," "download," "rename" — 200 times. Lesson learned the hard way.
Here's where things get interesting from a privacy perspective. When you generate a QR code using a cloud-based tool, you're sending that tool every piece of data you encode. Every URL, every WiFi password, every contact card, every piece of text.
Think about what you encode in QR codes:
A cloud-based QR generator sees all of this. They know your WiFi password. They know your upcoming product launch URL before it's public. They have a complete log of every code you've ever generated.
Client-side QR generation means the code is created entirely in your browser. The data you enter never leaves your device. The QR code image is generated using your computer's processor, not a remote server. There's no API call, no upload, no server-side logging.
This is possible because QR code encoding is a well-defined mathematical algorithm. It doesn't need a powerful server — any modern browser can generate a QR code in milliseconds. The only reason most platforms use server-side generation is to capture your data and control your codes.
If you're generating QR codes for anything even slightly sensitive — internal company use, personal contact information, WiFi passwords, pre-launch marketing materials — client-side generation isn't just nice to have. It's the responsible choice.
QR codes have moved well past the "novelty" phase. Here are practical applications I've seen work well:
Here's a comparison of features you should evaluate. I'm not naming specific tools because the landscape changes constantly, but these are the criteria that matter:
| Feature | Must Have | Nice to Have | Red Flag |
|---|---|---|---|
| Static codes | Yes — permanent, no expiration | — | Only offers dynamic codes |
| No watermarks | Yes — clean output always | — | Watermark on free tier |
| No account required | Yes — generate without signing up | — | Requires email before generating |
| Client-side generation | Yes — data stays on your device | — | Uploads data to server |
| SVG export | Yes — vector for print | Also PNG, PDF | Only low-res PNG |
| Error correction selection | Choose L/M/Q/H | Auto-select based on use | No option (usually defaults to L) |
| Color customization | Foreground + background color | Gradient, module shapes | Colors but with watermark |
| Logo insertion | Upload custom logo | Auto-adjust error correction | Logo only on paid tier |
| Batch generation | CSV upload, bulk export | Mail merge templates | One at a time only |
| Multiple data types | URL, WiFi, vCard, text, email | SMS, geo, calendar | URL only |
| High-res output | 300+ DPI for print | Custom DPI setting | Fixed 72 DPI |
| No scan limits | Unlimited scans forever | — | Scan caps on free tier |
| No expiration | Codes work permanently | — | Codes expire after X days |
After generating thousands of QR codes for various projects, these are the mistakes I see most often:
Encoding a URL that will change. If your website might restructure its URLs, use a permanent redirect path that you control. Don't encode example.com/spring-2026-menu — encode example.com/menu and redirect it on your end.
Making the code too small. Refer to the size chart above. I've seen QR codes on business cards that are physically impossible to scan because they're 1 cm wide with a complex URL encoded at low error correction. It's a decorative square at that point.
Not including a quiet zone. QR codes need whitespace (called a "quiet zone") around all four sides — at least 4 modules wide. If you crop the code too tight or place it against a busy background, scanners will struggle to find it.
Using a URL shortener as your encoded URL. If that shortener service shuts down or changes their terms, your codes break. You've just added a dependency. If you need a short URL, use one on your own domain.
Forgetting the call to action. A naked QR code without any context gets scanned at a fraction of the rate of one that says "Scan for menu," "Scan to connect to WiFi," or "Scan to save my contact." Tell people what they'll get.
Choosing error correction L when you're adding a logo. The logo covers data modules. If your error correction is too low, the logo literally destroys the code's ability to be read. Always use H when adding logos.
Printing on reflective material without testing. Metallic surfaces, high-gloss lamination, and reflective stickers can cause scanning failures due to glare. Always test on the actual material.
After the restaurant disaster, I changed my approach entirely. Here's what I look for and what I recommend:
For what it's worth, I've been using browser-based tools that do everything locally — the kind where you can disconnect your internet after the page loads and they still work. akousa.net has a solid QR code generator in its tools section that ticks all these boxes: client-side processing, no watermarks, no account required, SVG export, and support for URLs, WiFi, vCards, and plain text. But regardless of which tool you use, the principles in this guide apply.
The QR code itself is a solved technology. It's a mathematical encoding scheme from 1994. The challenge isn't generating the code — it's avoiding the ecosystem of companies that have turned a simple utility into a subscription trap.
Generate static. Generate locally. Test before you print. Your codes will work forever, your data stays private, and you'll never get a panicked call from a restaurant owner asking why all their table tents stopped working.