Dynamic QR Codes
Troubleshooting
Most Dynamic QR Codes problems trace back to one of a handful of causes — a cache in front of the store, a coupon rule that can’t be met, a permalink setting, or a database update that hasn’t run yet. Find the symptom below; each one says why it happens and what to do.
“My scans aren’t counted, or the cart stays empty”
Start with who opened the code. Only people count:
- Link previews and bots aren’t scans. When you paste a code’s link into WhatsApp, Telegram or Facebook, the app opens it to build a preview; search engines and link checkers visit links too. These are logged as bots, never counted and never add to a cart. Test with your phone’s camera, not by sharing the link to yourself.
- Copied-link visits are link clicks. A visit through Copy link is counted, but as a link click, not a scan. All QR Codes shows both together as Visits.
- Scan a code doesn’t count. Checking a code on QR Codes → Scan a code Pro reads it on your phone without opening it, so no scan is recorded.
If real scans by real phones still go missing — or the scan opens the page but the product never lands in the cart — suspect a page cache. Every scan response tells caches not to store it (Cache-Control: no-store, plus the “don’t cache this page” signal page-cache plugins honour), so WP Rocket, W3 Total Cache and the like are fine on their own. A cache that answers before WordPress runs never sees that signal: your host’s page cache, a CDN (Cloudflare page rules), Varnish, Nginx or LiteSpeed rules. In those, exclude:
- URLs containing
?qrcw=(every code uses this unless it’s a short link); - paths starting with
/q/, if you use short links.
Some visits are counted that no person made: email security scanners (Microsoft Safe Links, Proofpoint, Mimecast) open every link in an email and look like ordinary browsers, so they can’t be filtered out. And unique scans read low on shared networks (an office, an event Wi-Fi). Both are explained under How scans and orders are counted.
“A short link (/q/…) shows a 404 or the wrong page”
Short links like yourstore.com/q/k7m2xa have two requirements:
- Any permalink setting except Plain. With Settings → Permalinks on Plain, printed short links don’t open and new codes fall back to the standard address. The plugin warns you — “N printed QR codes use short links and will stop working — set Permalinks to any setting other than Plain.” — and a read-only QR code short links row on the Permalinks screen shows how many printed codes depend on it. Choose any other setting and they work again; nothing needs reprinting.
- Nothing else at
/q/. If a page (or another plugin) uses the/q/path, it gets in the way. The setting won’t switch on while that’s the case (“The path /q/ is already used by … on this site”). A page created at/q/after codes exist doesn’t break them — only Plain permalinks do.
Codes that use the standard ?qrcw= address work with any permalink setting, including Plain. Turning short links off only affects codes you create afterwards — every printed short link keeps working.
“The coupon could not be applied”
When a shopper scans a product code, the plugin adds the product to the cart and applies the coupon right then — against a cart that may hold only that one item. If WooCommerce refuses the coupon, the product still lands in the cart and the shopper sees “Product added to cart. However, the coupon could not be applied:” followed by WooCommerce’s own reason. Run down the coupon’s rules in Marketing → Coupons:
- Minimum spend is the usual culprit: if the coupon needs a £30 cart and the scanned product is £18, it can’t apply to that single item.
- Product or category restrictions that exclude the very product the code adds.
- Per-customer limits or an allowed emails list the shopper doesn’t match.
- The coupon expired or ran out after you created the code. Since 2.0 the coupon pickers no longer offer expired coupons or ones at their usage limit, so you can’t pick a dead one — but a coupon can still expire later. Edit the code and choose another coupon: printed copies apply the new one from the next scan.
Link codes work differently. Pro A coupon on a link code to one of your own pages is held from the scan and applied as soon as an eligible product is in the cart — so minimum-spend and product rules are checked against the real cart the shopper builds. If a minimum-spend coupon keeps failing on a product code, a link code to the product or a sale page is often the better tool.
“Scanning opens the shop, not the product”
A scan that can’t do its job falls back to the shop (or the product page) rather than an error. The usual reasons:
- The code was never created. The live preview in the QR codes box isn’t a working code until you click Create QR code. Create it, then scan it from its row.
- The code is retired. A retired code applies no coupon and shows “This QR code offer has ended.” Reactivate it on All QR Codes if that wasn’t intended.
- Its product is in the trash. All QR Codes marks it (in the trash). Restore the product, or point the code elsewhere.
- It’s a blank code not yet assigned Pro. Assign it with Scan a code.
- The code was deleted. Its address no longer belongs to anything, so it opens the shop.
Two related cases. A code for a variable product without a set variation opens the product page asking the shopper to pick an option; the coupon waits and applies once they add a variation. And a printed code holds your store’s address — if you move the store to a new domain, redirect the old domain to the new one, or printed codes will open the old address.
“The shopper didn’t see the scan message”
Messages like “Product added to cart and coupon applied!”, “Sorry, "Shirt" is currently out of stock.” or “This QR code offer has ended.” are shown on the page the scan opens. In 1.x a first-time visitor with an empty cart could miss them; since 2.0 the scan keeps the shopper’s session whenever it has something to say, so first visits see them too. Page caches don’t hide them either: a scan that lands on a store page (not the cart or checkout) gets a one-off qrcw_n=… parameter, so caches serve a fresh page, and a small script removes it from the address bar. If a message is still missing, a cache in front of WordPress is probably ignoring query strings — exclude the pages your codes open from it, or have it respect qrcw_n.
A scan that applies a coupon now greets the shopper once: WooCommerce’s own “Coupon code applied successfully.” is muted during the scan, so seeing only the plugin’s message is expected.
“The plugin’s database update hasn’t finished yet”
Version 2.0 updates the plugin’s database tables once. It runs automatically the first time someone opens the WordPress admin after the update — never on a customer’s visit — and if a step fails it retries later. Until it has run, printed codes keep scanning, but some admin actions answer “The plugin’s database update hasn’t finished yet. Reload the page and try again.”
- Open any page of the WordPress admin and reload — that triggers the update.
- Or, with WP-CLI, run
wp qrcw upgrade. It runs the update straight away, lists each step as ok or FAILED, andwp qrcw statusshows where things stand. Details are in the Developer docs.
As with any major update, back up your database before updating from 1.x.
“I want to go back to version 1.x”
You can — your data stays intact and codes made with 1.x keep scanning. But while 1.x is installed:
- Codes created in 2.0 don’t reach their product — 1.x doesn’t know their addresses. Standard
?qrcw=codes open your shop; short links (/q/…) show “page not found”. - Changes you made in 2.0 (a new coupon on a 1.x sticker, a retired code) don’t apply.
When you update to 2.0 again, open the dashboard once (or run wp qrcw upgrade) to finish the database update; until then, codes created in 2.0 still open your shop.
“Your session has expired. Reload the page and try again.”
Your WordPress login timed out while the screen was open (common with a tab left open overnight), so the action was refused instead of failing silently. Reload the page — log in again if asked — and repeat it. If you see “An error occurred. Please try again.” instead, the server returned an error; try once more, and if it persists turn on diagnostic logging (see below).
“Scan a code won’t open the camera”
Scan a code Pro uses your phone’s camera through the browser, which browsers only allow on a secure (HTTPS) admin. What the screen tells you:
- “This browser can’t open the camera here. Type the code instead.” — usually the admin isn’t on HTTPS. Switch the site to HTTPS, or type the code.
- “The camera is blocked. Allow camera access for this site in your browser settings, or type the code instead.” — you (or the browser) declined the permission prompt. Allow the camera for your site in the browser’s site settings and reload.
- “No camera was found on this device. Type the code instead.” — open the screen on your phone rather than a desktop.
Type the code instead always works: enter the six-character identifier (e.g. k7m2xa) or the full address. Print the address under each code with the Code address option and you’ll always have it to hand.
“Logo couldn’t be loaded from another domain”
Codes are drawn in your browser — for the preview, downloads, Media Library images and print. If the logo in your QR design lives on another website (a CDN, an old domain, an image URL pasted in) and that site doesn’t allow it, the browser can’t use it and you’ll see “Logo couldn’t be loaded from another domain — upload it to the Media Library.” Do exactly that: upload the logo to your Media Library, pick it again with the Media Library button, and save.
“My code still shows the old design”
Each code keeps the design it was created with, so changing Settings → QR design styles new codes only. To restyle existing ones, open a code’s Edit dialog and click Use the current site design, or select several on All QR Codes and choose the bulk action Apply current site design. The address doesn’t change, so printed copies keep working; new downloads and prints use the new look. An image you added to the Media Library earlier is marked Image out of date — re-save until you re-save it. See Design your codes.
“Create QR code is greyed out on a product”
The free plan allows one code per product (or per variation), and a retired code still counts — the box says “Free plan: 1 QR code per product.” under the disabled button. You don’t need a new code to change the offer: edit the existing one and pick another coupon. Pro has unlimited codes.
“Analytics show zero, or the revenue looks wrong”
Conversions and revenue are a Pro feature — the free plan counts scans, unique scans and link clicks only. On Pro, the usual surprises are about when a sale counts:
- An order counts once it’s paid — Processing or Completed. Pending payment and On hold orders aren’t conversions yet.
- Net revenue is Completed orders only. Paid orders still in Processing show as Revenue not yet completed. Cancelled, failed and fully refunded orders are left out.
- Check the date range. Every report is filtered by scan date; widen it to All time to confirm the data is there.
- Attribution needs a live session. A sale is linked to a scan through the shopper’s WooCommerce session. A full-page cache on the cart or checkout can drop that session — exclude them from your cache.
- A code to another website reports scans only — no order on your store can be linked to it.
The full rules are under How scans and orders are counted.
“The plugin won’t activate, or shows a red banner”
Dynamic QR Codes checks its requirements on activation and refuses — or deactivates itself — if they aren’t met. It needs WordPress 6.1+, WooCommerce 7.0+ (installed and active) and PHP 7.4+. The most common case is a missing or outdated WooCommerce: install or update it, then activate Dynamic QR Codes again.
Still stuck?
When the symptom doesn’t match anything above, turn on Enable diagnostic logging in QR Codes → Settings → Cleanup, reproduce the problem once, then read the log under WooCommerce → Status → Logs (source qrcw). It records each scan, coupon attempt and attribution as it happens — and it’s exactly what support will ask for. Turn it off again when you’re done, then contact support.
That’s the end of the guide. For the technical side — PHP functions, hooks and WP-CLI — see the Developer docs, or check what’s new in the Changelog.
