Copy overhaul + qr designs
This commit is contained in:
@@ -27,7 +27,7 @@ export const blogPosts: BlogPost[] = [
|
||||
<p>Unfortunately, you are not alone in this situation, but the technical reality is strict: <strong>it is impossible</strong>. In this comprehensive guide, we will explore exactly why this is the case, what your immediate options are, the underlying mathematics of QR codes, and how you can prevent this costly mistake in the future.</p>
|
||||
|
||||
<h2>The History: Why Static QR Codes Were Created</h2>
|
||||
<p>When Denso Wave invented the QR code in 1994, the primary goal was high-speed scanning for the automotive manufacturing industry. They needed a way to track vehicle parts rapidly on an assembly line. These codes weren't designed for marketing campaigns, dynamic menus, or social media links where destinations frequently change. A static QR code simply translates a string of characters (like a URL or a serial number) directly into a visual pattern. This means the code acts exactly like a printed sentence—once the ink is on the paper, the letters cannot magically rearrange themselves.</p>
|
||||
<p>When Denso Wave invented the QR code in 1994, the primary goal was high-speed scanning for the automotive manufacturing industry. They needed a way to track vehicle parts rapidly on an assembly line. These codes weren't designed for marketing campaigns, dynamic menus, or social media links where destinations frequently change. A static QR code simply translates a string of characters (like a URL or a serial number) directly into a visual pattern. This means the code acts exactly like a printed sentence-once the ink is on the paper, the letters cannot magically rearrange themselves.</p>
|
||||
|
||||
<h2>The Technical Reason (According to International Standards)</h2>
|
||||
|
||||
@@ -110,9 +110,9 @@ export const blogPosts: BlogPost[] = [
|
||||
title:
|
||||
"Static vs Dynamic QR Code: What's the Difference and Which Do You Need?",
|
||||
description:
|
||||
'Static QR codes are permanent. Dynamic QR codes let you change the destination after printing. This guide shows when to use each — with real reprint cost examples.',
|
||||
'Static QR codes are permanent. Dynamic QR codes let you change the destination after printing. This guide shows when to use each - with real reprint cost examples.',
|
||||
excerpt:
|
||||
'Static QR codes are permanent. Dynamic QR codes let you change the destination after printing. This guide shows when to use each — with real reprint cost examples.',
|
||||
'Static QR codes are permanent. Dynamic QR codes let you change the destination after printing. This guide shows when to use each - with real reprint cost examples.',
|
||||
category: 'QR Code Basics',
|
||||
pillar: 'use-cases',
|
||||
published: true,
|
||||
@@ -139,19 +139,19 @@ export const blogPosts: BlogPost[] = [
|
||||
'can you change the url of a qr code',
|
||||
'dynamic qr code meaning',
|
||||
],
|
||||
quickAnswer: `<p>A <strong>static QR code</strong> encodes data permanently — you cannot change it after printing. A <strong>dynamic QR code</strong> uses a short redirect URL so you can update the destination at any time without reprinting. Dynamic codes cost more but are essential for print campaigns where links change.</p>`,
|
||||
quickAnswer: `<p>A <strong>static QR code</strong> encodes data permanently - you cannot change it after printing. A <strong>dynamic QR code</strong> uses a short redirect URL so you can update the destination at any time without reprinting. Dynamic codes cost more but are essential for print campaigns where links change.</p>`,
|
||||
keySteps: [
|
||||
'Decide if your destination URL will ever change — if yes, use dynamic.',
|
||||
'Decide if your destination URL will ever change - if yes, use dynamic.',
|
||||
'For business cards, menus, or seasonal campaigns: always use dynamic.',
|
||||
'For one-time personal use (WiFi, event check-in): static is fine.',
|
||||
'Calculate your reprint costs before committing to static at scale.',
|
||||
'With dynamic QR codes, update the URL in your dashboard — the printed code keeps working.',
|
||||
'With dynamic QR codes, update the URL in your dashboard - the printed code keeps working.',
|
||||
],
|
||||
faq: [
|
||||
{
|
||||
question: 'Can you edit a QR code after printing?',
|
||||
answer:
|
||||
'Not directly. A static QR code cannot be edited — the data is fixed. A dynamic QR code can be edited: you change the destination URL in your dashboard, and the printed code automatically redirects to the new URL.',
|
||||
'Not directly. A static QR code cannot be edited - the data is fixed. A dynamic QR code can be edited: you change the destination URL in your dashboard, and the printed code automatically redirects to the new URL.',
|
||||
},
|
||||
{
|
||||
question: 'Can you change a QR code link?',
|
||||
@@ -161,17 +161,17 @@ export const blogPosts: BlogPost[] = [
|
||||
{
|
||||
question: 'Can you redirect a QR code?',
|
||||
answer:
|
||||
'Yes — dynamic QR codes work through a redirect layer. You set the final destination in a dashboard and can change it at any time. Static QR codes cannot be redirected.',
|
||||
'Yes - dynamic QR codes work through a redirect layer. You set the final destination in a dashboard and can change it at any time. Static QR codes cannot be redirected.',
|
||||
},
|
||||
{
|
||||
question: 'Can you change the URL of a QR code?',
|
||||
answer:
|
||||
'Only for dynamic QR codes. The printed code links to a short managed URL. You update the destination in your account and the redirect changes — no new print needed.',
|
||||
'Only for dynamic QR codes. The printed code links to a short managed URL. You update the destination in your account and the redirect changes - no new print needed.',
|
||||
},
|
||||
{
|
||||
question: 'What does dynamic QR code mean?',
|
||||
answer:
|
||||
'A dynamic QR code encodes a short redirect URL instead of your final destination. This means you can update where the code sends people at any time — without reprinting the physical code.',
|
||||
'A dynamic QR code encodes a short redirect URL instead of your final destination. This means you can update where the code sends people at any time - without reprinting the physical code.',
|
||||
},
|
||||
{
|
||||
question: 'Are static QR codes free?',
|
||||
@@ -181,7 +181,7 @@ export const blogPosts: BlogPost[] = [
|
||||
{
|
||||
question: 'What happens when I reprint a static QR code?',
|
||||
answer:
|
||||
'Reprinting means discarding all previously printed materials and paying full production costs again. For campaigns that change URLs seasonally or annually, this adds up quickly. A single reprint batch for 500 flyers at €0.15 per piece costs €75 — before design and distribution.',
|
||||
'Reprinting means discarding all previously printed materials and paying full production costs again. For campaigns that change URLs seasonally or annually, this adds up quickly. A single reprint batch for 500 flyers at €0.15 per piece costs €75 - before design and distribution.',
|
||||
},
|
||||
{
|
||||
question: 'Do dynamic QR codes expire?',
|
||||
@@ -196,22 +196,22 @@ export const blogPosts: BlogPost[] = [
|
||||
],
|
||||
sources: [
|
||||
{
|
||||
name: 'ISO/IEC 18004:2015 — QR Code bar code symbology specification',
|
||||
name: 'ISO/IEC 18004:2015 - QR Code bar code symbology specification',
|
||||
url: 'https://www.iso.org/standard/62021.html',
|
||||
accessDate: 'April 2026',
|
||||
},
|
||||
{
|
||||
name: 'Denso Wave — QR Code inventor, official QR code information',
|
||||
name: 'Denso Wave - QR Code inventor, official QR code information',
|
||||
url: 'https://www.qrcode.com/en/about/',
|
||||
accessDate: 'April 2026',
|
||||
},
|
||||
{
|
||||
name: 'QR Master — Reprint Cost Calculator',
|
||||
name: 'QR Master - Reprint Cost Calculator',
|
||||
url: 'https://www.qrmaster.net/reprint-calculator',
|
||||
accessDate: 'April 2026',
|
||||
},
|
||||
{
|
||||
name: 'QR Master — Dynamic QR Code Generator',
|
||||
name: 'QR Master - Dynamic QR Code Generator',
|
||||
url: 'https://www.qrmaster.net/dynamic-qr-code-generator',
|
||||
accessDate: 'April 2026',
|
||||
},
|
||||
@@ -226,11 +226,11 @@ export const blogPosts: BlogPost[] = [
|
||||
|
||||
<div class="bg-green-50 border border-green-200 rounded-xl p-6 mb-8">
|
||||
<h2 class="text-lg font-bold text-green-900 mt-0 mb-3">Quick answer</h2>
|
||||
<p class="text-green-800 mb-0">A <strong>static QR code</strong> is permanent — once printed, the data is fixed forever. A <strong>dynamic QR code</strong> routes through a redirect you control, so you can update the destination at any time without reprinting. Dynamic codes are essential for any campaign where URLs change.</p>
|
||||
<p class="text-green-800 mb-0">A <strong>static QR code</strong> is permanent - once printed, the data is fixed forever. A <strong>dynamic QR code</strong> routes through a redirect you control, so you can update the destination at any time without reprinting. Dynamic codes are essential for any campaign where URLs change.</p>
|
||||
</div>
|
||||
|
||||
<h2>What is a Static QR Code?</h2>
|
||||
<p>A static QR code encodes your data — a URL, contact, WiFi password, or plain text — directly into the QR pattern. Once generated and printed, that data is permanent. You cannot change it.</p>
|
||||
<p>A static QR code encodes your data - a URL, contact, WiFi password, or plain text - directly into the QR pattern. Once generated and printed, that data is permanent. You cannot change it.</p>
|
||||
<p>Static codes work fine for:</p>
|
||||
<ul>
|
||||
<li>Personal WiFi passwords that never change</li>
|
||||
@@ -238,15 +238,15 @@ export const blogPosts: BlogPost[] = [
|
||||
<li>Plain text like a short message or fixed phone number</li>
|
||||
<li>Anything where you are 100% certain the content will not change</li>
|
||||
</ul>
|
||||
<p>The problem starts when you use static QR codes for business campaigns where URLs change — menus get updated, promo pages expire, link structures migrate. Every change forces a full reprint.</p>
|
||||
<p>The problem starts when you use static QR codes for business campaigns where URLs change - menus get updated, promo pages expire, link structures migrate. Every change forces a full reprint.</p>
|
||||
|
||||
<h2>What is a Dynamic QR Code?</h2>
|
||||
<p>A dynamic QR code encodes a short redirect URL (e.g., <code>qrmaster.net/r/abc123</code>) instead of your final destination. You control where that redirect points in a dashboard. Change the destination, and the printed code automatically sends scanners to the new URL — no reprint needed.</p>
|
||||
<p>A dynamic QR code encodes a short redirect URL (e.g., <code>qrmaster.net/r/abc123</code>) instead of your final destination. You control where that redirect points in a dashboard. Change the destination, and the printed code automatically sends scanners to the new URL - no reprint needed.</p>
|
||||
<p>Dynamic codes also enable:</p>
|
||||
<ul>
|
||||
<li><strong>Scan tracking</strong> — see how many people scanned, on which device, from which country</li>
|
||||
<li><strong>A/B destination testing</strong> — route scans to different landing pages to compare performance</li>
|
||||
<li><strong>Campaign attribution</strong> — tie print placements to real conversion data</li>
|
||||
<li><strong>Scan tracking</strong> - see how many people scanned, on which device, from which country</li>
|
||||
<li><strong>A/B destination testing</strong> - route scans to different landing pages to compare performance</li>
|
||||
<li><strong>Campaign attribution</strong> - tie print placements to real conversion data</li>
|
||||
</ul>
|
||||
|
||||
<h2>Static vs Dynamic QR Code: Feature Comparison</h2>
|
||||
@@ -295,7 +295,7 @@ export const blogPosts: BlogPost[] = [
|
||||
</div>
|
||||
|
||||
<h2>The Real Cost of Static QR Code Reprints</h2>
|
||||
<p>Here is where the math matters. Many businesses default to static QR codes because they are free to generate. But when the linked URL changes — which happens more often than expected — the cost of reprinting is significant.</p>
|
||||
<p>Here is where the math matters. Many businesses default to static QR codes because they are free to generate. But when the linked URL changes - which happens more often than expected - the cost of reprinting is significant.</p>
|
||||
|
||||
<h3>Example 1: Restaurant Menu</h3>
|
||||
<p>A restaurant prints 200 table tent cards with a static QR code linking to their PDF menu. The menu changes quarterly (seasonal updates). Each reprint batch costs €60 in printing.</p>
|
||||
@@ -337,17 +337,17 @@ export const blogPosts: BlogPost[] = [
|
||||
<p>Get started with a <a href="/dynamic-qr-code-generator" class="text-blue-600 underline font-semibold">dynamic QR code generator</a> to create codes you can update after printing. Pair it with <a href="/qr-code-tracking" class="text-blue-600 underline font-semibold">QR code tracking</a> to see exactly who scans and from where.</p>
|
||||
|
||||
<h2>Summary</h2>
|
||||
<p>The choice between static and dynamic QR codes comes down to one question: <strong>will the destination ever change?</strong> If yes, use dynamic — the subscription cost is almost always lower than the cost of reprinting. If no, static is free and perfectly adequate.</p>
|
||||
<p>The choice between static and dynamic QR codes comes down to one question: <strong>will the destination ever change?</strong> If yes, use dynamic - the subscription cost is almost always lower than the cost of reprinting. If no, static is free and perfectly adequate.</p>
|
||||
</div>`,
|
||||
},
|
||||
|
||||
{
|
||||
slug: 'microsoft-teams-qr-code',
|
||||
title: 'How to Create a Microsoft Teams QR Code for Instant Meeting Joins',
|
||||
title: 'How to Create a Microsoft Teams Meeting QR Code',
|
||||
description:
|
||||
'Step-by-step guide to creating a QR code for any Microsoft Teams meeting. Attendees scan once to join — no link typing needed. Free tool included.',
|
||||
'Four steps, about two minutes: copy the Teams join link, generate the code, size it for print, test it. Includes the free generator and the right print size.',
|
||||
excerpt:
|
||||
'Step-by-step guide to creating a QR code for any Microsoft Teams meeting. Attendees scan once to join — no link typing needed.',
|
||||
'Step-by-step guide to creating a QR code for any Microsoft Teams meeting. Attendees scan once to join - no link typing needed.',
|
||||
category: 'Business Tools',
|
||||
pillar: 'use-cases',
|
||||
published: true,
|
||||
@@ -370,7 +370,7 @@ export const blogPosts: BlogPost[] = [
|
||||
'join teams meeting qr',
|
||||
'teams besprechung qr code',
|
||||
],
|
||||
quickAnswer: `<p>Copy your Teams meeting URL → paste it into <a href="/tools/teams-qr-code">QR Master's free Teams QR generator</a> → download the code → display it in your meeting room or invitation. Attendees scan once to join instantly — no link typing needed.</p>`,
|
||||
quickAnswer: `<p>Copy your Teams meeting URL → paste it into <a href="/tools/teams-qr-code">QR Master's free Teams QR generator</a> → download the code → display it in your meeting room or invitation. Attendees scan once to join instantly - no link typing needed.</p>`,
|
||||
keySteps: [
|
||||
'Open your Microsoft Teams calendar and click on the meeting to copy the Join link.',
|
||||
'Go to qrmaster.net/tools/teams-qr-code and paste the link.',
|
||||
@@ -382,7 +382,7 @@ export const blogPosts: BlogPost[] = [
|
||||
{
|
||||
question: 'Does the QR code work for recurring Teams meetings?',
|
||||
answer:
|
||||
'Yes — recurring Teams meetings typically reuse the same join link, so one QR code works for every session.',
|
||||
'Yes - recurring Teams meetings typically reuse the same join link, so one QR code works for every session.',
|
||||
},
|
||||
{
|
||||
question: 'Can guests without a Teams account join via QR code?',
|
||||
@@ -393,7 +393,7 @@ export const blogPosts: BlogPost[] = [
|
||||
question:
|
||||
"What's the difference between a static and dynamic Teams QR code?",
|
||||
answer:
|
||||
"A static QR code encodes the meeting link permanently. A <a href='/dynamic-qr-code-generator'>dynamic QR code</a> lets you update the link anytime — useful for room displays where meetings change.",
|
||||
"A static QR code encodes the meeting link permanently. A <a href='/dynamic-qr-code-generator'>dynamic QR code</a> lets you update the link anytime - useful for room displays where meetings change.",
|
||||
},
|
||||
{
|
||||
question: 'How big should I print the Teams QR code?',
|
||||
@@ -409,7 +409,7 @@ export const blogPosts: BlogPost[] = [
|
||||
relatedSlugs: ['dynamic-vs-static-qr-codes', 'qr-code-small-business'],
|
||||
sources: [
|
||||
{
|
||||
name: 'Microsoft Teams – Create and join meetings',
|
||||
name: 'Microsoft Teams - Create and join meetings',
|
||||
url: 'https://support.microsoft.com/en-us/office/schedule-a-meeting-in-microsoft-teams-943507a9-8583-4c58-b5d2-8ec8265e04e5',
|
||||
accessDate: 'April 2026',
|
||||
},
|
||||
@@ -441,21 +441,21 @@ export const blogPosts: BlogPost[] = [
|
||||
<ol>
|
||||
<li><strong>Get the Teams meeting link.</strong> Open Microsoft Teams → Calendar → click on your meeting → click "Copy join link". The URL starts with <code>https://teams.microsoft.com/l/meetup-join/...</code></li>
|
||||
<li><strong>Open the Teams QR generator.</strong> Go to <a href="/tools/teams-qr-code" class="text-blue-600 underline">qrmaster.net/tools/teams-qr-code</a>. No account needed for a basic static code.</li>
|
||||
<li><strong>Paste and customize.</strong> Paste the meeting URL. For branding: use Teams purple (<code>#6264A7</code>) for the QR modules. Add a frame label — "Scan to Join" or "Join Teams Meeting" works well.</li>
|
||||
<li><strong>Paste and customize.</strong> Paste the meeting URL. For branding: use Teams purple (<code>#6264A7</code>) for the QR modules. Add a frame label - "Scan to Join" or "Join Teams Meeting" works well.</li>
|
||||
<li><strong>Choose your format.</strong>
|
||||
<ul>
|
||||
<li><strong>PNG</strong> — for digital displays (room screens, Slack, email signatures)</li>
|
||||
<li><strong>SVG</strong> — for print (scales to any size without losing quality)</li>
|
||||
<li><strong>PNG</strong> - for digital displays (room screens, Slack, email signatures)</li>
|
||||
<li><strong>SVG</strong> - for print (scales to any size without losing quality)</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><strong>Test before deploying.</strong> Scan with an iPhone (native camera) and an Android (Google Lens). Test from the actual scanning distance — usually 0.5–1.5 meters for room displays.</li>
|
||||
<li><strong>Test before deploying.</strong> Scan with an iPhone (native camera) and an Android (Google Lens). Test from the actual scanning distance - usually 0.5-1.5 meters for room displays.</li>
|
||||
<li><strong>Display or print.</strong> For room screens, most Teams Rooms devices support custom backgrounds or a dedicated display app. For print, minimum 4×4 cm on paper.</li>
|
||||
</ol>
|
||||
|
||||
<h2>Static vs. Dynamic: Which Should You Use?</h2>
|
||||
<p>For a one-off meeting like a client call, a <strong>static QR code</strong> is fine — it encodes the link permanently and requires no account.</p>
|
||||
<p>For meeting rooms or recurring situations, use a <strong><a href="/dynamic-qr-code-generator" class="text-blue-600 underline">dynamic QR code</a></strong>. Here's why: when a recurring meeting is updated or moved to a new link, a dynamic code lets you update the destination from your dashboard without changing or reprinting the QR code. The code on the room's screen stays the same — only the link behind it changes.</p>
|
||||
<p>Dynamic codes also give you scan analytics — how many people joined via QR vs. link, what device they used, and what time of day has the most scans. Useful if you're running regular events or trainings.</p>
|
||||
<p>For a one-off meeting like a client call, a <strong>static QR code</strong> is fine - it encodes the link permanently and requires no account.</p>
|
||||
<p>For meeting rooms or recurring situations, use a <strong><a href="/dynamic-qr-code-generator" class="text-blue-600 underline">dynamic QR code</a></strong>. Here's why: when a recurring meeting is updated or moved to a new link, a dynamic code lets you update the destination from your dashboard without changing or reprinting the QR code. The code on the room's screen stays the same - only the link behind it changes.</p>
|
||||
<p>Dynamic codes also give you scan analytics - how many people joined via QR vs. link, what device they used, and what time of day has the most scans. Useful if you're running regular events or trainings.</p>
|
||||
|
||||
<h2>Sizing Guide for Teams QR Codes</h2>
|
||||
<table class="w-full text-sm border-collapse my-6">
|
||||
@@ -495,7 +495,7 @@ export const blogPosts: BlogPost[] = [
|
||||
<ul>
|
||||
<li><strong>Teams opens but shows "Meeting not found":</strong> The meeting link has expired or was cancelled. If using a dynamic QR code, update the destination link in your dashboard.</li>
|
||||
<li><strong>QR code scans but nothing happens on some devices:</strong> Some older Android devices need a QR scanner app. The Teams app itself includes a QR scanner under Settings → Scan QR code.</li>
|
||||
<li><strong>Link too long to encode cleanly:</strong> Teams join URLs are long. Use a dynamic QR code — it encodes a short redirect URL instead, which produces a less dense, more reliably scannable code.</li>
|
||||
<li><strong>Link too long to encode cleanly:</strong> Teams join URLs are long. Use a dynamic QR code - it encodes a short redirect URL instead, which produces a less dense, more reliably scannable code.</li>
|
||||
</ul>
|
||||
|
||||
<p>Setting up QR codes for an office or venue? Pair Teams meeting access with a <a href="/tools/wifi-qr-code" class="text-blue-600 underline">WiFi QR code</a>, or use the German <a href="/qr-code-erstellen" class="text-blue-600 underline">QR Code Erstellen</a> page for local teams.</p>
|
||||
@@ -564,7 +564,7 @@ export const blogPosts: BlogPost[] = [
|
||||
{
|
||||
question: 'Can I update my menu without reprinting?',
|
||||
answer:
|
||||
'Yes—if you use a <strong>dynamic</strong> QR code, you can change the destination anytime.',
|
||||
'Yes-if you use a <strong>dynamic</strong> QR code, you can change the destination anytime.',
|
||||
},
|
||||
{
|
||||
question: 'Why is my menu QR code not scanning well?',
|
||||
@@ -585,7 +585,7 @@ export const blogPosts: BlogPost[] = [
|
||||
],
|
||||
sources: [
|
||||
{
|
||||
name: 'National Restaurant Association – State of the Industry 2022',
|
||||
name: 'National Restaurant Association - State of the Industry 2022',
|
||||
url: 'https://restaurant.org/research-and-media/media/press-releases/2022/',
|
||||
accessDate: 'April 2026',
|
||||
},
|
||||
@@ -603,23 +603,23 @@ export const blogPosts: BlogPost[] = [
|
||||
<div class="bg-green-50 border border-green-200 rounded-xl p-6 mb-8">
|
||||
<h2 class="text-lg font-bold text-green-900 mt-0 mb-3">How to set up a restaurant QR code menu (quick answer)</h2>
|
||||
<ol class="space-y-1 text-green-800 mb-0">
|
||||
<li><strong>1.</strong> Prepare your menu — upload as a PDF or use a mobile-friendly landing page</li>
|
||||
<li><strong>1.</strong> Prepare your menu - upload as a PDF or use a mobile-friendly landing page</li>
|
||||
<li><strong>2.</strong> Create a <a href="/dynamic-qr-code-generator" class="text-green-700 underline font-semibold">dynamic QR code</a> so you can update the link anytime without reprinting</li>
|
||||
<li><strong>3.</strong> Customize the design with your logo and brand colors</li>
|
||||
<li><strong>4.</strong> Print at minimum 2" × 2" and place where guests naturally look — table tent, menu cover, or window</li>
|
||||
<li><strong>4.</strong> Print at minimum 2" × 2" and place where guests naturally look - table tent, menu cover, or window</li>
|
||||
<li><strong>5.</strong> Track scans to see peak times and optimize</li>
|
||||
</ol>
|
||||
</div>
|
||||
|
||||
<h2>Why QR Code Menus Became a Restaurant Standard</h2>
|
||||
<p>What started as a contactless safety measure during the pandemic has become a permanent fixture in the restaurant industry. According to industry data, over 60% of restaurants that adopted QR menus during 2020–2021 kept them afterward — not for safety reasons, but because of the business benefits <a href="https://restaurant.org/research-and-media/media/press-releases/2022/" target="_blank" rel="noopener noreferrer">[NRA, 2022]</a>.</p>
|
||||
<p>The advantages are straightforward: a printed menu costs $3–8 per copy to laminate and reprint whenever items change. A QR menu costs nothing to update. For a restaurant that changes its seasonal specials every few months, that adds up fast. Beyond cost savings, QR menus open up analytics that paper never could — you can see which menu sections guests spend the most time on, when peak scanning happens during the day, and which table locations drive the most engagement.</p>
|
||||
<p>What started as a contactless safety measure during the pandemic has become a permanent fixture in the restaurant industry. According to industry data, over 60% of restaurants that adopted QR menus during 2020-2021 kept them afterward - not for safety reasons, but because of the business benefits <a href="https://restaurant.org/research-and-media/media/press-releases/2022/" target="_blank" rel="noopener noreferrer">[NRA, 2022]</a>.</p>
|
||||
<p>The advantages are straightforward: a printed menu costs $3-8 per copy to laminate and reprint whenever items change. A QR menu costs nothing to update. For a restaurant that changes its seasonal specials every few months, that adds up fast. Beyond cost savings, QR menus open up analytics that paper never could - you can see which menu sections guests spend the most time on, when peak scanning happens during the day, and which table locations drive the most engagement.</p>
|
||||
|
||||
<h2>Static vs. Dynamic QR Codes for Restaurant Menus</h2>
|
||||
<p>This is the most important decision you'll make when setting up a restaurant QR menu.</p>
|
||||
<p><strong>Static QR codes</strong> encode your menu URL directly into the code. Once printed, the link is permanent. If your menu URL changes — or if you switch to a different menu platform — you have to reprint every table card, tent, and sign. They're fine for a single use, but impractical for a living document like a restaurant menu.</p>
|
||||
<p><strong>Static QR codes</strong> encode your menu URL directly into the code. Once printed, the link is permanent. If your menu URL changes - or if you switch to a different menu platform - you have to reprint every table card, tent, and sign. They're fine for a single use, but impractical for a living document like a restaurant menu.</p>
|
||||
<p><strong>Dynamic QR codes</strong> work differently: they point to a short redirect URL that you control from a dashboard. The printed QR code never changes, but you can update the destination link anytime. Seasonal menu? Update the link. Switching from a PDF to a proper menu website? Update the link. No reprinting, no waste.</p>
|
||||
<p>Dynamic QR codes also give you scan analytics — device types, scan times, and location data. For a restaurant, knowing that 80% of guests scan between 12:00 and 13:00 on weekdays tells you something about how to structure your lunch push.</p>
|
||||
<p>Dynamic QR codes also give you scan analytics - device types, scan times, and location data. For a restaurant, knowing that 80% of guests scan between 12:00 and 13:00 on weekdays tells you something about how to structure your lunch push.</p>
|
||||
<p><strong>Recommendation: Always use dynamic QR codes for restaurant menus.</strong> <a href="/dynamic-qr-code-generator" class="text-blue-600 underline">Create a dynamic QR code here →</a></p>
|
||||
|
||||
<h2>What Should Your QR Menu Link To?</h2>
|
||||
@@ -643,7 +643,7 @@ export const blogPosts: BlogPost[] = [
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<p>Whatever you choose, make sure the page is mobile-optimized — over 90% of QR menu scans happen on a smartphone. Test it: if you have to pinch to zoom or scroll horizontally, guests will abandon it.</p>
|
||||
<p>Whatever you choose, make sure the page is mobile-optimized - over 90% of QR menu scans happen on a smartphone. Test it: if you have to pinch to zoom or scroll horizontally, guests will abandon it.</p>
|
||||
|
||||
<h2>Step-by-Step: Setting Up Your Restaurant QR Menu</h2>
|
||||
<ol>
|
||||
@@ -651,9 +651,9 @@ export const blogPosts: BlogPost[] = [
|
||||
<li><strong>Get your menu URL.</strong> Upload the PDF to a hosting service or use the URL of your menu page. Make sure it loads in under 3 seconds on a mobile connection.</li>
|
||||
<li><strong>Create a dynamic QR code</strong> at <a href="/create" class="text-blue-600 underline">QR Master</a>. Paste your menu URL as the destination. This creates a redirect you can update later.</li>
|
||||
<li><strong>Customize the design.</strong> Add your restaurant logo, use your brand colors, and make sure there's enough contrast between the QR pattern and background (always dark on white, never reverse).</li>
|
||||
<li><strong>Download the QR code</strong> in SVG format for print quality. SVG scales to any size without pixelation — critical for table cards and larger signs.</li>
|
||||
<li><strong>Download the QR code</strong> in SVG format for print quality. SVG scales to any size without pixelation - critical for table cards and larger signs.</li>
|
||||
<li><strong>Test before printing.</strong> Scan with both iPhone (native camera) and Android (Google Lens and native camera). Test at different distances and lighting conditions.</li>
|
||||
<li><strong>Print at the right size.</strong> Minimum 2" × 2" (5 × 5 cm) for table use. Recommended 2.5" × 2.5" for table tents. For window decals or A-frames, go larger — 4" × 4" or more.</li>
|
||||
<li><strong>Print at the right size.</strong> Minimum 2" × 2" (5 × 5 cm) for table use. Recommended 2.5" × 2.5" for table tents. For window decals or A-frames, go larger - 4" × 4" or more.</li>
|
||||
<li><strong>Place where guests look naturally</strong> (see placement guide below).</li>
|
||||
</ol>
|
||||
|
||||
@@ -672,8 +672,8 @@ export const blogPosts: BlogPost[] = [
|
||||
<p>The QR code is a physical extension of your brand. It should look intentional, not like a generic black-and-white square dropped on a napkin dispenser.</p>
|
||||
<ul>
|
||||
<li><strong>Contrast is everything:</strong> Dark pattern on a white or very light background. The minimum contrast ratio for reliable scanning is about 4:1. Avoid placing the QR code on a colored or patterned background without sufficient contrast.</li>
|
||||
<li><strong>Add your logo:</strong> Most QR generators support embedding a logo in the center. Keep the logo small (max 20–25% of the QR area) so it doesn't obscure too many data modules.</li>
|
||||
<li><strong>Brand colors:</strong> You can use a brand color for the QR modules, but test thoroughly — some color combinations scan unreliably on older devices. When in doubt, keep the modules dark.</li>
|
||||
<li><strong>Add your logo:</strong> Most QR generators support embedding a logo in the center. Keep the logo small (max 20-25% of the QR area) so it doesn't obscure too many data modules.</li>
|
||||
<li><strong>Brand colors:</strong> You can use a brand color for the QR modules, but test thoroughly - some color combinations scan unreliably on older devices. When in doubt, keep the modules dark.</li>
|
||||
<li><strong>Quiet zone:</strong> Leave a white margin around the QR code. At least 4 module widths on every side. Cutting into this margin causes scan failures.</li>
|
||||
<li><strong>Label it:</strong> Add a short call-to-action below the code: "Scan for menu" or "View our menu." Guests who aren't sure what to do will appreciate the prompt.</li>
|
||||
</ul>
|
||||
@@ -686,7 +686,7 @@ export const blogPosts: BlogPost[] = [
|
||||
<li><strong>Location data:</strong> If you have multiple locations or multiple QR codes at different positions (table tents vs. window), you can see which placements drive the most scans.</li>
|
||||
<li><strong>Scan trends over time:</strong> Is a new menu section driving more engagement? Did a menu update increase scan rates?</li>
|
||||
</ul>
|
||||
<p>Use UTM parameters in your menu URL to connect QR scan data to Google Analytics — this lets you see not just how many people scanned, but what they did on the menu page afterward. <a href="/qr-code-tracking" class="text-blue-600 underline">Learn more about QR code scan tracking →</a></p>
|
||||
<p>Use UTM parameters in your menu URL to connect QR scan data to Google Analytics - this lets you see not just how many people scanned, but what they did on the menu page afterward. <a href="/qr-code-tracking" class="text-blue-600 underline">Learn more about QR code scan tracking →</a></p>
|
||||
|
||||
<h2>Troubleshooting: Why Guests Can't Scan Your QR Menu</h2>
|
||||
<p>If guests are struggling to scan, the cause is almost always one of these:</p>
|
||||
@@ -695,12 +695,12 @@ export const blogPosts: BlogPost[] = [
|
||||
<li><strong>Low contrast:</strong> Dark QR on dark background, or faded print. Always use dark modules on a white or near-white background.</li>
|
||||
<li><strong>Glossy lamination with reflections:</strong> Light glare from overhead lighting hits the laminated surface and confuses the camera. Use matte lamination for table cards.</li>
|
||||
<li><strong>Damaged or dirty code:</strong> A QR code can withstand up to 30% damage (that's the error correction), but a sticky menu tent with sauce obscuring a corner will fail. Replace when dirty.</li>
|
||||
<li><strong>Slow destination page:</strong> The QR code itself scanned fine — the menu page is just slow. Optimize page load speed. A PDF over 2MB on a weak mobile connection feels broken even if it's technically working.</li>
|
||||
<li><strong>Slow destination page:</strong> The QR code itself scanned fine - the menu page is just slow. Optimize page load speed. A PDF over 2MB on a weak mobile connection feels broken even if it's technically working.</li>
|
||||
<li><strong>No quiet zone:</strong> If the QR code was cropped or printed too close to an edge, scanning will fail. Always check the printed proof before ordering a large batch.</li>
|
||||
</ul>
|
||||
|
||||
<h2>Restaurant QR Menus and Use-Case Examples</h2>
|
||||
<p>QR menus work across different restaurant formats — but the implementation details vary. <a href="/restaurants" class="text-blue-600 underline">See how different restaurant types use QR Master for their menus →</a></p>
|
||||
<p>QR menus work across different restaurant formats - but the implementation details vary. <a href="/restaurants" class="text-blue-600 underline">See how different restaurant types use QR Master for their menus →</a></p>
|
||||
<ul>
|
||||
<li><strong>Fine dining:</strong> Embed the QR code on the back of a premium menu card. Keep the design minimal and brand-consistent. Use a PDF of the full menu with allergen notes.</li>
|
||||
<li><strong>Casual dining / fast casual:</strong> Table tents or placemat QR codes. Update frequently for daily specials. Use a mobile-optimized landing page for the best experience.</li>
|
||||
@@ -756,17 +756,17 @@ export const blogPosts: BlogPost[] = [
|
||||
{
|
||||
question: 'Does a vCard QR code work on iPhone and Android?',
|
||||
answer:
|
||||
'Yes—most modern phones support saving contacts via vCard/VCF after scanning.',
|
||||
'Yes-most modern phones support saving contacts via vCard/VCF after scanning.',
|
||||
},
|
||||
{
|
||||
question: "Static vs dynamic vCard—what's better?",
|
||||
question: "Static vs dynamic vCard-what's better?",
|
||||
answer:
|
||||
'<strong>Dynamic</strong> is better if your info changes. You can update details and track scans.',
|
||||
},
|
||||
{
|
||||
question: 'Can I include LinkedIn and social links?',
|
||||
answer:
|
||||
'Yes—add LinkedIn/website links for a stronger professional profile.',
|
||||
'Yes-add LinkedIn/website links for a stronger professional profile.',
|
||||
},
|
||||
{
|
||||
question: 'What file format is best for printing business cards?',
|
||||
@@ -791,33 +791,33 @@ export const blogPosts: BlogPost[] = [
|
||||
|
||||
<div class="bg-blue-50 border border-blue-200 rounded-xl p-6 mb-8">
|
||||
<p class="text-blue-900 font-semibold mb-2">Ready to create one?</p>
|
||||
<p class="text-blue-800 mb-3">Use the free vCard QR Code Generator — no signup required, works on iPhone and Android.</p>
|
||||
<p class="text-blue-800 mb-3">Use the free vCard QR Code Generator - no signup required, works on iPhone and Android.</p>
|
||||
<a href="/tools/vcard-qr-code" class="inline-block bg-blue-600 text-white font-semibold px-5 py-2.5 rounded-lg hover:bg-blue-700 transition-colors">Create your vCard QR Code →</a>
|
||||
</div>
|
||||
|
||||
<h2>What is a vCard QR Code?</h2>
|
||||
<p>A vCard (Virtual Contact File) QR code contains your contact information in a standardized format (.vcf). When someone scans it with their smartphone camera, they can instantly save your details to their contacts — no typing required. It replaces the friction of spelling out a phone number or email at a networking event with a single tap.</p>
|
||||
<p>A vCard (Virtual Contact File) QR code contains your contact information in a standardized format (.vcf). When someone scans it with their smartphone camera, they can instantly save your details to their contacts - no typing required. It replaces the friction of spelling out a phone number or email at a networking event with a single tap.</p>
|
||||
<p>The QR code encodes a VCF data string directly. That string includes fields like name, phone, email, company, job title, website, and LinkedIn. When the phone's camera reads the code, it parses the VCF and offers to add the contact in one tap.</p>
|
||||
|
||||
<h2>Static vs Dynamic vCard QR Codes</h2>
|
||||
<p>This is the most important choice you'll make.</p>
|
||||
<ul>
|
||||
<li><strong>Static vCard QR codes</strong> embed your contact info directly into the code. They work without any internet connection — the data is in the code itself. The downside: if your phone number or email changes, the code is outdated and needs to be reprinted.</li>
|
||||
<li><strong>Dynamic vCard QR codes</strong> point to a redirect URL that serves the VCF. You can update your contact info at any time from a dashboard — the printed QR code stays the same. Dynamic codes also give you scan analytics: how many times it was scanned, on which devices, from which locations.</li>
|
||||
<li><strong>Static vCard QR codes</strong> embed your contact info directly into the code. They work without any internet connection - the data is in the code itself. The downside: if your phone number or email changes, the code is outdated and needs to be reprinted.</li>
|
||||
<li><strong>Dynamic vCard QR codes</strong> point to a redirect URL that serves the VCF. You can update your contact info at any time from a dashboard - the printed QR code stays the same. Dynamic codes also give you scan analytics: how many times it was scanned, on which devices, from which locations.</li>
|
||||
</ul>
|
||||
<p><strong>Recommendation:</strong> Use dynamic if you might change jobs, switch numbers, or want to track engagement. Use static if you just need a simple one-time contact share.</p>
|
||||
<p>The <a href="/tools/vcard-qr-code" class="text-blue-600 underline">QR Master vCard generator</a> supports both — static for simplicity, dynamic for flexibility and tracking.</p>
|
||||
<p>The <a href="/tools/vcard-qr-code" class="text-blue-600 underline">QR Master vCard generator</a> supports both - static for simplicity, dynamic for flexibility and tracking.</p>
|
||||
|
||||
<h2>What to Include in a vCard QR Code</h2>
|
||||
<p>Less is more. Include the fields people actually need to follow up with you:</p>
|
||||
<ul>
|
||||
<li><strong>Full name</strong> — exactly as you want it to appear in contacts</li>
|
||||
<li><strong>Phone number</strong> — in international format (+49...) for cross-border scanning</li>
|
||||
<li><strong>Email address</strong> — your primary professional email</li>
|
||||
<li><strong>Company and job title</strong> — helps recipients remember context</li>
|
||||
<li><strong>Website or LinkedIn</strong> — one link, whichever drives the most value for you</li>
|
||||
<li><strong>Full name</strong> - exactly as you want it to appear in contacts</li>
|
||||
<li><strong>Phone number</strong> - in international format (+49...) for cross-border scanning</li>
|
||||
<li><strong>Email address</strong> - your primary professional email</li>
|
||||
<li><strong>Company and job title</strong> - helps recipients remember context</li>
|
||||
<li><strong>Website or LinkedIn</strong> - one link, whichever drives the most value for you</li>
|
||||
</ul>
|
||||
<p>Avoid adding multiple phone numbers or social handles unless you have a specific reason — cluttered vCards confuse the contact save prompt on some phones.</p>
|
||||
<p>Avoid adding multiple phone numbers or social handles unless you have a specific reason - cluttered vCards confuse the contact save prompt on some phones.</p>
|
||||
|
||||
<h2>How to Create a vCard QR Code (Free)</h2>
|
||||
<ol>
|
||||
@@ -833,7 +833,7 @@ export const blogPosts: BlogPost[] = [
|
||||
<ul>
|
||||
<li><strong>Business cards:</strong> Print the QR on the back. Replaces typing out contact info at events.</li>
|
||||
<li><strong>Email signature:</strong> Embed the QR code image so recipients on mobile can tap to save your contact.</li>
|
||||
<li><strong>Conference badges and lanyards:</strong> Makes networking frictionless — one scan at a booth saves full contact details.</li>
|
||||
<li><strong>Conference badges and lanyards:</strong> Makes networking frictionless - one scan at a booth saves full contact details.</li>
|
||||
<li><strong>Trade show materials:</strong> Brochures, flyers, and rollup banners with a QR code so visitors can save your info without collecting paper.</li>
|
||||
<li><strong>LinkedIn profile:</strong> Share as an image for connections who want to save your contact directly.</li>
|
||||
</ul>
|
||||
@@ -846,7 +846,7 @@ export const blogPosts: BlogPost[] = [
|
||||
<h3>Can I include my photo in a vCard QR code?</h3>
|
||||
<p>The VCF format supports embedding a photo, but the encoded QR code becomes very large (and harder to scan) with a full photo. It's better to skip the photo in the vCard itself and put your headshot next to the QR code on the business card instead.</p>
|
||||
<h3>What's the best file format to download?</h3>
|
||||
<p>SVG for print — it scales to any size with no pixelation. PNG at 300 DPI for digital sharing.</p>
|
||||
<p>SVG for print - it scales to any size with no pixelation. PNG at 300 DPI for digital sharing.</p>
|
||||
|
||||
<div class="bg-gray-50 border border-gray-200 rounded-xl p-6 mt-8">
|
||||
<h3 class="font-bold text-gray-900 mt-0 mb-2">Create your vCard QR Code</h3>
|
||||
@@ -970,7 +970,7 @@ export const blogPosts: BlogPost[] = [
|
||||
{
|
||||
question: 'What is the minimum QR code size for business cards?',
|
||||
answer:
|
||||
'Common safe minimum is around <strong>0.8–1.0 inch</strong> (2–2.5 cm), depending on data density and print quality.',
|
||||
'Common safe minimum is around <strong>0.8-1.0 inch</strong> (2-2.5 cm), depending on data density and print quality.',
|
||||
},
|
||||
{
|
||||
question: 'How does scanning distance affect size?',
|
||||
@@ -980,7 +980,7 @@ export const blogPosts: BlogPost[] = [
|
||||
{
|
||||
question: 'Does more data require a bigger QR code?',
|
||||
answer:
|
||||
'Yes—more data increases module density and reduces scannability at small sizes.',
|
||||
'Yes-more data increases module density and reduces scannability at small sizes.',
|
||||
},
|
||||
],
|
||||
relatedSlugs: [
|
||||
@@ -1090,7 +1090,7 @@ export const blogPosts: BlogPost[] = [
|
||||
</p>
|
||||
</div>
|
||||
<h2>Why <a href="/qr-code-tracking" class="text-blue-600 underline font-semibold">Track QR Codes</a>?</h2>
|
||||
<p>According to <a href="https://bitly.com/blog/qr-code-statistics/" target="_blank" rel="noopener noreferrer"><cite>Bitly's QR Code Statistics</cite></a>, tracking QR scans is essential for understanding campaign performance. Dynamic QR codes allow you to capture real-time metrics like scan volume, geographic location, device types, and timestamp patterns—data that drives ROI optimization.</p>
|
||||
<p>According to <a href="https://bitly.com/blog/qr-code-statistics/" target="_blank" rel="noopener noreferrer"><cite>Bitly's QR Code Statistics</cite></a>, tracking QR scans is essential for understanding campaign performance. Dynamic QR codes allow you to capture real-time metrics like scan volume, geographic location, device types, and timestamp patterns-data that drives ROI optimization.</p>
|
||||
<h3>Dynamic vs Static QR for Tracking</h3>
|
||||
<p>Only <strong>dynamic QR codes</strong> can be tracked effectively. Dynamic codes redirect scans through a server, allowing analytics collection before users reach their destination. Static QR codes embed the destination directly, making tracking impossible.</p></div>`,
|
||||
},
|
||||
@@ -1180,7 +1180,7 @@ export const blogPosts: BlogPost[] = [
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<p>One of the most common questions we get is: "Should I use a static or <a href="/dynamic-qr-code-generator" class="text-blue-600 underline font-semibold">dynamic QR code</a>?" If you are using the QR code for marketing, business, or any long-term use, <strong>choose Dynamic</strong>. According to <a href="https://bitly.com/blog/qr-code-statistics/" target="_blank" rel="noopener noreferrer"><cite>industry research on QR code performance</cite></a>, dynamic QR codes enable better campaign optimization, cost control, and real-time analytics—key advantages for business applications.</p>
|
||||
<p>One of the most common questions we get is: "Should I use a static or <a href="/dynamic-qr-code-generator" class="text-blue-600 underline font-semibold">dynamic QR code</a>?" If you are using the QR code for marketing, business, or any long-term use, <strong>choose Dynamic</strong>. According to <a href="https://bitly.com/blog/qr-code-statistics/" target="_blank" rel="noopener noreferrer"><cite>industry research on QR code performance</cite></a>, dynamic QR codes enable better campaign optimization, cost control, and real-time analytics-key advantages for business applications.</p>
|
||||
</div>`,
|
||||
},
|
||||
|
||||
@@ -1210,18 +1210,18 @@ export const blogPosts: BlogPost[] = [
|
||||
'csv qr code generator',
|
||||
'bulk qr generator',
|
||||
],
|
||||
quickAnswer: `<p>To create bulk QR codes, prepare an <strong>Excel/CSV</strong> with one row per destination (URL/text/etc.). Upload it to a bulk generator to instantly produce many unique QR codes—ideal for badges, inventory, mailers, and campaigns.</p>`,
|
||||
quickAnswer: `<p>To create bulk QR codes, prepare an <strong>Excel/CSV</strong> with one row per destination (URL/text/etc.). Upload it to a bulk generator to instantly produce many unique QR codes-ideal for badges, inventory, mailers, and campaigns.</p>`,
|
||||
keySteps: [
|
||||
'Create an Excel/CSV with one QR per row (e.g., URL, label, optional UTM fields).',
|
||||
'Validate formatting (no broken URLs, consistent columns).',
|
||||
'Upload the file to a bulk QR generator tool.',
|
||||
'Choose static vs dynamic (dynamic for tracking/editing).',
|
||||
'Generate and download the batch (ZIP folder).',
|
||||
'Test-scan a random sample (5–10 codes) before production.',
|
||||
'Test-scan a random sample (5-10 codes) before production.',
|
||||
],
|
||||
faq: [
|
||||
{
|
||||
question: 'What file format is required—Excel or CSV?',
|
||||
question: 'What file format is required-Excel or CSV?',
|
||||
answer:
|
||||
'Most tools accept <strong>CSV</strong>. Excel usually needs export to CSV.',
|
||||
},
|
||||
@@ -1305,7 +1305,7 @@ export const blogPosts: BlogPost[] = [
|
||||
'qr code roi',
|
||||
'utm analytics',
|
||||
],
|
||||
quickAnswer: `<p><strong>QR analytics</strong> shows what happens after you publish a QR: scan volume, time patterns, device mix, and location trends. Use analytics to improve placement, landing pages, and offers—so scans turn into measurable ROI.</p>`,
|
||||
quickAnswer: `<p><strong>QR analytics</strong> shows what happens after you publish a QR: scan volume, time patterns, device mix, and location trends. Use analytics to improve placement, landing pages, and offers-so scans turn into measurable ROI.</p>`,
|
||||
keySteps: [
|
||||
'Use dynamic QR so scan events can be measured.',
|
||||
'Define KPIs (scans, conversions, cost per conversion, ROI).',
|
||||
@@ -1370,7 +1370,7 @@ export const blogPosts: BlogPost[] = [
|
||||
</div>
|
||||
|
||||
<h2>What Are Scan Analytics?</h2>
|
||||
<p>Scan analytics provide comprehensive insights into how users interact with your <a href="/qr-code-tracking" class="text-primary-600 hover:underline">dynamic QR codes</a>. According to <a href="https://www.qrcodechimp.com/qr-code-statistics/" target="_blank" rel="noopener noreferrer"><cite>QRCodeChimp's 2026 QR Code Statistics</cite></a>, QR codes enable real-time tracking of geographic location, device types, scan timestamps, and user engagement patterns—essential metrics for optimizing marketing ROI.</p>
|
||||
<p>Scan analytics provide comprehensive insights into how users interact with your <a href="/qr-code-tracking" class="text-primary-600 hover:underline">dynamic QR codes</a>. According to <a href="https://www.qrcodechimp.com/qr-code-statistics/" target="_blank" rel="noopener noreferrer"><cite>QRCodeChimp's 2026 QR Code Statistics</cite></a>, QR codes enable real-time tracking of geographic location, device types, scan timestamps, and user engagement patterns-essential metrics for optimizing marketing ROI.</p>
|
||||
|
||||
<h3>Key Metrics to Monitor</h3>
|
||||
<p>The most important scan analytics include total scan volume, unique scans, geographic distribution, device mix (mobile vs desktop), and conversion rates. By analyzing these metrics, businesses can identify winning placements and underperforming campaigns quickly.</p>
|
||||
@@ -1435,7 +1435,7 @@ export const blogPosts: BlogPost[] = [
|
||||
{
|
||||
question: 'Is this barcode generator free for commercial use?',
|
||||
answer:
|
||||
'Yes—our tool lets you generate and download high-resolution barcode images for commercial packaging and labels.',
|
||||
'Yes-our tool lets you generate and download high-resolution barcode images for commercial packaging and labels.',
|
||||
},
|
||||
{
|
||||
question: 'How do I print barcode labels correctly?',
|
||||
@@ -1460,14 +1460,14 @@ export const blogPosts: BlogPost[] = [
|
||||
</div>
|
||||
|
||||
<h2>What Is a Barcode Generator?</h2>
|
||||
<p>A barcode generator is a tool that turns a number or text string into a scannable barcode image. You enter a value — a SKU, product ID, or inventory code — and the tool outputs a barcode you can download and print on labels, packaging, or shelf tags.</p>
|
||||
<p>A barcode generator is a tool that turns a number or text string into a scannable barcode image. You enter a value - a SKU, product ID, or inventory code - and the tool outputs a barcode you can download and print on labels, packaging, or shelf tags.</p>
|
||||
<p>QR Master includes a free <a href="/tools/barcode-generator">barcode generator</a> that supports the most common formats used in retail and inventory management: EAN-13, UPC-A, and Code 128. No account required, no watermarks.</p>
|
||||
|
||||
<h2>Supported Barcode Formats</h2>
|
||||
<ul>
|
||||
<li><strong>EAN-13</strong> — The global standard for retail products. Used on nearly every consumer product sold outside North America. Requires a 13-digit number.</li>
|
||||
<li><strong>UPC-A</strong> — The North American retail standard. 12 digits. Used by Amazon, Walmart, Target, and most US/Canada retail systems.</li>
|
||||
<li><strong>Code 128</strong> — The most flexible format. Supports letters and numbers. Ideal for internal inventory codes, warehouse labels, and shipping references.</li>
|
||||
<li><strong>EAN-13</strong> - The global standard for retail products. Used on nearly every consumer product sold outside North America. Requires a 13-digit number.</li>
|
||||
<li><strong>UPC-A</strong> - The North American retail standard. 12 digits. Used by Amazon, Walmart, Target, and most US/Canada retail systems.</li>
|
||||
<li><strong>Code 128</strong> - The most flexible format. Supports letters and numbers. Ideal for internal inventory codes, warehouse labels, and shipping references.</li>
|
||||
</ul>
|
||||
|
||||
<h2>How to Create a Barcode</h2>
|
||||
@@ -1485,11 +1485,11 @@ export const blogPosts: BlogPost[] = [
|
||||
<li><strong>Barcode:</strong> product SKU, warehouse shelf, retail checkout, inventory count</li>
|
||||
<li><strong>QR code:</strong> restaurant menu, review page, product setup guide, marketing campaign</li>
|
||||
</ul>
|
||||
<p>If the QR code destination might change after printing, use a <a href="/dynamic-qr-code-generator">dynamic QR code</a> — the printed code stays the same, but you can update the link at any time.</p>
|
||||
<p>If the QR code destination might change after printing, use a <a href="/dynamic-qr-code-generator">dynamic QR code</a> - the printed code stays the same, but you can update the link at any time.</p>
|
||||
|
||||
<h2>Printing Tips for Reliable Scanning</h2>
|
||||
<ul>
|
||||
<li>Use black bars on a white background — avoid colored barcodes unless tested</li>
|
||||
<li>Use black bars on a white background - avoid colored barcodes unless tested</li>
|
||||
<li>Print at 300 DPI or higher for physical labels</li>
|
||||
<li>Leave a quiet zone (blank margin) around the barcode of at least 10 bar widths</li>
|
||||
<li>Minimum recommended width: 25mm for EAN-13, 20mm for Code 128</li>
|
||||
@@ -1499,14 +1499,14 @@ export const blogPosts: BlogPost[] = [
|
||||
<h2>Use Cases</h2>
|
||||
<p>The most common uses for an online barcode generator include:</p>
|
||||
<ul>
|
||||
<li><strong>Product labels</strong> — give every SKU a scannable identity before retail listing</li>
|
||||
<li><strong>Inventory management</strong> — label storage bins, shelves, and stock items</li>
|
||||
<li><strong>eCommerce fulfillment</strong> — reduce packing errors by scanning products during order picking</li>
|
||||
<li><strong>Event tickets</strong> — generate unique codes per ticket for check-in scanning</li>
|
||||
<li><strong>Internal asset tracking</strong> — label equipment, tools, and office assets</li>
|
||||
<li><strong>Product labels</strong> - give every SKU a scannable identity before retail listing</li>
|
||||
<li><strong>Inventory management</strong> - label storage bins, shelves, and stock items</li>
|
||||
<li><strong>eCommerce fulfillment</strong> - reduce packing errors by scanning products during order picking</li>
|
||||
<li><strong>Event tickets</strong> - generate unique codes per ticket for check-in scanning</li>
|
||||
<li><strong>Internal asset tracking</strong> - label equipment, tools, and office assets</li>
|
||||
</ul>
|
||||
|
||||
<p>Ready to create your first barcode? Use the free <a href="/tools/barcode-generator">QR Master barcode generator</a> — no signup, instant download.</p>
|
||||
<p>Ready to create your first barcode? Use the free <a href="/tools/barcode-generator">QR Master barcode generator</a> - no signup, instant download.</p>
|
||||
</div>`,
|
||||
},
|
||||
|
||||
@@ -1573,7 +1573,7 @@ export const blogPosts: BlogPost[] = [
|
||||
{
|
||||
question: 'What size should a Spotify code be for print?',
|
||||
answer:
|
||||
'Aim for at least ~2–3 cm on flyers and ~4–6 cm on posters, then test scan distance.',
|
||||
'Aim for at least ~2-3 cm on flyers and ~4-6 cm on posters, then test scan distance.',
|
||||
},
|
||||
],
|
||||
|
||||
@@ -1589,11 +1589,11 @@ export const blogPosts: BlogPost[] = [
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<p>Spotify codes are one of the easiest ways to turn a real-world moment into a stream. This Spotify code generator guide shows you how Spotify codes work, how to create them, and how to use them strategically—whether you're an artist, a DJ, a venue, or a brand running campaigns.</p>
|
||||
<p>Spotify codes are one of the easiest ways to turn a real-world moment into a stream. This Spotify code generator guide shows you how Spotify codes work, how to create them, and how to use them strategically-whether you're an artist, a DJ, a venue, or a brand running campaigns.</p>
|
||||
<p>Unlike classic <a href="/blog/dynamic-vs-static-qr-codes">QR codes</a>, Spotify codes are designed specifically for Spotify and are highly recognizable. People know instantly what they are: "Scan this and play." That makes them perfect for posters, merch, event flyers, table tents, business cards, and social media.</p>
|
||||
|
||||
<h2>What is a Spotify Code?</h2>
|
||||
<p>A Spotify code is a scannable Spotify identifier for a song, album, playlist, artist profile, or podcast episode. When someone scans it in the Spotify app, they jump straight to the content—no searching, no typing.</p>
|
||||
<p>A Spotify code is a scannable Spotify identifier for a song, album, playlist, artist profile, or podcast episode. When someone scans it in the Spotify app, they jump straight to the content-no searching, no typing.</p>
|
||||
<p>Spotify codes usually look like a soundwave-style barcode under a Spotify URI or link. They are fast, simple, and shareable.</p>
|
||||
|
||||
<h2>What can you create Spotify codes for?</h2>
|
||||
@@ -1653,7 +1653,7 @@ export const blogPosts: BlogPost[] = [
|
||||
slug: 'whatsapp-qr-code-generator',
|
||||
title: 'WhatsApp QR Code: Direct Chat Link Guide',
|
||||
description:
|
||||
'WhatsApp QR Code: generate a QR that opens a direct WhatsApp chat (wa.me). Perfect for SMBs—plus tracking, UTMs, and best practices.',
|
||||
'WhatsApp QR Code: generate a QR that opens a direct WhatsApp chat (wa.me). Perfect for SMBs-plus tracking, UTMs, and best practices.',
|
||||
excerpt:
|
||||
'Make it ridiculously easy for customers to contact you. Create a WhatsApp QR code that opens a direct chat with a pre-filled message when scanned.',
|
||||
category: 'Social Media',
|
||||
@@ -1705,7 +1705,7 @@ export const blogPosts: BlogPost[] = [
|
||||
{
|
||||
question: 'Can I track how many people scanned my WhatsApp QR?',
|
||||
answer:
|
||||
'Yes—use a dynamic/trackable QR code or route through a landing page with UTMs.',
|
||||
'Yes-use a dynamic/trackable QR code or route through a landing page with UTMs.',
|
||||
},
|
||||
{
|
||||
question: "What's the best placement for a WhatsApp QR code?",
|
||||
@@ -1743,10 +1743,10 @@ export const blogPosts: BlogPost[] = [
|
||||
</div>
|
||||
|
||||
<p>If your goal is "make it ridiculously easy for customers to contact me," then <strong>WhatsApp QR Code erstellen</strong> is one of the highest-intent moves you can make.</p>
|
||||
<p>A WhatsApp QR code can open a direct chat instantly—no typing phone numbers, no searching contacts. Customers scan, WhatsApp opens, and your conversation starts. This is perfect for restaurants, salons, gyms, real estate, events, local services, and B2B sales.</p>
|
||||
<p>A WhatsApp QR code can open a direct chat instantly-no typing phone numbers, no searching contacts. Customers scan, WhatsApp opens, and your conversation starts. This is perfect for restaurants, salons, gyms, real estate, events, local services, and B2B sales.</p>
|
||||
|
||||
<h2>What is a WhatsApp QR Code?</h2>
|
||||
<p>A WhatsApp QR code is a QR code that links to a WhatsApp action—usually:</p>
|
||||
<p>A WhatsApp QR code is a QR code that links to a WhatsApp action-usually:</p>
|
||||
<ul>
|
||||
<li>Open a chat with a specific number</li>
|
||||
<li>Open a chat with a prefilled message</li>
|
||||
@@ -1850,7 +1850,7 @@ export const blogPosts: BlogPost[] = [
|
||||
{
|
||||
question: 'Can I track Instagram QR scans in GA4?',
|
||||
answer:
|
||||
'Yes—use UTMs on the destination URL or route through a landing page.',
|
||||
'Yes-use UTMs on the destination URL or route through a landing page.',
|
||||
},
|
||||
{
|
||||
question: 'Do Instagram QR codes open the app automatically?',
|
||||
@@ -1865,7 +1865,7 @@ export const blogPosts: BlogPost[] = [
|
||||
{
|
||||
question: 'What QR size should I use on print?',
|
||||
answer:
|
||||
'Business cards ~2–3 cm; posters larger. Always test scan distance.',
|
||||
'Business cards ~2-3 cm; posters larger. Always test scan distance.',
|
||||
},
|
||||
],
|
||||
|
||||
@@ -1881,7 +1881,7 @@ export const blogPosts: BlogPost[] = [
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<p>An <strong>Instagram QR code generator</strong> helps you turn offline attention into followers. People see your brand in real life—on packaging, posters, menus, business cards, or at events—and with one scan they land on your Instagram profile.</p>
|
||||
<p>An <strong>Instagram QR code generator</strong> helps you turn offline attention into followers. People see your brand in real life-on packaging, posters, menus, business cards, or at events-and with one scan they land on your Instagram profile.</p>
|
||||
<p>If you're doing local marketing, events, creator collabs, or retail, this is one of the simplest growth levers you can deploy. But to do it properly, you want two things: a clean, fast QR that opens your profile, and a way to measure performance.</p>
|
||||
|
||||
<h2>What is an Instagram QR code?</h2>
|
||||
@@ -2005,7 +2005,7 @@ export const blogPosts: BlogPost[] = [
|
||||
{
|
||||
question: 'What are trackable QR codes?',
|
||||
answer:
|
||||
'QR codes that log scan events (count, time, device, etc.)—often via a redirect (dynamic QR).',
|
||||
'QR codes that log scan events (count, time, device, etc.)-often via a redirect (dynamic QR).',
|
||||
},
|
||||
{
|
||||
question: 'Are trackable QR codes the same as dynamic QR codes?',
|
||||
@@ -2015,7 +2015,7 @@ export const blogPosts: BlogPost[] = [
|
||||
{
|
||||
question: 'Can I track conversions, not just scans?',
|
||||
answer:
|
||||
'Yes—use UTMs + GA4 + a landing page to measure signups/purchases.',
|
||||
'Yes-use UTMs + GA4 + a landing page to measure signups/purchases.',
|
||||
},
|
||||
{
|
||||
question: 'Do trackable QR codes scan slower?',
|
||||
@@ -2024,7 +2024,7 @@ export const blogPosts: BlogPost[] = [
|
||||
},
|
||||
{
|
||||
question: 'Can I update the destination later?',
|
||||
answer: "Yes—if it's dynamic.",
|
||||
answer: "Yes-if it's dynamic.",
|
||||
},
|
||||
],
|
||||
|
||||
@@ -2227,7 +2227,7 @@ export const blogPosts: BlogPost[] = [
|
||||
},
|
||||
{
|
||||
question: 'Do UTMs work if the QR goes directly to a website?',
|
||||
answer: 'Yes—GA4 captures them on landing.',
|
||||
answer: 'Yes-GA4 captures them on landing.',
|
||||
},
|
||||
{
|
||||
question: 'How do I track different poster locations?',
|
||||
@@ -2237,7 +2237,7 @@ export const blogPosts: BlogPost[] = [
|
||||
{
|
||||
question: 'Should I use "print" or "qr" as utm_medium?',
|
||||
answer:
|
||||
'Either works—pick one and stay consistent across all campaigns.',
|
||||
'Either works-pick one and stay consistent across all campaigns.',
|
||||
},
|
||||
{
|
||||
question: "What's the best GA4 report for QR UTMs?",
|
||||
@@ -2279,7 +2279,7 @@ export const blogPosts: BlogPost[] = [
|
||||
</div>
|
||||
|
||||
<h2>UTM Parameters with QR Codes: How to Track Offline Scans in GA4</h2>
|
||||
<p>QR codes are amazing for offline-to-online marketing—but without tracking, you're basically guessing. According to <a href="https://bitly.com/blog/qr-code-statistics/" target="_blank" rel="noopener noreferrer"><cite>Bitly's 2026 QR Code Statistics</cite></a>, campaigns with proper tracking parameters can see <strong>significantly higher engagement and conversion rates</strong> by enabling data-driven optimization. That's where <strong>UTM parameters with QR codes</strong> come in. UTMs are simple tags you add to a URL so that Google Analytics 4 (GA4) can tell you exactly where the traffic came from.</p>
|
||||
<p>QR codes are amazing for offline-to-online marketing-but without tracking, you're basically guessing. According to <a href="https://bitly.com/blog/qr-code-statistics/" target="_blank" rel="noopener noreferrer"><cite>Bitly's 2026 QR Code Statistics</cite></a>, campaigns with proper tracking parameters can see <strong>significantly higher engagement and conversion rates</strong> by enabling data-driven optimization. That's where <strong>UTM parameters with QR codes</strong> come in. UTMs are simple tags you add to a URL so that Google Analytics 4 (GA4) can tell you exactly where the traffic came from.</p>
|
||||
|
||||
<p>If you run posters, flyers, menus, business cards, packaging inserts, or event banners, UTMs let you answer questions like:</p>
|
||||
<ul>
|
||||
@@ -2460,7 +2460,7 @@ export const blogPosts: BlogPost[] = [
|
||||
description:
|
||||
'QR code scan statistics 2026: key trends, adoption, and marketing insights. Use these stats to plan campaigns, tracking, and ROI.',
|
||||
excerpt:
|
||||
"QR code scan statistics 2026 content is an authority builder. Marketers, founders, agencies, and journalists love numbers—especially when they're connected to actionable strategy.",
|
||||
"QR code scan statistics 2026 content is an authority builder. Marketers, founders, agencies, and journalists love numbers-especially when they're connected to actionable strategy.",
|
||||
category: 'Insights',
|
||||
pillar: 'basics',
|
||||
published: true,
|
||||
@@ -2511,7 +2511,7 @@ export const blogPosts: BlogPost[] = [
|
||||
},
|
||||
{
|
||||
question: 'Are scan counts enough to measure ROI?',
|
||||
answer: 'No—track conversions using UTMs + analytics.',
|
||||
answer: 'No-track conversions using UTMs + analytics.',
|
||||
},
|
||||
{
|
||||
question: "What's the best way to make a stats post link-worthy?",
|
||||
@@ -2560,7 +2560,7 @@ export const blogPosts: BlogPost[] = [
|
||||
<h2>QR Code Scan Statistics 2026: The Trends Marketers Should Know</h2>
|
||||
<p>This article is designed to be updated yearly. The main goal isn't just to list statistics, but to translate them into what to do next: placements, tracking, conversion tactics, and campaign planning.</p>
|
||||
|
||||
<p><em>Note: I'm not browsing live sources inside this chat. Before publishing, pull 5–10 fresh stats from reliable reports (e.g., Statista, GS1, camera/OS adoption reports, marketing research firms) and replace the placeholder sections below with your numbers + citations.</em></p>
|
||||
<p><em>Note: I'm not browsing live sources inside this chat. Before publishing, pull 5-10 fresh stats from reliable reports (e.g., Statista, GS1, camera/OS adoption reports, marketing research firms) and replace the placeholder sections below with your numbers + citations.</em></p>
|
||||
|
||||
<h2>Why QR code statistics matter</h2>
|
||||
<p>QR codes sit at the intersection of:</p>
|
||||
@@ -2695,7 +2695,7 @@ export const blogPosts: BlogPost[] = [
|
||||
'event marketing QR',
|
||||
],
|
||||
quickAnswer:
|
||||
'<p>The best event QR setup uses <strong>3–5 distinct codes</strong>: one for operations (check-in/tickets), one for utility (agenda/map), and trackable codes for marketing (banners, flyers). Always use <strong>dynamic QR codes</strong> for printed materials so you can update the schedule or offers last-minute.</p>',
|
||||
'<p>The best event QR setup uses <strong>3-5 distinct codes</strong>: one for operations (check-in/tickets), one for utility (agenda/map), and trackable codes for marketing (banners, flyers). Always use <strong>dynamic QR codes</strong> for printed materials so you can update the schedule or offers last-minute.</p>',
|
||||
keySteps: [
|
||||
'Use dedicated unique QR codes for ticketing (secure validation).',
|
||||
"Place 'Check-in' QRs at the entrance to reduce queues.",
|
||||
@@ -2712,7 +2712,7 @@ export const blogPosts: BlogPost[] = [
|
||||
{
|
||||
question: 'Should I use one QR code or multiple at an event?',
|
||||
answer:
|
||||
'Multiple—separate QRs per goal and placement (entrance vs booth vs flyers).',
|
||||
'Multiple-separate QRs per goal and placement (entrance vs booth vs flyers).',
|
||||
},
|
||||
{
|
||||
question: 'How do I track which event placement performed best?',
|
||||
@@ -2722,7 +2722,7 @@ export const blogPosts: BlogPost[] = [
|
||||
{
|
||||
question: 'What size should event QR codes be?',
|
||||
answer:
|
||||
'Bigger than you think—people scan from distance. Test on-site before printing.',
|
||||
'Bigger than you think-people scan from distance. Test on-site before printing.',
|
||||
},
|
||||
{
|
||||
question:
|
||||
@@ -2775,7 +2775,7 @@ export const blogPosts: BlogPost[] = [
|
||||
<li>claim discounts</li>
|
||||
<li>leave feedback</li>
|
||||
</ul>
|
||||
<p>This guide shows how to use event QR codes for both operations and marketing—with tracking so you can measure what actually worked.</p>
|
||||
<p>This guide shows how to use event QR codes for both operations and marketing-with tracking so you can measure what actually worked.</p>
|
||||
|
||||
<h2>1) Core event QR use cases</h2>
|
||||
|
||||
@@ -2862,7 +2862,7 @@ export const blogPosts: BlogPost[] = [
|
||||
<p>Internal link: <a href="/blog/qr-code-print-size-guide">Print Size</a>.</p>
|
||||
|
||||
<h2>5) The "perfect" event QR setup (simple blueprint)</h2>
|
||||
<p>Use 3–5 QR codes max:</p>
|
||||
<p>Use 3-5 QR codes max:</p>
|
||||
<ul>
|
||||
<li>Check-in QR (operational)</li>
|
||||
<li>Schedule/Map QR (utility)</li>
|
||||
@@ -2887,7 +2887,7 @@ export const blogPosts: BlogPost[] = [
|
||||
slug: 'business-card-qr-code',
|
||||
title: 'Business Card QR Codes: Design & Best Practices',
|
||||
description:
|
||||
'Not just a vCard—learn how to design and place QR codes on physical business cards effectively. Size, color, and CTA tips.',
|
||||
'Not just a vCard-learn how to design and place QR codes on physical business cards effectively. Size, color, and CTA tips.',
|
||||
excerpt:
|
||||
'Modernize your business card. Learn the design rules for adding a QR code without ruining the aesthetic. Spacing, size, and CTA guide.',
|
||||
category: 'Business Cards',
|
||||
@@ -2925,7 +2925,7 @@ export const blogPosts: BlogPost[] = [
|
||||
},
|
||||
{
|
||||
question: 'What size should a QR code be on a business card?',
|
||||
answer: 'Roughly 2–3 cm wide; test with iPhone and Android.',
|
||||
answer: 'Roughly 2-3 cm wide; test with iPhone and Android.',
|
||||
},
|
||||
{
|
||||
question: 'Should I use a <a href="/dynamic-qr-code-generator" class="text-blue-600 underline font-semibold">dynamic QR code</a> on a business card?',
|
||||
@@ -2938,7 +2938,7 @@ export const blogPosts: BlogPost[] = [
|
||||
},
|
||||
{
|
||||
question: 'Can I track business card scans?',
|
||||
answer: 'Yes—use a trackable dynamic QR or a landing page with UTMs.',
|
||||
answer: 'Yes-use a trackable dynamic QR or a landing page with UTMs.',
|
||||
},
|
||||
],
|
||||
relatedSlugs: [
|
||||
@@ -2974,7 +2974,7 @@ export const blogPosts: BlogPost[] = [
|
||||
</div>
|
||||
|
||||
<h2>Business Card QR Codes: The Modern Networking Tool</h2>
|
||||
<p>Business cards haven't disappeared—they've evolved. According to <a href="https://bitly.com/blog/qr-code-statistics/" target="_blank" rel="noopener noreferrer"><cite>Bitly's research on digital business cards</cite></a>, adding a QR code to your physical business card increases engagement by 40% compared to cards without codes. The QR code bridges paper and digital, allowing instant contact saving, portfolio access, or booking with a single scan.</p>
|
||||
<p>Business cards haven't disappeared-they've evolved. According to <a href="https://bitly.com/blog/qr-code-statistics/" target="_blank" rel="noopener noreferrer"><cite>Bitly's research on digital business cards</cite></a>, adding a QR code to your physical business card increases engagement by 40% compared to cards without codes. The QR code bridges paper and digital, allowing instant contact saving, portfolio access, or booking with a single scan.</p>
|
||||
|
||||
<h2>Design Tips</h2>
|
||||
<p>Place the QR code on the back of the card or in a clean corner. Ensure it is at least 2cm (0.8 inches) wide for reliable scanning at normal viewing distance. Add a clear CTA like "Scan to save contact" to encourage action.</p></div>`,
|
||||
@@ -3081,7 +3081,7 @@ export const blogPosts: BlogPost[] = [
|
||||
</div>
|
||||
|
||||
<h2>QR Code Marketing: How to Run Campaigns You Can Measure</h2>
|
||||
<p>QR code marketing is no longer a gimmick. In 2026 it's a serious performance channel — if you treat it like one. According to <a href="https://www.mordorintelligence.com/industry-reports/qr-codes-market" target="_blank" rel="noopener noreferrer"><cite>Mordor Intelligence's market analysis</cite></a>, QR code marketing adoption continues to accelerate. The difference between a QR code that "looks nice" and a QR code that generates real revenue is simple: strategy + tracking.</p>
|
||||
<p>QR code marketing is no longer a gimmick. In 2026 it's a serious performance channel - if you treat it like one. According to <a href="https://www.mordorintelligence.com/industry-reports/qr-codes-market" target="_blank" rel="noopener noreferrer"><cite>Mordor Intelligence's market analysis</cite></a>, QR code marketing adoption continues to accelerate. The difference between a QR code that "looks nice" and a QR code that generates real revenue is simple: strategy + tracking.</p>
|
||||
|
||||
<p>A QR code is just a bridge. The marketing happens in the details:</p>
|
||||
<ul>
|
||||
@@ -3090,7 +3090,7 @@ export const blogPosts: BlogPost[] = [
|
||||
<li>What page opens after the scan (and how fast it loads)</li>
|
||||
<li>How you measure results (so you can optimize instead of guessing)</li>
|
||||
</ul>
|
||||
<p>This guide gives you a complete framework for QR code marketing — from campaign design to attribution.</p>
|
||||
<p>This guide gives you a complete framework for QR code marketing - from campaign design to attribution.</p>
|
||||
|
||||
<h2>1) The core QR code marketing loop</h2>
|
||||
<p>Think in four steps:</p>
|
||||
@@ -3161,7 +3161,7 @@ export const blogPosts: BlogPost[] = [
|
||||
<li>fix mistakes instantly</li>
|
||||
<li>track scans per placement</li>
|
||||
</ul>
|
||||
<p>Static QR codes are fine for evergreen pages (like "About"), but campaigns change — offers end, pages get updated, links break.</p>
|
||||
<p>Static QR codes are fine for evergreen pages (like "About"), but campaigns change - offers end, pages get updated, links break.</p>
|
||||
<p>Internal link: <a href="/blog/dynamic-vs-static-qr-codes">Dynamic vs Static</a>.</p>
|
||||
|
||||
<h2>5) Tracking: scans are not enough</h2>
|
||||
@@ -3211,7 +3211,7 @@ export const blogPosts: BlogPost[] = [
|
||||
</ul>
|
||||
|
||||
<h2>Wrap-up</h2>
|
||||
<p>QR code marketing works when you combine a great offer with trackable execution. Treat QR like a measurable channel — dynamic codes, UTMs, conversion tracking, and clear CTAs — and you'll get campaigns that improve over time instead of staying "a nice poster."</p>
|
||||
<p>QR code marketing works when you combine a great offer with trackable execution. Treat QR like a measurable channel - dynamic codes, UTMs, conversion tracking, and clear CTAs - and you'll get campaigns that improve over time instead of staying "a nice poster."</p>
|
||||
</div>`,
|
||||
},
|
||||
|
||||
@@ -3260,7 +3260,7 @@ export const blogPosts: BlogPost[] = [
|
||||
{
|
||||
question: 'What is quishing?',
|
||||
answer:
|
||||
'QR phishing—scammers use QR codes to send users to fake login/payment pages.',
|
||||
'QR phishing-scammers use QR codes to send users to fake login/payment pages.',
|
||||
},
|
||||
{
|
||||
question: 'How can users protect themselves from malicious QR codes?',
|
||||
@@ -3275,7 +3275,7 @@ export const blogPosts: BlogPost[] = [
|
||||
{
|
||||
question: 'Are QR codes inherently unsafe?',
|
||||
answer:
|
||||
'No—risk comes from the destination link. Good practices reduce risk significantly.',
|
||||
'No-risk comes from the destination link. Good practices reduce risk significantly.',
|
||||
},
|
||||
{
|
||||
question: 'Does QR tracking violate privacy/GDPR?',
|
||||
@@ -3409,7 +3409,7 @@ export const blogPosts: BlogPost[] = [
|
||||
<p>For B2B trust, transparency beats "secret tracking." See our <a href="/blog/qr-code-analytics">Analytics Guide</a> for more on ethical tracking.</p>
|
||||
|
||||
<h2>Wrap-up</h2>
|
||||
<p>QR code security is no longer optional. Quishing attacks exploit the fact that QR codes hide their destination until after scanning. By using branded links, testing placements, adding transparent messaging, and following basic security hygiene, you protect users — and your QR brand becomes the trusted option.</p>
|
||||
<p>QR code security is no longer optional. Quishing attacks exploit the fact that QR codes hide their destination until after scanning. By using branded links, testing placements, adding transparent messaging, and following basic security hygiene, you protect users - and your QR brand becomes the trusted option.</p>
|
||||
</div>`,
|
||||
},
|
||||
|
||||
@@ -3463,7 +3463,7 @@ export const blogPosts: BlogPost[] = [
|
||||
},
|
||||
{
|
||||
question: 'Can I update a QR destination via API?',
|
||||
answer: 'Yes—dynamic QR codes support updating without reprinting.',
|
||||
answer: 'Yes-dynamic QR codes support updating without reprinting.',
|
||||
},
|
||||
{
|
||||
question: 'Does the API support bulk creation?',
|
||||
@@ -3515,7 +3515,7 @@ export const blogPosts: BlogPost[] = [
|
||||
</div>
|
||||
|
||||
<h2>QR Code API Documentation: Generate, Manage, and <a href="/qr-code-tracking" class="text-blue-600 underline font-semibold">Track QR Codes</a></h2>
|
||||
<p>A QR code API allows you to generate and manage QR codes programmatically — ideal for SaaS platforms, ticketing systems, CRMs, packaging workflows, and bulk marketing campaigns. According to <a href="https://restfulapi.net/" target="_blank" rel="noopener noreferrer"><cite>REST API Best Practices documentation</cite></a>, a well-designed API is essential for seamless integration. Instead of creating QR codes manually, you can generate thousands of codes via requests, attach them to database records, and update destinations when campaigns change.</p>
|
||||
<p>A QR code API allows you to generate and manage QR codes programmatically - ideal for SaaS platforms, ticketing systems, CRMs, packaging workflows, and bulk marketing campaigns. According to <a href="https://restfulapi.net/" target="_blank" rel="noopener noreferrer"><cite>REST API Best Practices documentation</cite></a>, a well-designed API is essential for seamless integration. Instead of creating QR codes manually, you can generate thousands of codes via requests, attach them to database records, and update destinations when campaigns change.</p>
|
||||
|
||||
<p>This "docs light" page is designed to explain the API concepts: clear use cases, standard endpoints, and example flows.</p>
|
||||
|
||||
@@ -3712,7 +3712,7 @@ Authorization: Bearer YOUR_API_KEY</code></pre>
|
||||
{
|
||||
question: 'Can free QR codes stop working?',
|
||||
answer:
|
||||
'Static codes won\'t "expire," but the destination can change or break—then you must reprint.',
|
||||
'Static codes won\'t "expire," but the destination can change or break-then you must reprint.',
|
||||
},
|
||||
{
|
||||
question: 'When should I upgrade to paid?',
|
||||
@@ -3760,7 +3760,7 @@ Authorization: Bearer YOUR_API_KEY</code></pre>
|
||||
<h2>Free vs Paid QR Code Generator: When to Upgrade and Why</h2>
|
||||
<p>Choosing between a free vs paid QR code generator depends on what happens after you print or publish the code. According to <a href="https://bitly.com/blog/qr-code-statistics/" target="_blank" rel="noopener noreferrer"><cite>Bitly's business adoption research</cite></a>, 87% of businesses using QR codes in campaigns require dynamic capabilities and tracking. If your QR code is permanent and you don't care about tracking, free tools can be enough. But if you run campaigns, need analytics, or want the flexibility to change the destination later, paid tools usually win.</p>
|
||||
|
||||
<p>This guide breaks down the real differences so you can decide fast — and avoid the most expensive mistake in QR: printing a QR code you can't change.</p>
|
||||
<p>This guide breaks down the real differences so you can decide fast - and avoid the most expensive mistake in QR: printing a QR code you can't change.</p>
|
||||
|
||||
<h2>The biggest difference: static vs dynamic</h2>
|
||||
<p>Most free generators create static QR codes:</p>
|
||||
@@ -3840,7 +3840,7 @@ Authorization: Bearer YOUR_API_KEY</code></pre>
|
||||
</ul>
|
||||
|
||||
<h2>The hidden cost: reprinting</h2>
|
||||
<p>The real cost isn't the subscription — it's reprinting.</p>
|
||||
<p>The real cost isn't the subscription - it's reprinting.</p>
|
||||
<p>If you print 5,000 flyers with a static QR and then:</p>
|
||||
<ul>
|
||||
<li>the landing page changes</li>
|
||||
@@ -3865,7 +3865,7 @@ Authorization: Bearer YOUR_API_KEY</code></pre>
|
||||
<p>Internal link: <a href="/pricing">Pricing</a>.</p>
|
||||
|
||||
<h2>Wrap-up</h2>
|
||||
<p>The free vs paid QR code generator decision is mostly about control. Free tools work for simple static use. Paid tools win for dynamic, trackable, business-grade campaigns — where one broken QR can cost more than a year of subscription.</p>
|
||||
<p>The free vs paid QR code generator decision is mostly about control. Free tools work for simple static use. Paid tools win for dynamic, trackable, business-grade campaigns - where one broken QR can cost more than a year of subscription.</p>
|
||||
</div>`,
|
||||
},
|
||||
|
||||
@@ -3898,7 +3898,7 @@ Authorization: Bearer YOUR_API_KEY</code></pre>
|
||||
'free qr code generator',
|
||||
],
|
||||
quickAnswer:
|
||||
'<p><strong>QR Master</strong> is the best free QR code generator in 2026 for businesses needing vector exports (SVG/EPS), UTM tracking for GA4, and no scan limits. Unlike competitors, it offers truly free dynamic QR codes with full analytics—no credit card required.</p>',
|
||||
'<p><strong>QR Master</strong> is the best free QR code generator in 2026 for businesses needing vector exports (SVG/EPS), UTM tracking for GA4, and no scan limits. Unlike competitors, it offers truly free dynamic QR codes with full analytics-no credit card required.</p>',
|
||||
keySteps: [
|
||||
'Check for Dynamic QR support (essential for editing later).',
|
||||
'Verify tracking capabilities (scans, location, devices).',
|
||||
@@ -3915,7 +3915,7 @@ Authorization: Bearer YOUR_API_KEY</code></pre>
|
||||
{
|
||||
question: 'Is there a truly free QR code generator with tracking?',
|
||||
answer:
|
||||
'Yes. <strong>QR Master</strong> offers free dynamic QR codes with unlimited scans, UTM parameters for GA4, and real-time analytics—no credit card required.',
|
||||
'Yes. <strong>QR Master</strong> offers free dynamic QR codes with unlimited scans, UTM parameters for GA4, and real-time analytics-no credit card required.',
|
||||
},
|
||||
{
|
||||
question: "What's the best QR code format for print?",
|
||||
@@ -3930,7 +3930,7 @@ Authorization: Bearer YOUR_API_KEY</code></pre>
|
||||
{
|
||||
question: 'Is the best generator the one with the most design options?',
|
||||
answer:
|
||||
'Not necessarily—tracking and reliability usually matter more for business.',
|
||||
'Not necessarily-tracking and reliability usually matter more for business.',
|
||||
},
|
||||
{
|
||||
question: 'Do I need an API?',
|
||||
@@ -3978,13 +3978,13 @@ Authorization: Bearer YOUR_API_KEY</code></pre>
|
||||
|
||||
<div class="bg-green-50 border border-green-200 rounded-xl p-5 mb-8">
|
||||
<p class="font-semibold text-green-900 mt-0 mb-1">Bottom line up front</p>
|
||||
<p class="text-green-800 mb-0"><strong>QR Master</strong> is the best free option for businesses in 2026 — free dynamic QR codes, real scan analytics, SVG export, and no scan limits. No credit card required. <a href="/create" class="text-green-700 underline font-semibold">Try it free →</a></p>
|
||||
<p class="text-green-800 mb-0"><strong>QR Master</strong> is the best free option for businesses in 2026 - free dynamic QR codes, real scan analytics, SVG export, and no scan limits. No credit card required. <a href="/create" class="text-green-700 underline font-semibold">Try it free →</a></p>
|
||||
</div>
|
||||
|
||||
<h2>Best QR Code Generator 2026: How to Choose the Right Tool</h2>
|
||||
<p>The best QR code generator in 2026 depends on one thing: what you need the QR code to do after it's printed. For casual use, almost any generator works. For marketing and business, the best tools share a core set of capabilities: dynamic QR codes, tracking, reliable redirects, branding, and management features.</p>
|
||||
|
||||
<p>This guide gives you a side-by-side comparison of the top tools and a practical checklist — so you can pick the right one for your exact use case without having to sign up for five free trials first.</p>
|
||||
<p>This guide gives you a side-by-side comparison of the top tools and a practical checklist - so you can pick the right one for your exact use case without having to sign up for five free trials first.</p>
|
||||
|
||||
<p>According to <a href="https://www.statista.com/topics/1476/qr-codes/">Statista</a>, approx. <strong>45% of shoppers</strong> scanned a QR code in the past month, while QR code generation jumped <strong>238%</strong> from 2021-2023 (Uniqode). With this explosive growth, choosing the right generator is more important than ever.</p>
|
||||
|
||||
@@ -4078,7 +4078,7 @@ Authorization: Bearer YOUR_API_KEY</code></pre>
|
||||
<p>Internal link: <a href="/blog/qr-code-api-documentation">QR Code API</a>.</p>
|
||||
|
||||
<h3>If you only need a simple static QR</h3>
|
||||
<p>You can use a free generator and keep it simple — but accept that you can't edit it later.</p>
|
||||
<p>You can use a free generator and keep it simple - but accept that you can't edit it later.</p>
|
||||
<p>Internal link: <a href="/blog/free-vs-paid-qr-generator">Free vs Paid</a>.</p>
|
||||
|
||||
<h2>2) The 2026 checklist: what "best" really means</h2>
|
||||
@@ -4130,7 +4130,7 @@ Authorization: Bearer YOUR_API_KEY</code></pre>
|
||||
<p>If you need programmatic creation and updates, choose a provider that clearly documents API capabilities for dynamic QR codes and tracking.</p>
|
||||
|
||||
<h3>Best for "free but serious"</h3>
|
||||
<p>If you only need static codes, free tools can work — but always check resolution, usage rights, and whether the destination will never change. Zapier's guide mentions both business-focused and more design-focused options.</p>
|
||||
<p>If you only need static codes, free tools can work - but always check resolution, usage rights, and whether the destination will never change. Zapier's guide mentions both business-focused and more design-focused options.</p>
|
||||
|
||||
<h2>4) The "best generator" trap to avoid</h2>
|
||||
<p>The biggest mistake is selecting based on:</p>
|
||||
@@ -4164,7 +4164,7 @@ Authorization: Bearer YOUR_API_KEY</code></pre>
|
||||
</ul>
|
||||
|
||||
<h2>Wrap-up</h2>
|
||||
<p>The best QR code generator 2026 is the one that matches your workflow: marketing attribution, design speed, API scalability, or simple static generation. Use the checklist above, choose by category, and you'll end up with a generator that fits your real use — not just a "top list."</p>
|
||||
<p>The best QR code generator 2026 is the one that matches your workflow: marketing attribution, design speed, API scalability, or simple static generation. Use the checklist above, choose by category, and you'll end up with a generator that fits your real use - not just a "top list."</p>
|
||||
</div>`,
|
||||
},
|
||||
];
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Centralized competitor data — single source of truth for all comparison pages.
|
||||
// Centralized competitor data - single source of truth for all comparison pages.
|
||||
// Update pricing/features here and it propagates to all competitor pages.
|
||||
|
||||
export type FeatureComparison = {
|
||||
@@ -31,9 +31,9 @@ export type CompetitorProfile = {
|
||||
};
|
||||
|
||||
export const qrMasterPricing = {
|
||||
free: '€0 — 3 active dynamic QR codes, unlimited static, basic tracking',
|
||||
pro: '€9/month (€90/year) — 50 dynamic QR codes, advanced analytics, custom branding',
|
||||
business: '€29/month (€290/year) — 500 dynamic QR codes, bulk creation up to 1,000, priority support',
|
||||
free: '€0 - 3 active dynamic QR codes, unlimited static, basic tracking',
|
||||
pro: '€9/month (€90/year) - 50 dynamic QR codes, advanced analytics, custom branding',
|
||||
business: '€29/month (€290/year) - 500 dynamic QR codes, bulk creation up to 1,000, priority support',
|
||||
};
|
||||
|
||||
export const competitors: Record<string, CompetitorProfile> = {
|
||||
@@ -45,12 +45,12 @@ export const competitors: Record<string, CompetitorProfile> = {
|
||||
targetAudience: 'General public, small businesses, first-time QR users',
|
||||
positioning: 'High-volume consumer QR generator marketed as easy and free',
|
||||
pricing: {
|
||||
free: 'Static QR only — dynamic QR codes deactivated after ~14-day trial',
|
||||
free: 'Static QR only - dynamic QR codes deactivated after ~14-day trial',
|
||||
starter: '~€8.99/month (billed annually) for basic dynamic QR',
|
||||
pro: '~€24.99/month (billed annually) for analytics + more codes',
|
||||
},
|
||||
strengths: [
|
||||
'High brand recognition — many people land here first',
|
||||
'High brand recognition - many people land here first',
|
||||
'Simple interface for first-time users',
|
||||
'Wide variety of QR types supported',
|
||||
'Large template library for QR styling',
|
||||
@@ -58,10 +58,10 @@ export const competitors: Record<string, CompetitorProfile> = {
|
||||
weaknesses: [
|
||||
'Dynamic QR codes are free only for ~14 days, then deactivated without warning',
|
||||
'Users who already printed materials are forced into expensive annual contracts',
|
||||
'Pricing is unclear upfront — trial period is not prominently disclosed',
|
||||
'Pricing is unclear upfront - trial period is not prominently disclosed',
|
||||
'Analytics require paid plan even for basic scan counts',
|
||||
'No bulk creation capability',
|
||||
'US-based servers — GDPR compliance not a priority',
|
||||
'US-based servers - GDPR compliance not a priority',
|
||||
],
|
||||
bestFor: [
|
||||
'One-off static QR code generation with no analytics needed',
|
||||
@@ -75,18 +75,18 @@ export const competitors: Record<string, CompetitorProfile> = {
|
||||
commonComplaints: [
|
||||
'"I printed 500 flyers and my QR code stopped working after 2 weeks"',
|
||||
'"Felt forced into an annual subscription I didn\'t understand I was signing up for"',
|
||||
'"The free dynamic QR is a trap — it gets deactivated right when you\'ve already distributed materials"',
|
||||
'"The free dynamic QR is a trap - it gets deactivated right when you\'ve already distributed materials"',
|
||||
'"No way to export or migrate codes if you want to leave"',
|
||||
],
|
||||
migrationNotes:
|
||||
'Static QR codes cannot be migrated — the destination is baked into the image. Dynamic QR codes need to be re-created. In QR Master, create new dynamic QR codes pointing to your same destinations. Then update your printed materials or digital placements to use the new codes. Static codes from QR Code Generator remain permanently valid even after you stop paying.',
|
||||
'Static QR codes cannot be migrated - the destination is baked into the image. Dynamic QR codes need to be re-created. In QR Master, create new dynamic QR codes pointing to your same destinations. Then update your printed materials or digital placements to use the new codes. Static codes from QR Code Generator remain permanently valid even after you stop paying.',
|
||||
features: [
|
||||
{ feature: 'Free static QR codes', qrMaster: true, competitor: true },
|
||||
{
|
||||
feature: 'Free dynamic QR codes (permanent)',
|
||||
qrMaster: '3 always-free',
|
||||
competitor: '~14-day trial then deactivated',
|
||||
note: 'QR Code Generator deactivates dynamic codes after trial — even if already printed',
|
||||
note: 'QR Code Generator deactivates dynamic codes after trial - even if already printed',
|
||||
},
|
||||
{ feature: 'Transparent pricing upfront', qrMaster: true, competitor: false },
|
||||
{ feature: 'Scan analytics', qrMaster: 'All plans', competitor: 'Paid only' },
|
||||
@@ -110,23 +110,23 @@ export const competitors: Record<string, CompetitorProfile> = {
|
||||
targetAudience: 'Brands, marketers, enterprise design teams',
|
||||
positioning: 'Premium-branded QR code platform emphasizing aesthetics and design',
|
||||
pricing: {
|
||||
free: 'Free — limited codes, Flowcode branding on every QR, interstitial pages on scans',
|
||||
free: 'Free - limited codes, Flowcode branding on every QR, interstitial pages on scans',
|
||||
starter: '~$15/month for basic white-label',
|
||||
pro: '~$49/month for team features and full branding removal',
|
||||
enterprise: 'Custom pricing for large teams',
|
||||
},
|
||||
strengths: [
|
||||
'Exceptional QR design options — rounded, branded styles that stand out',
|
||||
'Exceptional QR design options - rounded, branded styles that stand out',
|
||||
'Strong brand recognition in the US market',
|
||||
'Good enterprise team management features',
|
||||
'Analytics dashboard is well-designed',
|
||||
],
|
||||
weaknesses: [
|
||||
'Free tier forces Flowcode logo onto every QR code — your brand takes second place',
|
||||
'Free tier forces Flowcode logo onto every QR code - your brand takes second place',
|
||||
'Interstitial pages on free tier send scanners through a Flowcode-branded page, stealing attention and analytics',
|
||||
'White-label and clean QR design requires jumping to expensive paid plans',
|
||||
'No bulk QR creation even on paid plans',
|
||||
'US company — GDPR compliance not built in',
|
||||
'US company - GDPR compliance not built in',
|
||||
'Pricing escalates quickly for teams',
|
||||
],
|
||||
bestFor: [
|
||||
@@ -142,12 +142,12 @@ export const competitors: Record<string, CompetitorProfile> = {
|
||||
],
|
||||
commonComplaints: [
|
||||
'"The free QR codes have Flowcode\'s logo on them, not mine"',
|
||||
'"When customers scan my QR, they see a Flowcode page first — I lose control of the experience"',
|
||||
'"When customers scan my QR, they see a Flowcode page first - I lose control of the experience"',
|
||||
'"Had to upgrade to $49/month just to get a clean QR code without their branding"',
|
||||
'"No way to create QR codes in bulk even on paid plans"',
|
||||
],
|
||||
migrationNotes:
|
||||
'Flowcode does not provide a bulk export tool. Each dynamic QR code needs to be re-created manually in QR Master. Since Flowcode uses its own redirect infrastructure, your printed QR codes pointing to Flowcode domains will stop working if you cancel — plan migration before canceling. In QR Master, new dynamic QR codes are generated immediately and redirect infrastructure is included in all plans.',
|
||||
'Flowcode does not provide a bulk export tool. Each dynamic QR code needs to be re-created manually in QR Master. Since Flowcode uses its own redirect infrastructure, your printed QR codes pointing to Flowcode domains will stop working if you cancel - plan migration before canceling. In QR Master, new dynamic QR codes are generated immediately and redirect infrastructure is included in all plans.',
|
||||
features: [
|
||||
{ feature: 'Free dynamic QR codes', qrMaster: '3 always-free', competitor: 'Limited, with branding' },
|
||||
{
|
||||
@@ -158,13 +158,14 @@ export const competitors: Record<string, CompetitorProfile> = {
|
||||
},
|
||||
{
|
||||
feature: 'No branded interstitial page on scan',
|
||||
qrMaster: 'Fast pass-through — no Flowcode-style marketing page',
|
||||
qrMaster: 'Fast pass-through - no Flowcode-style marketing page',
|
||||
competitor: 'Paid plans only',
|
||||
note: 'Flowcode free tier shows a branded splash page; QR Master redirects through qrmaster.net without any branded interstitial',
|
||||
},
|
||||
{ feature: 'GDPR-compliant analytics (hashed IPs)', qrMaster: true, competitor: false },
|
||||
{ feature: 'Bulk QR creation', qrMaster: 'Business plan (up to 1,000)', competitor: false },
|
||||
{ feature: 'Custom branding (your logo/colors)', qrMaster: 'Pro+', competitor: 'Paid plans' },
|
||||
{ feature: 'Brand colors', qrMaster: 'Free', competitor: 'Paid plans' },
|
||||
{ feature: 'Module shapes and logo', qrMaster: 'Pro+', competitor: 'Paid plans' },
|
||||
{ feature: 'Scan analytics', qrMaster: 'All plans', competitor: 'Paid plans' },
|
||||
{
|
||||
feature: 'Pro pricing',
|
||||
@@ -178,17 +179,17 @@ export const competitors: Record<string, CompetitorProfile> = {
|
||||
id: 'beaconstac',
|
||||
name: 'Uniqode (formerly Beaconstac)',
|
||||
url: 'https://www.uniqode.com',
|
||||
tagline: 'Enterprise QR platform — excellent for large orgs, overkill for SMBs',
|
||||
tagline: 'Enterprise QR platform - excellent for large orgs, overkill for SMBs',
|
||||
targetAudience: 'Enterprise companies, large agencies, compliance-heavy industries',
|
||||
positioning: 'Enterprise-grade QR code platform with SOC2 compliance, SSO, and deep API access',
|
||||
pricing: {
|
||||
free: 'No free plan — paid-only from the start',
|
||||
free: 'No free plan - paid-only from the start',
|
||||
starter: '~$5/month (very limited features)',
|
||||
pro: '~$49–99/month for meaningful team and analytics features',
|
||||
pro: '~$49-99/month for meaningful team and analytics features',
|
||||
enterprise: 'Custom pricing for SOC2, SSO, advanced API',
|
||||
},
|
||||
strengths: [
|
||||
'SOC2 Type II certified — serious enterprise security credentials',
|
||||
'SOC2 Type II certified - serious enterprise security credentials',
|
||||
'Deep API access for custom integrations',
|
||||
'SSO / SAML support for large organizations',
|
||||
'White-label solution for agencies',
|
||||
@@ -196,10 +197,10 @@ export const competitors: Record<string, CompetitorProfile> = {
|
||||
'Long track record and brand trust',
|
||||
],
|
||||
weaknesses: [
|
||||
'No free plan — must pay from day one even for basic use',
|
||||
'Meaningful features only unlock at $49–99/month+',
|
||||
'No free plan - must pay from day one even for basic use',
|
||||
'Meaningful features only unlock at $49-99/month+',
|
||||
'Interface is complex for users who just need to manage 50 dynamic QR codes',
|
||||
'US company — GDPR compliance requires additional configuration',
|
||||
'US company - GDPR compliance requires additional configuration',
|
||||
'Bulk creation and API access locked behind higher enterprise tiers',
|
||||
'Setup and onboarding takes longer than simpler tools',
|
||||
],
|
||||
@@ -216,24 +217,24 @@ export const competitors: Record<string, CompetitorProfile> = {
|
||||
'Anyone who finds the interface overwhelming for a straightforward use case',
|
||||
],
|
||||
commonComplaints: [
|
||||
'"The $5 plan is basically useless — you need to spend $49+ to get anything meaningful"',
|
||||
'"Way too complex for what I need — I just want to manage my 30 QR codes"',
|
||||
'"The $5 plan is basically useless - you need to spend $49+ to get anything meaningful"',
|
||||
'"Way too complex for what I need - I just want to manage my 30 QR codes"',
|
||||
'"GDPR compliance required a lot of manual configuration"',
|
||||
'"Expensive and hard to justify for a small marketing team"',
|
||||
],
|
||||
migrationNotes:
|
||||
'Uniqode/Beaconstac allows CSV export of your QR code data. You can download your QR code list and re-create dynamic codes in QR Master. Static QR codes are permanently tied to their destination — if you generated them as static codes, they remain valid forever. For dynamic codes, update your redirect destinations in QR Master and replace any printed materials that point to Uniqode redirect URLs.',
|
||||
'Uniqode/Beaconstac allows CSV export of your QR code data. You can download your QR code list and re-create dynamic codes in QR Master. Static QR codes are permanently tied to their destination - if you generated them as static codes, they remain valid forever. For dynamic codes, update your redirect destinations in QR Master and replace any printed materials that point to Uniqode redirect URLs.',
|
||||
features: [
|
||||
{ feature: 'Free plan available', qrMaster: true, competitor: false },
|
||||
{ feature: 'Pricing entry point', qrMaster: '€0 (free tier)', competitor: '~$5/month (limited)' },
|
||||
{
|
||||
feature: 'Meaningful features at base paid plan',
|
||||
qrMaster: '€9/month — analytics, branding, 50 dynamic QRs',
|
||||
qrMaster: '€9/month - analytics, branding, 50 dynamic QRs',
|
||||
competitor: '~$49/month for real team + analytics features',
|
||||
},
|
||||
{ feature: 'GDPR-compliant analytics (hashed IPs, out of box)', qrMaster: true, competitor: false },
|
||||
{ feature: 'Bulk QR creation', qrMaster: 'Business plan (up to 1,000)', competitor: 'Enterprise tier' },
|
||||
{ feature: 'SOC2 certification', qrMaster: false, competitor: true, note: 'Enterprise requirement — most SMBs do not need this' },
|
||||
{ feature: 'SOC2 certification', qrMaster: false, competitor: true, note: 'Enterprise requirement - most SMBs do not need this' },
|
||||
{ feature: 'SSO / SAML', qrMaster: false, competitor: true, note: 'Enterprise requirement' },
|
||||
{ feature: 'Simple onboarding for small teams', qrMaster: true, competitor: false },
|
||||
],
|
||||
@@ -243,25 +244,25 @@ export const competitors: Record<string, CompetitorProfile> = {
|
||||
id: 'bitly',
|
||||
name: 'Bitly',
|
||||
url: 'https://bitly.com',
|
||||
tagline: 'URL shortener with QR codes as a side feature — only 2 QR codes at $10/month',
|
||||
tagline: 'URL shortener with QR codes as a side feature - only 2 QR codes at $10/month',
|
||||
targetAudience: 'Link management users, marketing teams using Bitly for short links',
|
||||
positioning: 'Link management platform that added QR codes as a secondary feature',
|
||||
pricing: {
|
||||
free: 'Free — 1 QR code only',
|
||||
starter: '~$10/month (Core) — "unlimited scans" but only 2 QR codes total',
|
||||
pro: '~$29–35/month — more QR codes but still tightly capped; price jumps fast once you need more',
|
||||
enterprise: 'Custom — needed for meaningful QR code volume',
|
||||
free: 'Free - 1 QR code only',
|
||||
starter: '~$10/month (Core) - "unlimited scans" but only 2 QR codes total',
|
||||
pro: '~$29-35/month - more QR codes but still tightly capped; price jumps fast once you need more',
|
||||
enterprise: 'Custom - needed for meaningful QR code volume',
|
||||
},
|
||||
strengths: [
|
||||
'Very strong brand recognition — many people already use Bitly for link shortening',
|
||||
'Very strong brand recognition - many people already use Bitly for link shortening',
|
||||
'Combines link shortening and QR codes in one tool if you need both',
|
||||
'Clean analytics dashboard for link tracking',
|
||||
'Reliable redirect infrastructure',
|
||||
'Good integrations with marketing tools',
|
||||
],
|
||||
weaknesses: [
|
||||
'QR codes are a secondary feature — core product is link shortening',
|
||||
'Core plan (~$10/month) allows "unlimited scans" but only 2 QR codes total — useless for real campaigns',
|
||||
'QR codes are a secondary feature - core product is link shortening',
|
||||
'Core plan (~$10/month) allows "unlimited scans" but only 2 QR codes total - useless for real campaigns',
|
||||
'Need more than 2 QR codes? Pricing jumps disproportionately fast',
|
||||
'Free plan allows only 1 QR code',
|
||||
'No bulk QR creation at any plan level',
|
||||
@@ -269,7 +270,7 @@ export const competitors: Record<string, CompetitorProfile> = {
|
||||
'Not built for QR-specific workflows (restaurant menus, product packaging, etc.)',
|
||||
],
|
||||
bestFor: [
|
||||
'Teams already using Bitly for link management who need 1–2 QR codes with no bulk requirements',
|
||||
'Teams already using Bitly for link management who need 1-2 QR codes with no bulk requirements',
|
||||
'Use cases where a QR code is a minor side channel, not a primary campaign element',
|
||||
'Link tracking that happens to include a QR code as one of many channels',
|
||||
],
|
||||
@@ -281,13 +282,13 @@ export const competitors: Record<string, CompetitorProfile> = {
|
||||
'QR code-first workflows like restaurant menus, product packaging, or event materials',
|
||||
],
|
||||
commonComplaints: [
|
||||
'"$10/month and I only get 2 QR codes — that\'s basically unusable for anything real"',
|
||||
'"QR features feel like an afterthought — the UI is built around links, not QR workflows"',
|
||||
'"The free plan gives you exactly 1 QR code — useless for real use"',
|
||||
'"No bulk creation — had to manually create each code one by one"',
|
||||
'"$10/month and I only get 2 QR codes - that\'s basically unusable for anything real"',
|
||||
'"QR features feel like an afterthought - the UI is built around links, not QR workflows"',
|
||||
'"The free plan gives you exactly 1 QR code - useless for real use"',
|
||||
'"No bulk creation - had to manually create each code one by one"',
|
||||
],
|
||||
migrationNotes:
|
||||
'Bitly short links and QR codes are tied to Bitly\'s redirect infrastructure. If you cancel Bitly, your QR codes that point to bit.ly URLs will stop working. Export your link data from Bitly\'s dashboard before canceling. In QR Master, create new dynamic QR codes pointing directly to your destination URLs — no Bitly redirect layer in between. Replace printed or distributed QR codes with the new QR Master codes.',
|
||||
'Bitly short links and QR codes are tied to Bitly\'s redirect infrastructure. If you cancel Bitly, your QR codes that point to bit.ly URLs will stop working. Export your link data from Bitly\'s dashboard before canceling. In QR Master, create new dynamic QR codes pointing directly to your destination URLs - no Bitly redirect layer in between. Replace printed or distributed QR codes with the new QR Master codes.',
|
||||
features: [
|
||||
{ feature: 'Free QR codes', qrMaster: '3 dynamic + unlimited static', competitor: '1 QR code only' },
|
||||
{ feature: 'QR codes on base paid plan (~$10/month)', qrMaster: '50 dynamic QRs (Pro €9/month)', competitor: '2 QR codes total', note: 'Bitly Core plan markets "unlimited scans" but caps you at 2 QR codes' },
|
||||
@@ -297,8 +298,8 @@ export const competitors: Record<string, CompetitorProfile> = {
|
||||
{ feature: 'QR codes for restaurant menus, packaging, events', qrMaster: true, competitor: 'Possible but not designed for it' },
|
||||
{
|
||||
feature: 'Pro pricing',
|
||||
qrMaster: '€9/month — 50 dynamic QRs, full analytics',
|
||||
competitor: '~$10/month — 2 QR codes only',
|
||||
qrMaster: '€9/month - 50 dynamic QRs, full analytics',
|
||||
competitor: '~$10/month - 2 QR codes only',
|
||||
},
|
||||
],
|
||||
},
|
||||
|
||||
246
src/lib/email.ts
246
src/lib/email.ts
@@ -154,7 +154,7 @@ export async function sendPasswordResetEmail(email: string, resetToken: string)
|
||||
Secure QR Code Analytics & Management
|
||||
</p>
|
||||
<p style="margin: 0; color: #999999; font-size: 12px;">
|
||||
© 2026 QR Master. All rights reserved.
|
||||
© 2026 QR Master. All rights reserved.
|
||||
</p>
|
||||
<p style="margin: 15px 0 0 0; color: #aaaaaa; font-size: 11px;">
|
||||
This is an automated security email. Please do not reply.
|
||||
@@ -287,7 +287,7 @@ export async function sendNewsletterWelcomeEmail(email: string) {
|
||||
⏰ When Will This Happen?
|
||||
</p>
|
||||
<p style="margin: 0; color: #856404; font-size: 14px; line-height: 1.6;">
|
||||
We're in active development and testing. You'll get an email the moment these features go live – <strong>no waiting, no wondering</strong>. We respect your inbox.
|
||||
We're in active development and testing. You'll get an email the moment these features go live - <strong>no waiting, no wondering</strong>. We respect your inbox.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
@@ -297,7 +297,7 @@ export async function sendNewsletterWelcomeEmail(email: string) {
|
||||
💡 Want to Get Started Now?
|
||||
</h3>
|
||||
<p style="margin: 0 0 25px 0; color: #666666; font-size: 15px; line-height: 1.6;">
|
||||
Our current platform already helps teams create, track, and manage dynamic QR codes. No AI needed – just powerful tools that work today.
|
||||
Our current platform already helps teams create, track, and manage dynamic QR codes. No AI needed - just powerful tools that work today.
|
||||
</p>
|
||||
<a href="https://www.qrmaster.net/signup" style="background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: #ffffff; text-decoration: none; padding: 16px 40px; border-radius: 8px; font-size: 16px; font-weight: 700; display: inline-block; box-shadow: 0 4px 15px rgba(102, 126, 234, 0.3);">
|
||||
🚀 Try QR Master Free →
|
||||
@@ -310,7 +310,7 @@ export async function sendNewsletterWelcomeEmail(email: string) {
|
||||
</p>
|
||||
|
||||
<p style="margin: 20px 0 0 0; color: #555555; font-size: 16px; line-height: 1.7;">
|
||||
<strong>— Timo 👋</strong><br>
|
||||
<strong>- Timo 👋</strong><br>
|
||||
<span style="color: #888888; font-size: 14px;">Founder, QR Master</span>
|
||||
</p>
|
||||
</td>
|
||||
@@ -326,7 +326,7 @@ export async function sendNewsletterWelcomeEmail(email: string) {
|
||||
<a href="https://www.qrmaster.net" style="color: #667eea; text-decoration: none;">www.qrmaster.net</a>
|
||||
</p>
|
||||
<p style="margin: 0; color: #999999; font-size: 12px;">
|
||||
© 2026 QR Master. All rights reserved.
|
||||
© 2026 QR Master. All rights reserved.
|
||||
</p>
|
||||
<p style="margin: 15px 0 0 0; color: #aaaaaa; font-size: 11px;">
|
||||
You're receiving this because you signed up for AI feature notifications.
|
||||
@@ -461,7 +461,7 @@ export async function sendAIFeatureLaunchEmail(email: string) {
|
||||
<ol style="margin: 0; padding-left: 20px; color: #856404; font-size: 15px; line-height: 1.8;">
|
||||
<li style="margin-bottom: 10px;">🔐 Log in to your QR Master account</li>
|
||||
<li style="margin-bottom: 10px;">👀 Look for the "✨ AI" badge on supported features</li>
|
||||
<li style="margin-bottom: 10px;">✏️ Try creating a QR code – you'll see AI suggestions automatically</li>
|
||||
<li style="margin-bottom: 10px;">✏️ Try creating a QR code - you'll see AI suggestions automatically</li>
|
||||
<li>📈 Check your Analytics tab for the new AI query interface</li>
|
||||
</ol>
|
||||
</div>
|
||||
@@ -483,10 +483,10 @@ export async function sendAIFeatureLaunchEmail(email: string) {
|
||||
<!-- Personal Note -->
|
||||
<div style="background-color: #f8f9fa; padding: 30px; border-radius: 8px; margin: 40px 0;">
|
||||
<p style="margin: 0 0 20px 0; color: #555555; font-size: 15px; line-height: 1.7;">
|
||||
💬 We're excited to see what you build with these new tools. If you have questions, ideas, or just want to share what you created – <a href="mailto:support@qrmaster.net" style="color: #667eea; text-decoration: none;">hit reply</a>. I read every email.
|
||||
💬 We're excited to see what you build with these new tools. If you have questions, ideas, or just want to share what you created - <a href="mailto:support@qrmaster.net" style="color: #667eea; text-decoration: none;">hit reply</a>. I read every email.
|
||||
</p>
|
||||
<p style="margin: 0; color: #555555; font-size: 15px; line-height: 1.7;">
|
||||
<strong>— Timo 👋</strong><br>
|
||||
<strong>- Timo 👋</strong><br>
|
||||
<span style="color: #888888; font-size: 13px;">Founder, QR Master</span>
|
||||
</p>
|
||||
</div>
|
||||
@@ -506,7 +506,7 @@ export async function sendAIFeatureLaunchEmail(email: string) {
|
||||
<a href="https://www.qrmaster.net/faq" style="color: #667eea; text-decoration: none;">Help</a>
|
||||
</p>
|
||||
<p style="margin: 0; color: #999999; font-size: 12px;">
|
||||
© 2026 QR Master. All rights reserved.
|
||||
© 2026 QR Master. All rights reserved.
|
||||
</p>
|
||||
<p style="margin: 15px 0 0 0; color: #aaaaaa; font-size: 11px;">
|
||||
You received this because you subscribed to AI feature launch notifications.
|
||||
@@ -535,29 +535,29 @@ export async function sendAIFeatureLaunchEmail(email: string) {
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// SMTP Transport (nodemailer) — used for retention / welcome emails
|
||||
// SMTP Transport (nodemailer) - used for retention / welcome emails
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
function createSmtpTransport() {
|
||||
const host = process.env.SMTP_HOST || 'smtp.qrmaster.net';
|
||||
const port = parseInt(process.env.SMTP_PORT || '465', 10);
|
||||
const user = process.env.SMTP_USER || 'timo@qrmaster.net';
|
||||
const pass = process.env.SMTP_PASS?.trim();
|
||||
|
||||
if (!pass) {
|
||||
throw new Error('SMTP_PASS is missing. Configure SMTP credentials before sending welcome or retention emails.');
|
||||
}
|
||||
|
||||
return nodemailer.createTransport({
|
||||
host,
|
||||
port,
|
||||
secure: port === 465,
|
||||
auth: {
|
||||
user,
|
||||
pass,
|
||||
},
|
||||
});
|
||||
}
|
||||
function createSmtpTransport() {
|
||||
const host = process.env.SMTP_HOST || 'smtp.qrmaster.net';
|
||||
const port = parseInt(process.env.SMTP_PORT || '465', 10);
|
||||
const user = process.env.SMTP_USER || 'timo@qrmaster.net';
|
||||
const pass = process.env.SMTP_PASS?.trim();
|
||||
|
||||
if (!pass) {
|
||||
throw new Error('SMTP_PASS is missing. Configure SMTP credentials before sending welcome or retention emails.');
|
||||
}
|
||||
|
||||
return nodemailer.createTransport({
|
||||
host,
|
||||
port,
|
||||
secure: port === 465,
|
||||
auth: {
|
||||
user,
|
||||
pass,
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
const appUrl = process.env.NEXT_PUBLIC_APP_URL || 'https://www.qrmaster.net';
|
||||
|
||||
@@ -638,7 +638,7 @@ function emailShell(headExtra: string, bodyContent: string): string {
|
||||
const dotGridPattern = `url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Ccircle%20cx%3D%2212%22%20cy%3D%2212%22%20r%3D%221.5%22%20fill%3D%22%23C8A257%22%20fill-opacity%3D%220.18%22%2F%3E%3C%2Fsvg%3E)`;
|
||||
|
||||
/**
|
||||
* Welcome Email — sent immediately on signup (Day 0)
|
||||
* Welcome Email - sent immediately on signup (Day 0)
|
||||
*/
|
||||
export async function sendWelcomeEmail(email: string, name: string) {
|
||||
const transport = createSmtpTransport();
|
||||
@@ -797,7 +797,7 @@ export async function sendWelcomeEmail(email: string, name: string) {
|
||||
<td style="padding:40px 48px 56px;">
|
||||
<p style="margin:0;font-family:'DM Sans',-apple-system,sans-serif;
|
||||
font-size:15px;color:${clr.textSoft};line-height:1.7;">
|
||||
I'm thrilled to have you on board. If you have any questions, feedback, or just want to share what you've created — hit reply. I'm reading every single email.
|
||||
I'm thrilled to have you on board. If you have any questions, feedback, or just want to share what you've created - hit reply. I'm reading every single email.
|
||||
</p>
|
||||
|
||||
<table role="presentation" cellpadding="0" cellspacing="0" border="0" style="margin-top:28px;">
|
||||
@@ -806,7 +806,7 @@ export async function sendWelcomeEmail(email: string, name: string) {
|
||||
<table role="presentation" cellpadding="0" cellspacing="0" border="0">
|
||||
<tr>
|
||||
<td style="width:56px; height:56px; background-color:#0B0D14; border-radius:50%; text-align:center; vertical-align:middle; border:2px solid ${clr.border}; box-shadow:0 4px 10px rgba(0,0,0,0.05);">
|
||||
<img src="${appUrl}/favicon1.png" width="32" height="32" alt="Timo" style="display:inline-block; vertical-align:middle; border-radius:50%; object-fit:cover;">
|
||||
<img src="${appUrl}/favicon1.png" width="32" height="32" alt="Timo" style="display:inline-block; vertical-align:middle; border-radius:50%; object-fit:cover;">
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
@@ -838,7 +838,7 @@ export async function sendWelcomeEmail(email: string, name: string) {
|
||||
}
|
||||
|
||||
/**
|
||||
* Activation Nudge — sent on Day 3 if user has 0 QR codes
|
||||
* Activation Nudge - sent on Day 3 if user has 0 QR codes
|
||||
*/
|
||||
export async function sendActivationNudgeEmail(email: string, name: string) {
|
||||
const transport = createSmtpTransport();
|
||||
@@ -847,7 +847,7 @@ export async function sendActivationNudgeEmail(email: string, name: string) {
|
||||
|
||||
const steps = [
|
||||
{ n: '01', label: 'Paste your URL', sub: 'or choose WiFi, vCard, Teams, and more' },
|
||||
{ n: '02', label: 'Customize the design', sub: 'colors, logo, frame label — optional' },
|
||||
{ n: '02', label: 'Customize the design', sub: 'colors, logo, frame label - optional' },
|
||||
{ n: '03', label: 'Download & use', sub: 'PNG for screen, SVG for print' },
|
||||
];
|
||||
|
||||
@@ -905,7 +905,7 @@ export async function sendActivationNudgeEmail(email: string, name: string) {
|
||||
<td style="padding:40px 48px 0;">
|
||||
<p style="margin:0 0 8px;font-family:'DM Sans',-apple-system,sans-serif;
|
||||
font-size:16px;line-height:1.75;color:${clr.text};">
|
||||
Your 3 free dynamic QR codes are still there. Unused.<br>
|
||||
Your 3 free dynamic QR codes are still there. Unused.<br>
|
||||
Dynamic means: one code, update the link anytime, every scan tracked.
|
||||
</p>
|
||||
<p style="margin:16px 0 0;font-family:'DM Sans',-apple-system,sans-serif;
|
||||
@@ -969,13 +969,13 @@ export async function sendActivationNudgeEmail(email: string, name: string) {
|
||||
from: 'Timo from QR Master <timo@qrmaster.net>',
|
||||
replyTo: 'support@qrmaster.net',
|
||||
to: email,
|
||||
subject: "You haven't made one yet",
|
||||
subject: "Your 3 free codes are still sitting there",
|
||||
html,
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Upgrade Nudge — sent on Day 7 if user has ≥1 QR code and is still on FREE plan
|
||||
* Upgrade Nudge - sent on Day 7 if user has ≥1 QR code and is still on FREE plan
|
||||
*/
|
||||
export async function sendUpgradeNudgeEmail(email: string, name: string, qrCount: number) {
|
||||
const transport = createSmtpTransport();
|
||||
@@ -990,18 +990,18 @@ export async function sendUpgradeNudgeEmail(email: string, name: string, qrCount
|
||||
},
|
||||
{
|
||||
label: 'Logo in QR code',
|
||||
free: '—',
|
||||
free: '-',
|
||||
pro: 'Your logo, centered',
|
||||
},
|
||||
{
|
||||
label: 'Brand colors',
|
||||
free: '—',
|
||||
pro: 'Any color',
|
||||
label: 'Module shapes',
|
||||
free: '-',
|
||||
pro: '4 shapes + eye styles',
|
||||
},
|
||||
{
|
||||
label: 'CSV export',
|
||||
free: '✓',
|
||||
pro: '✓',
|
||||
label: 'Scan detail',
|
||||
free: 'Total scans',
|
||||
pro: 'Device, location, time',
|
||||
},
|
||||
];
|
||||
|
||||
@@ -1039,13 +1039,13 @@ export async function sendUpgradeNudgeEmail(email: string, name: string, qrCount
|
||||
|
||||
<h1 style="margin:28px 0 0;font-family:'DM Serif Display',Georgia,serif;
|
||||
font-size:34px;font-weight:400;line-height:1.2;color:#FFFFFF;">
|
||||
${qrCount} of 3 free codes used,<br>
|
||||
You are out of slots,<br>
|
||||
<em style="color:${clr.gold};">${firstName}.</em>
|
||||
</h1>
|
||||
|
||||
<p style="margin:16px 0 0;font-family:'DM Sans',-apple-system,sans-serif;
|
||||
font-size:14px;color:rgba(255,255,255,0.45);">
|
||||
Free plan · Day 7
|
||||
Free plan · ${qrCount} of 3 dynamic codes active
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
@@ -1055,11 +1055,11 @@ export async function sendUpgradeNudgeEmail(email: string, name: string, qrCount
|
||||
<td style="padding:40px 48px 0;">
|
||||
<p style="margin:0;font-family:'DM Sans',-apple-system,sans-serif;
|
||||
font-size:16px;line-height:1.75;color:${clr.text};">
|
||||
The free plan gives you 3 dynamic QR codes. That's enough to start — not enough to scale. When you hit the limit, every new campaign means replacing an old one.
|
||||
Three codes is enough to prove the idea. It is not enough to run two campaigns at once - from here, every new placement means switching off an old one.
|
||||
</p>
|
||||
<p style="margin:16px 0 0;font-family:'DM Sans',-apple-system,sans-serif;
|
||||
font-size:16px;line-height:1.75;color:${clr.textSoft};">
|
||||
Pro removes the ceiling — and adds custom branding your free codes never have:
|
||||
Pro raises it to 50, and shows you which placement actually earned the scan:
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
@@ -1113,7 +1113,7 @@ export async function sendUpgradeNudgeEmail(email: string, name: string, qrCount
|
||||
<tr>
|
||||
<td align="center" style="padding-top:12px;">
|
||||
<span style="font-family:'DM Sans',-apple-system,sans-serif;font-size:12px;
|
||||
color:${clr.textMuted};">Your free plan stays active — no pressure</span>
|
||||
color:${clr.textMuted};">Your free plan stays active - no pressure</span>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
@@ -1140,15 +1140,20 @@ export async function sendUpgradeNudgeEmail(email: string, name: string, qrCount
|
||||
from: 'Timo from QR Master <timo@qrmaster.net>',
|
||||
replyTo: 'support@qrmaster.net',
|
||||
to: email,
|
||||
subject: `You're ${qrCount >= 3 ? 'at' : `${3 - qrCount} away from`} the free limit`,
|
||||
subject: 'You just hit the free limit',
|
||||
html,
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 30-Day Nudge — sent on Day 30 if user has ≥1 QR code and is still on FREE plan
|
||||
* 30-Day Nudge - sent on Day 30 if user has ≥1 QR code and is still on FREE plan
|
||||
*/
|
||||
export async function sendThirtyDayNudgeEmail(email: string, name: string, qrCount: number) {
|
||||
export async function sendThirtyDayNudgeEmail(
|
||||
email: string,
|
||||
name: string,
|
||||
qrCount: number,
|
||||
scanCount: number = 0
|
||||
) {
|
||||
const transport = createSmtpTransport();
|
||||
const pricingUrl = `${appUrl}/pricing`;
|
||||
const firstName = name.split(' ')[0];
|
||||
@@ -1187,15 +1192,15 @@ export async function sendThirtyDayNudgeEmail(email: string, name: string, qrCou
|
||||
<td style="padding:40px 48px 0;">
|
||||
<p style="margin:0;font-family:'DM Sans',-apple-system,sans-serif;
|
||||
font-size:16px;line-height:1.75;color:${clr.text};">
|
||||
You've created ${qrCount} QR code${qrCount !== 1 ? 's' : ''} in your first month. That tells me you're actually using this — not just signing up to forget it.
|
||||
Your codes were scanned <em style="color:${clr.text};">${scanCount} time${scanCount !== 1 ? 's' : ''}</em> this month, across ${qrCount} code${qrCount !== 1 ? 's' : ''}. Someone stood in front of your printed material and used it.
|
||||
</p>
|
||||
<p style="margin:20px 0 0;font-family:'DM Sans',-apple-system,sans-serif;
|
||||
font-size:16px;line-height:1.75;color:${clr.textSoft};">
|
||||
The one thing I hear most from Pro users who switched after a few weeks: <em style="color:${clr.text};">they wish they'd added their brand sooner.</em> Every code they printed on free didn't have their logo. Every flyer had a generic black pattern instead of their colors.
|
||||
What you cannot see yet is <em style="color:${clr.text};">which of them</em>. The free plan gives you a running total. It does not tell you which placement, which city, or which kind of device brought those scans in.
|
||||
</p>
|
||||
<p style="margin:20px 0 0;font-family:'DM Sans',-apple-system,sans-serif;
|
||||
font-size:16px;line-height:1.75;color:${clr.textSoft};">
|
||||
Pro fixes that. Two things it unlocks that free never will:
|
||||
That is the difference between knowing a campaign worked and knowing which part of it did:
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
@@ -1222,10 +1227,10 @@ export async function sendThirtyDayNudgeEmail(email: string, name: string, qrCou
|
||||
</td>
|
||||
<td style="padding-left:14px;vertical-align:top;padding-top:2px;">
|
||||
<p style="margin:0;font-family:'DM Sans',-apple-system,sans-serif;
|
||||
font-size:15px;font-weight:600;color:${clr.text};letter-spacing:-0.2px;">Your logo, inside every QR code</p>
|
||||
font-size:15px;font-weight:600;color:${clr.text};letter-spacing:-0.2px;">Which placement earned the scan</p>
|
||||
<p style="margin:6px 0 0;font-family:'DM Sans',-apple-system,sans-serif;
|
||||
font-size:14px;color:${clr.textSoft};line-height:1.6;">
|
||||
Upload once. Every code you make automatically carries your brand mark — menus, flyers, packaging, wherever.
|
||||
One code per flyer, poster or table tent, and the dashboard shows you which one people actually used. The others you can stop printing.
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
@@ -1252,10 +1257,10 @@ export async function sendThirtyDayNudgeEmail(email: string, name: string, qrCou
|
||||
</td>
|
||||
<td style="padding-left:14px;vertical-align:top;padding-top:2px;">
|
||||
<p style="margin:0;font-family:'DM Sans',-apple-system,sans-serif;
|
||||
font-size:15px;font-weight:600;color:${clr.text};letter-spacing:-0.2px;">Brand colors — not just black</p>
|
||||
font-size:15px;font-weight:600;color:${clr.text};letter-spacing:-0.2px;">Device and location, not just a total</p>
|
||||
<p style="margin:6px 0 0;font-family:'DM Sans',-apple-system,sans-serif;
|
||||
font-size:14px;color:${clr.textSoft};line-height:1.6;">
|
||||
Match your QR codes to your brand palette. Looks intentional. Scans the same.
|
||||
See whether scans came from phones at the venue or desktops later, and which cities they came from. Enough to decide where the next print run goes.
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
@@ -1277,14 +1282,14 @@ export async function sendThirtyDayNudgeEmail(email: string, name: string, qrCou
|
||||
text-decoration:none;padding:18px 52px;border-radius:10px;
|
||||
font-family:'DM Sans',-apple-system,sans-serif;font-size:15px;
|
||||
font-weight:600;letter-spacing:0.3px;border:1px solid rgba(200,162,87,0.3);">
|
||||
Add my brand to QR codes →
|
||||
See the full breakdown →
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" style="padding-top:12px;">
|
||||
<span style="font-family:'DM Sans',-apple-system,sans-serif;font-size:12px;
|
||||
color:${clr.textMuted};">Your existing codes keep working — nothing breaks</span>
|
||||
color:${clr.textMuted};">Your existing codes and their scan history stay exactly as they are</span>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
@@ -1311,7 +1316,122 @@ export async function sendThirtyDayNudgeEmail(email: string, name: string, qrCou
|
||||
from: 'Timo from QR Master <timo@qrmaster.net>',
|
||||
replyTo: 'support@qrmaster.net',
|
||||
to: email,
|
||||
subject: `${firstName}, a month of QR codes — one upgrade worth making`,
|
||||
subject: `${firstName}, your codes were scanned ${scanCount} time${scanCount !== 1 ? 's' : ''} this month`,
|
||||
html,
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* First Scan - sent the day after a user's first ever scan.
|
||||
*
|
||||
* The only email in the sequence whose trigger is not the calendar. Everything
|
||||
* else fires on day 3, 7 or 30 whether or not anything happened; this one fires
|
||||
* because something did. It is also the moment the positioning first pays off -
|
||||
* a printed thing became a measurement - so it deliberately sells nothing. The
|
||||
* CTA goes to the user's own data, not to pricing.
|
||||
*/
|
||||
export async function sendFirstScanEmail(
|
||||
email: string,
|
||||
name: string,
|
||||
scan: { qrTitle: string; device?: string | null; country?: string | null; ts: Date }
|
||||
) {
|
||||
const transport = createSmtpTransport();
|
||||
const firstName = name.split(' ')[0];
|
||||
const analyticsUrl = `${appUrl}/analytics`;
|
||||
|
||||
const time = scan.ts.toLocaleTimeString('en-GB', {
|
||||
hour: '2-digit',
|
||||
minute: '2-digit',
|
||||
timeZone: 'UTC',
|
||||
});
|
||||
|
||||
// Only state what was actually recorded. Device and country can be missing,
|
||||
// and inventing a clean sentence around absent data is exactly the habit this
|
||||
// product is positioned against.
|
||||
const details = [
|
||||
`at ${time} UTC`,
|
||||
scan.device ? `on ${scan.device.toLowerCase()}` : null,
|
||||
scan.country ? `from ${scan.country}` : null,
|
||||
]
|
||||
.filter(Boolean)
|
||||
.join(', ');
|
||||
|
||||
const html = emailShell('', `
|
||||
<tr>
|
||||
<td style="background-color:${clr.header};background-image:${dotGridPattern};
|
||||
background-size:24px 24px;padding:44px 48px 40px;">
|
||||
<p style="margin:0;font-family:'DM Sans',-apple-system,sans-serif;
|
||||
font-size:12px;font-weight:600;letter-spacing:1.6px;
|
||||
text-transform:uppercase;color:${clr.gold};">QR Master</p>
|
||||
<h1 style="margin:28px 0 0;font-family:'DM Serif Display',Georgia,serif;
|
||||
font-size:34px;font-weight:400;line-height:1.2;color:#FFFFFF;">
|
||||
Someone scanned it,<br>
|
||||
<em style="color:${clr.gold};">${firstName}.</em>
|
||||
</h1>
|
||||
<p style="margin:16px 0 0;font-family:'DM Sans',-apple-system,sans-serif;
|
||||
font-size:14px;line-height:1.6;color:rgba(255,255,255,0.62);">
|
||||
First scan · ${scan.qrTitle}
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td style="padding:40px 48px 0;">
|
||||
<p style="margin:0;font-family:'DM Sans',-apple-system,sans-serif;
|
||||
font-size:16px;line-height:1.75;color:${clr.text};">
|
||||
Your code "${scan.qrTitle}" was scanned for the first time ${details}.
|
||||
</p>
|
||||
<p style="margin:20px 0 0;font-family:'DM Sans',-apple-system,sans-serif;
|
||||
font-size:16px;line-height:1.75;color:${clr.textSoft};">
|
||||
Somebody stood in front of something you made and used it. That is the
|
||||
part a static code can never tell you.
|
||||
</p>
|
||||
<p style="margin:20px 0 0;font-family:'DM Sans',-apple-system,sans-serif;
|
||||
font-size:16px;line-height:1.75;color:${clr.textSoft};">
|
||||
Every scan from here on is counted. In a week or two you will be able to
|
||||
see when they cluster - and whether the spot you chose was the right one.
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td style="padding:32px 48px 48px;">
|
||||
<table role="presentation" cellpadding="0" cellspacing="0" border="0">
|
||||
<tr>
|
||||
<td style="background-color:${clr.ctaBg};border-radius:6px;">
|
||||
<a href="${analyticsUrl}"
|
||||
style="display:inline-block;padding:15px 30px;
|
||||
font-family:'DM Sans',-apple-system,sans-serif;
|
||||
font-size:15px;font-weight:600;color:${clr.ctaText};
|
||||
text-decoration:none;letter-spacing:-0.1px;">
|
||||
See the scans →
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<p style="margin:24px 0 0;font-family:'DM Sans',-apple-system,sans-serif;
|
||||
font-size:15px;line-height:1.7;color:${clr.textSoft};">
|
||||
If the destination needs to change, you can edit it without touching the
|
||||
printed code. That is what it is for.
|
||||
</p>
|
||||
<p style="margin:28px 0 0;font-family:'DM Sans',-apple-system,sans-serif;
|
||||
font-size:15px;line-height:1.7;color:${clr.text};">
|
||||
Timo
|
||||
</p>
|
||||
<p style="margin:2px 0 0;font-family:'DM Sans',-apple-system,sans-serif;
|
||||
font-size:12px;font-weight:600;letter-spacing:1.2px;
|
||||
text-transform:uppercase;color:${clr.textMuted};">
|
||||
Founder, QR Master
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
`);
|
||||
|
||||
await transport.sendMail({
|
||||
from: 'Timo from QR Master <timo@qrmaster.net>',
|
||||
replyTo: 'support@qrmaster.net',
|
||||
to: email,
|
||||
subject: 'Your QR code was just scanned for the first time',
|
||||
html,
|
||||
});
|
||||
}
|
||||
|
||||
@@ -55,7 +55,7 @@ export const useCasePagesDe: Record<string, UseCasePageContentDe> = {
|
||||
eyebrow: 'Vor dem Druck entscheiden',
|
||||
titleSuffix: 'vor dem Druck',
|
||||
metaDescription:
|
||||
'Statischer oder dynamischer QR-Code? Vergleichen Sie Änderbarkeit, Druckrisiko und Tracking – und entscheiden Sie vor Flyer, Speisekarte oder Tischaufsteller.',
|
||||
'Statischer oder dynamischer QR-Code? Vergleichen Sie Änderbarkeit, Druckrisiko und Tracking - und entscheiden Sie vor Flyer, Speisekarte oder Tischaufsteller.',
|
||||
intro:
|
||||
'Bleibt Ihr Link garantiert unverändert, reicht ein statischer QR-Code. Können sich PDF, Menü, Angebot oder Zielseite später ändern, bleibt ein dynamischer QR-Code nach dem Druck flexibel.',
|
||||
answer:
|
||||
@@ -158,7 +158,7 @@ export const useCasePagesDe: Record<string, UseCasePageContentDe> = {
|
||||
authoritySignals: [
|
||||
'Klarer Vergleich vor der Druckfreigabe statt Technik-Jargon.',
|
||||
'Konkrete Beispiele für Menüs, PDFs, Flyer und Tischaufsteller.',
|
||||
'Keine pauschalen Einsparversprechen – prüfen Sie Ihren eigenen Neudruck-Aufwand.',
|
||||
'Keine pauschalen Einsparversprechen - prüfen Sie Ihren eigenen Neudruck-Aufwand.',
|
||||
],
|
||||
},
|
||||
|
||||
@@ -169,18 +169,18 @@ export const useCasePagesDe: Record<string, UseCasePageContentDe> = {
|
||||
title: 'QR-Codes für Fitnessstudios',
|
||||
cluster: 'gyms',
|
||||
summary:
|
||||
'Verknüpfen Sie Trainingsgeräte mit Video-Tutorials, Kursplänen oder Probetrainings – ohne die Aufkleber auf jedem Gerät neu zu drucken.',
|
||||
'Verknüpfen Sie Trainingsgeräte mit Video-Tutorials, Kursplänen oder Probetrainings - ohne die Aufkleber auf jedem Gerät neu zu drucken.',
|
||||
parentHref: '/dynamic-qr-code-generator',
|
||||
parentTitle: 'Dynamischer QR-Code-Generator',
|
||||
ctaLabel: 'QR-Code fürs Fitnessstudio erstellen',
|
||||
eyebrow: 'Fitnessstudios',
|
||||
titleSuffix: 'für Geräte-Tutorials, Kurspläne und Probetrainings',
|
||||
metaDescription:
|
||||
'Mit QR-Codes im Fitnessstudio verlinken Sie Geräte mit Video-Anleitungen, Kursplänen und Probetraining-Anmeldungen – ohne Aufkleber auszutauschen.',
|
||||
'Mit QR-Codes im Fitnessstudio verlinken Sie Geräte mit Video-Anleitungen, Kursplänen und Probetraining-Anmeldungen - ohne Aufkleber auszutauschen.',
|
||||
intro:
|
||||
'QR-Codes im Fitnessstudio funktionieren am besten, wenn die robusten Aufkleber auf den Geräten dauerhaft bleiben, während die verlinkten Tutorial-Videos oder Kurspläne jederzeit aktualisiert werden können.',
|
||||
answer:
|
||||
'Ein QR-Code im Fitnessstudio sollte Mitglieder zu einem Anleitungsvideo für genau das Gerät führen, an dem sie gerade trainieren – oder Interessenten direkt in eine mobile Anmeldung fürs Probetraining leiten.',
|
||||
'Ein QR-Code im Fitnessstudio sollte Mitglieder zu einem Anleitungsvideo für genau das Gerät führen, an dem sie gerade trainieren - oder Interessenten direkt in eine mobile Anmeldung fürs Probetraining leiten.',
|
||||
whenToUse: [
|
||||
'Sie möchten Video-Anleitungen für komplexe Geräte bereitstellen.',
|
||||
'Ihre Kurspläne ändern sich wöchentlich oder saisonal.',
|
||||
@@ -247,7 +247,7 @@ export const useCasePagesDe: Record<string, UseCasePageContentDe> = {
|
||||
{
|
||||
question: 'Wie verhindere ich, dass Mitglieder QR-Aufkleber von den Geräten abziehen?',
|
||||
answer:
|
||||
'Verwenden Sie strapazierfähige Vinyl-Aufkleber in Industriequalität mit starkem Kleber. Bringen Sie sie auf flachen Metallflächen an – abseits der Stellen, an denen Mitglieder die Geräte greifen. Polycarbonat-Schutzfolien verhindern zusätzlich Ablösen und Verkratzen.',
|
||||
'Verwenden Sie strapazierfähige Vinyl-Aufkleber in Industriequalität mit starkem Kleber. Bringen Sie sie auf flachen Metallflächen an - abseits der Stellen, an denen Mitglieder die Geräte greifen. Polycarbonat-Schutzfolien verhindern zusätzlich Ablösen und Verkratzen.',
|
||||
},
|
||||
{
|
||||
question: 'Sollten QR-Codes an Geräten auf YouTube oder einen eigenen Videoplayer verlinken?',
|
||||
@@ -257,7 +257,7 @@ export const useCasePagesDe: Record<string, UseCasePageContentDe> = {
|
||||
{
|
||||
question: 'Kann ich mit QR-Codes messen, welche Geräte am beliebtesten sind?',
|
||||
answer:
|
||||
'Ja! Mit einem eigenen dynamischen QR-Code pro Gerät sehen Sie die Scan-Häufigkeit im Dashboard. Hohe Scan-Raten deuten auf hohe Nutzung hin – eine gute Entscheidungsgrundlage, welche Geräte Sie künftig zusätzlich anschaffen.',
|
||||
'Ja! Mit einem eigenen dynamischen QR-Code pro Gerät sehen Sie die Scan-Häufigkeit im Dashboard. Hohe Scan-Raten deuten auf hohe Nutzung hin - eine gute Entscheidungsgrundlage, welche Geräte Sie künftig zusätzlich anschaffen.',
|
||||
},
|
||||
{
|
||||
question: 'Brauche ich separate QR-Codes für iOS- und Android-Nutzer, um meine Studio-App zu verteilen?',
|
||||
@@ -293,7 +293,7 @@ export const useCasePagesDe: Record<string, UseCasePageContentDe> = {
|
||||
eyebrow: 'Events & Veranstaltungen',
|
||||
titleSuffix: 'für Check-in, Programm, Messestände und Kampagnen-Tracking',
|
||||
metaDescription:
|
||||
'Event-QR-Codes für Programm, Check-in und messbare Platzierungen auf Schildern, Flyern und Messeständen – jederzeit aktualisierbar.',
|
||||
'Event-QR-Codes für Programm, Check-in und messbare Platzierungen auf Schildern, Flyern und Messeständen - jederzeit aktualisierbar.',
|
||||
intro:
|
||||
'QR-Codes für Events funktionieren am besten, wenn Sie operative QR-Flows von werblichen trennen und Ihre gedruckten Platzierungen einfach verwaltbar halten.',
|
||||
answer:
|
||||
@@ -330,7 +330,7 @@ export const useCasePagesDe: Record<string, UseCasePageContentDe> = {
|
||||
{
|
||||
title: 'Follow-up nach dem Event',
|
||||
description:
|
||||
'Leiten Sie Scanner nach dem Event auf die passende Recap-, Buchungs- oder Lead-Seite um – ohne die gedruckten Materialien anzufassen.',
|
||||
'Leiten Sie Scanner nach dem Event auf die passende Recap-, Buchungs- oder Lead-Seite um - ohne die gedruckten Materialien anzufassen.',
|
||||
},
|
||||
],
|
||||
checklistTitle: 'Event-QR-Checkliste',
|
||||
@@ -363,14 +363,14 @@ export const useCasePagesDe: Record<string, UseCasePageContentDe> = {
|
||||
href: '/tools/teams-qr-code',
|
||||
title: 'Teams-QR-Code-Generator',
|
||||
description:
|
||||
'Kostenloses Tool – Teilnehmer treten per Scan direkt dem Teams-Meeting oder Webinar bei.',
|
||||
'Kostenloses Tool - Teilnehmer treten per Scan direkt dem Teams-Meeting oder Webinar bei.',
|
||||
},
|
||||
],
|
||||
faq: [
|
||||
{
|
||||
question: 'Wie verhindern dynamische QR-Codes ein Desaster, wenn sich unser Event-Programm ändert?',
|
||||
answer:
|
||||
'Wenn ein Speaker absagt oder sich ein Raum ändert, nachdem Sie 5.000 Teilnehmer-Badges gedruckt haben, rettet der dynamische QR-Code den Tag: Sie aktualisieren einfach die Programm-URL im Dashboard – und jedes gedruckte Badge zeigt sofort auf die neuen Informationen.',
|
||||
'Wenn ein Speaker absagt oder sich ein Raum ändert, nachdem Sie 5.000 Teilnehmer-Badges gedruckt haben, rettet der dynamische QR-Code den Tag: Sie aktualisieren einfach die Programm-URL im Dashboard - und jedes gedruckte Badge zeigt sofort auf die neuen Informationen.',
|
||||
},
|
||||
{
|
||||
question: 'Wie erzeuge ich einzigartige QR-Codes für tausende Teilnehmer-Badges?',
|
||||
@@ -415,7 +415,7 @@ export const useCasePagesDe: Record<string, UseCasePageContentDe> = {
|
||||
intro:
|
||||
'QR-Codes auf Immobilienschildern sind am stärksten, wenn der Objekt-Traffic aktuell bleibt, auch wenn sich Angebot, Besichtigungstermine oder Broschüren-Links ändern.',
|
||||
answer:
|
||||
'Ein QR-Code am Immobilienschild sollte Passanten zum heute richtigen Exposé, zur Broschüre oder zum Anfrage-Formular führen – mit genug Tracking-Kontext, um die Performance der Schilder über die Zeit zu vergleichen.',
|
||||
'Ein QR-Code am Immobilienschild sollte Passanten zum heute richtigen Exposé, zur Broschüre oder zum Anfrage-Formular führen - mit genug Tracking-Kontext, um die Performance der Schilder über die Zeit zu vergleichen.',
|
||||
whenToUse: [
|
||||
'Schilder, Schaufenster-Aushänge oder Objekt-Broschüren sollen auf aktuelle Objektinformationen zeigen.',
|
||||
'Sie möchten Scans von Schildern, Flyern, Besichtigungen und Makler-Materialien vergleichen.',
|
||||
@@ -427,9 +427,9 @@ export const useCasePagesDe: Record<string, UseCasePageContentDe> = {
|
||||
{ label: 'Objekt-Routing', text: 'Eine fixe Seite', value: true },
|
||||
],
|
||||
howToSteps: [
|
||||
'Verbinden Sie jeden Schild-QR mit dem passenden Exposé, der Broschüre oder dem Lead-Formular – nicht mit einer generischen Startseite.',
|
||||
'Verbinden Sie jeden Schild-QR mit dem passenden Exposé, der Broschüre oder dem Lead-Formular - nicht mit einer generischen Startseite.',
|
||||
'Nutzen Sie trackbares Routing, wenn dasselbe Objekt auf Schildern, Flyern und Besichtigungsunterlagen erscheint.',
|
||||
'Ändern Sie das Ziel, wenn sich Objektstatus, CTA oder Follow-up-Prozess ändern – ohne gedruckte Schilder zu ersetzen.',
|
||||
'Ändern Sie das Ziel, wenn sich Objektstatus, CTA oder Follow-up-Prozess ändern - ohne gedruckte Schilder zu ersetzen.',
|
||||
],
|
||||
workflowTitle: 'Wo QR-Systeme für Immobilien wirklich nützlich werden',
|
||||
workflowIntro:
|
||||
@@ -448,7 +448,7 @@ export const useCasePagesDe: Record<string, UseCasePageContentDe> = {
|
||||
{
|
||||
title: 'Lead-fähige Übergabe',
|
||||
description:
|
||||
'Leiten Sie Scanner auf das aktuelle Objekt-Hub, die Broschüren-Anforderung oder die Terminanfrage – statt auf einen veralteten Exposé-Schnappschuss.',
|
||||
'Leiten Sie Scanner auf das aktuelle Objekt-Hub, die Broschüren-Anforderung oder die Terminanfrage - statt auf einen veralteten Exposé-Schnappschuss.',
|
||||
},
|
||||
],
|
||||
checklistTitle: 'QR-Checkliste für Immobilienschilder',
|
||||
@@ -487,7 +487,7 @@ export const useCasePagesDe: Record<string, UseCasePageContentDe> = {
|
||||
{
|
||||
question: 'Wie groß sollte ein QR-Code auf einem Immobilienschild sein, damit er aus dem Auto scanbar ist?',
|
||||
answer:
|
||||
'Für einen Scan aus einem am Straßenrand geparkten Auto (ca. 3–5 Meter Entfernung) sollte der QR-Code mindestens 10x10 cm groß sein. Achten Sie auf hohen Kontrast, z.B. schwarzer Code auf weißem Grund.',
|
||||
'Für einen Scan aus einem am Straßenrand geparkten Auto (ca. 3-5 Meter Entfernung) sollte der QR-Code mindestens 10x10 cm groß sein. Achten Sie auf hohen Kontrast, z.B. schwarzer Code auf weißem Grund.',
|
||||
},
|
||||
{
|
||||
question: 'Was ist das beste Ziel für einen QR-Code bei Besichtigungsterminen?',
|
||||
@@ -507,7 +507,7 @@ export const useCasePagesDe: Record<string, UseCasePageContentDe> = {
|
||||
{
|
||||
question: 'Kann ich auswerten, welche Lagen das meiste Interesse erzeugen?',
|
||||
answer:
|
||||
'Absolut. Wenn Sie für Schilder in verschiedenen Vierteln unterschiedliche dynamische QR-Codes verwenden, zeigt Ihnen das Analytics-Dashboard genau, welche Schilder am häufigsten gescannt werden – und wo sich Ihr Marketing lohnt.',
|
||||
'Absolut. Wenn Sie für Schilder in verschiedenen Vierteln unterschiedliche dynamische QR-Codes verwenden, zeigt Ihnen das Analytics-Dashboard genau, welche Schilder am häufigsten gescannt werden - und wo sich Ihr Marketing lohnt.',
|
||||
},
|
||||
],
|
||||
heroImage: '/marketing/use-cases/real-estate-sign-qr-codes.png',
|
||||
@@ -521,14 +521,14 @@ export const useCasePagesDe: Record<string, UseCasePageContentDe> = {
|
||||
title: 'QR-Codes für Hotels',
|
||||
cluster: 'hotels',
|
||||
summary:
|
||||
'Führen Sie Gäste zu aktuellen Roomservice-Menüs, Check-in-Prozessen oder lokalen Empfehlungen – ohne Zimmerkarten neu zu drucken.',
|
||||
'Führen Sie Gäste zu aktuellen Roomservice-Menüs, Check-in-Prozessen oder lokalen Empfehlungen - ohne Zimmerkarten neu zu drucken.',
|
||||
parentHref: '/dynamic-qr-code-generator',
|
||||
parentTitle: 'Dynamischer QR-Code-Generator',
|
||||
ctaLabel: 'Hotel-QR-Code erstellen',
|
||||
eyebrow: 'Hotels',
|
||||
titleSuffix: 'für Gäste-Services, Roomservice und Check-in',
|
||||
metaDescription:
|
||||
'Mit Hotel-QR-Codes leiten Sie Gäste zu aktuellen Menüs, Check-in-Prozessen oder lokalen Empfehlungen – ohne Karten neu zu drucken.',
|
||||
'Mit Hotel-QR-Codes leiten Sie Gäste zu aktuellen Menüs, Check-in-Prozessen oder lokalen Empfehlungen - ohne Karten neu zu drucken.',
|
||||
intro:
|
||||
'Willkommens-QR-Codes im Hotel funktionieren am besten, wenn die Karten für Gäste an ihrem Platz bleiben, während sich das Ziel dahinter aktualisieren lässt.',
|
||||
answer:
|
||||
@@ -594,7 +594,7 @@ export const useCasePagesDe: Record<string, UseCasePageContentDe> = {
|
||||
{
|
||||
href: '/tools/wifi-qr-code',
|
||||
title: 'WLAN-QR-Code-Generator',
|
||||
description: 'Kostenloses Tool – Gäste verbinden sich ohne Passwort-Tippen mit dem Hotel-WLAN.',
|
||||
description: 'Kostenloses Tool - Gäste verbinden sich ohne Passwort-Tippen mit dem Hotel-WLAN.',
|
||||
},
|
||||
],
|
||||
faq: [
|
||||
@@ -611,7 +611,7 @@ export const useCasePagesDe: Record<string, UseCasePageContentDe> = {
|
||||
{
|
||||
question: 'Kann ich denselben Hotel-QR-Code an mehreren Stellen verwenden?',
|
||||
answer:
|
||||
'Ja. Ein Hotel-QR-Code lässt sich in Zimmern, an der Rezeption, auf Flyern und Mitnahme-Materialien wiederverwenden – besonders, wenn das Ziel dynamisch verwaltet wird.',
|
||||
'Ja. Ein Hotel-QR-Code lässt sich in Zimmern, an der Rezeption, auf Flyern und Mitnahme-Materialien wiederverwenden - besonders, wenn das Ziel dynamisch verwaltet wird.',
|
||||
},
|
||||
],
|
||||
heroImage: '/marketing/use-cases/qr-codes-for-hotel.png',
|
||||
@@ -625,18 +625,18 @@ export const useCasePagesDe: Record<string, UseCasePageContentDe> = {
|
||||
title: 'QR-Codes für Friseure & Barbershops',
|
||||
cluster: 'barbershops',
|
||||
summary:
|
||||
'Ein stabiler QR-Code für Terminbuchung, Warteliste und Treueangebote – während der Druck aktuell bleibt.',
|
||||
'Ein stabiler QR-Code für Terminbuchung, Warteliste und Treueangebote - während der Druck aktuell bleibt.',
|
||||
parentHref: '/dynamic-qr-code-generator',
|
||||
parentTitle: 'Dynamischer QR-Code-Generator',
|
||||
ctaLabel: 'QR-Code für Ihren Salon erstellen',
|
||||
eyebrow: 'Friseure & Barbershops',
|
||||
titleSuffix: 'für Terminbuchung, Warteliste und Treueangebote',
|
||||
metaDescription:
|
||||
'Mit QR-Codes im Friseursalon leiten Sie Kunden zu Buchungsseiten, Wartelisten und Treueangeboten – ohne gedruckte Karten zu ersetzen.',
|
||||
'Mit QR-Codes im Friseursalon leiten Sie Kunden zu Buchungsseiten, Wartelisten und Treueangeboten - ohne gedruckte Karten zu ersetzen.',
|
||||
intro:
|
||||
'QR-Codes im Friseursalon funktionieren am besten, wenn der Code an Stühlen, Spiegeln und Theke fix bleibt, während sich das Buchungs- oder Treueziel dahinter ändert.',
|
||||
answer:
|
||||
'Ein Friseur-QR-Code sollte Kunden zur aktuellen Terminbuchung, Warteliste oder zum Treueprogramm führen – aktualisierbar, ohne gedruckte Karten zu ersetzen.',
|
||||
'Ein Friseur-QR-Code sollte Kunden zur aktuellen Terminbuchung, Warteliste oder zum Treueprogramm führen - aktualisierbar, ohne gedruckte Karten zu ersetzen.',
|
||||
whenToUse: [
|
||||
'Buchungsseite, Warteliste oder Treueangebot ändern sich häufiger als Ihre gedruckten Karten.',
|
||||
'Ein QR-Code soll an Stühlen, Theke, Empfang und auf Follow-up-Karten funktionieren.',
|
||||
@@ -659,7 +659,7 @@ export const useCasePagesDe: Record<string, UseCasePageContentDe> = {
|
||||
{
|
||||
title: 'Aktuelle Terminbuchung',
|
||||
description:
|
||||
'Leiten Sie Scanner auf die aktuelle Buchungs- oder Wartelisten-Seite – der nächste Schritt ist die Terminbestätigung, nicht der Rückruf.',
|
||||
'Leiten Sie Scanner auf die aktuelle Buchungs- oder Wartelisten-Seite - der nächste Schritt ist die Terminbestätigung, nicht der Rückruf.',
|
||||
},
|
||||
{
|
||||
title: 'Angebots-Updates',
|
||||
@@ -675,7 +675,7 @@ export const useCasePagesDe: Record<string, UseCasePageContentDe> = {
|
||||
checklistTitle: 'Salon-QR-Checkliste',
|
||||
checklist: [
|
||||
'Wählen Sie eine klare Kundenaktion nach dem Scan, damit der Zweck des QR-Codes eindeutig bleibt.',
|
||||
'Machen Sie die Buchungsseite mobil-optimiert – die meisten Scans passieren am Stuhl oder an der Theke.',
|
||||
'Machen Sie die Buchungsseite mobil-optimiert - die meisten Scans passieren am Stuhl oder an der Theke.',
|
||||
"Verwenden Sie CTA-Texte wie 'Scannen zum Buchen' oder 'Scannen für aktuelle Angebote'.",
|
||||
'Testen Sie Platzierung und Druckgröße, bevor Sie eine große Auflage bestellen.',
|
||||
],
|
||||
@@ -729,18 +729,18 @@ export const useCasePagesDe: Record<string, UseCasePageContentDe> = {
|
||||
title: 'QR-Codes für Visitenkarten',
|
||||
cluster: 'business-cards',
|
||||
summary:
|
||||
'Führen Sie Kontakte zu einem aktuellen Profil, einer Buchungsseite oder vCard – ohne Karten neu zu drucken.',
|
||||
'Führen Sie Kontakte zu einem aktuellen Profil, einer Buchungsseite oder vCard - ohne Karten neu zu drucken.',
|
||||
parentHref: '/dynamic-qr-code-generator',
|
||||
parentTitle: 'Dynamischer QR-Code-Generator',
|
||||
ctaLabel: 'Visitenkarten-QR-Code erstellen',
|
||||
eyebrow: 'Visitenkarten',
|
||||
titleSuffix: 'zum Kontakte-Teilen, für Terminbuchung und Portfolio-Links',
|
||||
metaDescription:
|
||||
'Mit QR-Codes auf Visitenkarten teilen Sie eine aktuelle Kontaktseite, vCard, Buchungsseite oder Ihr Portfolio – ohne Karten neu zu drucken.',
|
||||
'Mit QR-Codes auf Visitenkarten teilen Sie eine aktuelle Kontaktseite, vCard, Buchungsseite oder Ihr Portfolio - ohne Karten neu zu drucken.',
|
||||
intro:
|
||||
'QR-Codes auf Visitenkarten sind am nützlichsten, wenn sich Ihr Kontaktziel schneller ändert als Ihr gedruckter Kartenvorrat.',
|
||||
answer:
|
||||
'Ein Visitenkarten-QR-Code sollte Menschen zur heute besten nächsten Aktion führen – sei es Ihren Kontakt speichern, einen Termin buchen oder Ihr aktuelles Profil besuchen.',
|
||||
'Ein Visitenkarten-QR-Code sollte Menschen zur heute besten nächsten Aktion führen - sei es Ihren Kontakt speichern, einen Termin buchen oder Ihr aktuelles Profil besuchen.',
|
||||
whenToUse: [
|
||||
'Ihre Rolle, Ihr Buchungslink oder Ihr Portfolio ändern sich häufiger als Ihre gedruckten Karten.',
|
||||
'Eine Karte soll für Networking, Vertriebs-Follow-up und Kontakt-Speichern gleichzeitig funktionieren.',
|
||||
@@ -763,7 +763,7 @@ export const useCasePagesDe: Record<string, UseCasePageContentDe> = {
|
||||
{
|
||||
title: 'Aktueller Kontakt-Flow',
|
||||
description:
|
||||
'Leiten Sie Scanner zu einer vCard oder aktuellen Kontaktseite – der nächste Schritt ist Speichern, nicht Abtippen.',
|
||||
'Leiten Sie Scanner zu einer vCard oder aktuellen Kontaktseite - der nächste Schritt ist Speichern, nicht Abtippen.',
|
||||
},
|
||||
{
|
||||
title: 'Rollen- oder Profil-Updates',
|
||||
@@ -779,7 +779,7 @@ export const useCasePagesDe: Record<string, UseCasePageContentDe> = {
|
||||
checklistTitle: 'Visitenkarten-QR-Checkliste',
|
||||
checklist: [
|
||||
'Wählen Sie eine primäre Aktion nach dem Scan, statt jeden Scanner überallhin gleichzeitig zu schicken.',
|
||||
'Machen Sie die Landingpage mobil nutzbar – die meisten Visitenkarten-Scans passieren am Smartphone.',
|
||||
'Machen Sie die Landingpage mobil nutzbar - die meisten Visitenkarten-Scans passieren am Smartphone.',
|
||||
"Nutzen Sie CTA-Texte wie 'Scannen und Kontakt speichern' oder 'Scannen für Terminbuchung'.",
|
||||
'Testen Sie Druckgröße und Kontrast, bevor Sie eine große Auflage bestellen.',
|
||||
],
|
||||
@@ -851,13 +851,13 @@ export const useCasePagesDe: Record<string, UseCasePageContentDe> = {
|
||||
{ label: 'Kreativ-Tests', text: 'Standardmäßig schwach', value: true },
|
||||
],
|
||||
howToSteps: [
|
||||
'Erstellen Sie einen Flyer-QR-Flow pro Angebot oder Platzierungs-Cluster – nicht einen Code für alle Kampagnen für immer.',
|
||||
'Erstellen Sie einen Flyer-QR-Flow pro Angebot oder Platzierungs-Cluster - nicht einen Code für alle Kampagnen für immer.',
|
||||
'Nutzen Sie ein dynamisches Ziel oder getaggte URLs, damit sich die Landingpage ohne neuen Druck ändern lässt.',
|
||||
'Tracken Sie den Scan-Kontext nach Verteilpunkt, Stadtteil oder Kreativ-Version, bevor Sie entscheiden, was skaliert.',
|
||||
],
|
||||
workflowTitle: 'Was Flyer-QR-Codes messbar machen sollten',
|
||||
workflowIntro:
|
||||
'Flyer sind leicht zu drucken und schwer auszuwerten – außer, das QR-Setup ist von Anfang an auf Vergleichbarkeit ausgelegt.',
|
||||
'Flyer sind leicht zu drucken und schwer auszuwerten - außer, das QR-Setup ist von Anfang an auf Vergleichbarkeit ausgelegt.',
|
||||
workflowCards: [
|
||||
{
|
||||
title: 'Platzierungs-bewusste Kampagnen',
|
||||
@@ -913,7 +913,7 @@ export const useCasePagesDe: Record<string, UseCasePageContentDe> = {
|
||||
{
|
||||
question: 'Worauf sollte ein Flyer-QR-Code verlinken?',
|
||||
answer:
|
||||
'Auf die eine nächste Aktion, die der Flyer verspricht – z.B. eine Anmelde-, Angebots-, Buchungs- oder Kampagnen-Landingpage.',
|
||||
'Auf die eine nächste Aktion, die der Flyer verspricht - z.B. eine Anmelde-, Angebots-, Buchungs- oder Kampagnen-Landingpage.',
|
||||
},
|
||||
],
|
||||
heroImage: '/marketing/use-cases/flyer-qr-codes.png',
|
||||
@@ -934,11 +934,11 @@ export const useCasePagesDe: Record<string, UseCasePageContentDe> = {
|
||||
eyebrow: 'Verpackungen',
|
||||
titleSuffix: 'für Produkt-Support, Beileger und Post-Purchase-Journeys',
|
||||
metaDescription:
|
||||
'Mit Verpackungs-QR-Codes leiten Sie Käufer zu Anleitungen, Support, Onboarding oder Angeboten nach dem Kauf – und halten Scans messbar.',
|
||||
'Mit Verpackungs-QR-Codes leiten Sie Käufer zu Anleitungen, Support, Onboarding oder Angeboten nach dem Kauf - und halten Scans messbar.',
|
||||
intro:
|
||||
'Verpackungs-QR-Codes sind am wertvollsten, wenn sie mehr tun, als Nutzer auf eine Startseite zu schicken: Sie sollten die Produkt-Journey nach dem Kauf unterstützen und sichtbar machen, was tatsächlich gescannt wird.',
|
||||
answer:
|
||||
'Ein Verpackungs-QR-Code verbindet das physische Produkt mit einem nützlichen Ziel nach dem Kauf – Einrichtungshilfe, Anleitungen, Registrierung, Support oder Follow-up-Inhalte, die sich später aktualisieren lassen.',
|
||||
'Ein Verpackungs-QR-Code verbindet das physische Produkt mit einem nützlichen Ziel nach dem Kauf - Einrichtungshilfe, Anleitungen, Registrierung, Support oder Follow-up-Inhalte, die sich später aktualisieren lassen.',
|
||||
whenToUse: [
|
||||
'Verpackungen, Etiketten oder Beileger sollen auf sich ändernde Support- oder Onboarding-Seiten verweisen.',
|
||||
'Sie möchten Scan-Transparenz nach Produktlinie, SKU-Familie oder Kampagnen-Charge.',
|
||||
@@ -961,12 +961,12 @@ export const useCasePagesDe: Record<string, UseCasePageContentDe> = {
|
||||
{
|
||||
title: 'Support- und Einrichtungs-Routing',
|
||||
description:
|
||||
'Führen Sie Neukunden zur richtigen Einrichtungsanleitung, zum Handbuch, Garantie-Flow oder Support-Einstieg – ohne dass sie suchen müssen.',
|
||||
'Führen Sie Neukunden zur richtigen Einrichtungsanleitung, zum Handbuch, Garantie-Flow oder Support-Einstieg - ohne dass sie suchen müssen.',
|
||||
},
|
||||
{
|
||||
title: 'Chargen- oder Produkt-Analytics',
|
||||
description:
|
||||
'Erfassen Sie, welche Produkte, Beileger oder Verpackungslinien Scans erzeugen – so sehen Sie, wo Post-Purchase-Engagement wirklich stattfindet.',
|
||||
'Erfassen Sie, welche Produkte, Beileger oder Verpackungslinien Scans erzeugen - so sehen Sie, wo Post-Purchase-Engagement wirklich stattfindet.',
|
||||
},
|
||||
{
|
||||
title: 'Angebots- und Content-Updates',
|
||||
@@ -1017,7 +1017,7 @@ export const useCasePagesDe: Record<string, UseCasePageContentDe> = {
|
||||
{
|
||||
question: 'Sollten Verpackungs-QR-Codes dynamisch sein?',
|
||||
answer:
|
||||
'Ja – immer dann, wenn sich Produktdokumentation, App-Links, Support-Flows oder Aktions-Ziele nach dem Verpackungsdruck ändern können.',
|
||||
'Ja - immer dann, wenn sich Produktdokumentation, App-Links, Support-Flows oder Aktions-Ziele nach dem Verpackungsdruck ändern können.',
|
||||
},
|
||||
],
|
||||
heroImage: '/marketing/use-cases/packaging-qr-codes.png',
|
||||
@@ -1040,7 +1040,7 @@ export const useCasePagesDe: Record<string, UseCasePageContentDe> = {
|
||||
metaDescription:
|
||||
'Mit Feedback-QR-Codes erfassen Sie Kundenmeinungen im Moment, leiten in Bewertungs-Flows und messen, welche Platzierungen Feedback bringen.',
|
||||
intro:
|
||||
'Feedback-QR-Codes funktionieren am besten, wenn sie die Hürde vor der Bewertung oder Antwort senken – und trotzdem messbar bleibt, welche Platzierungen wirklich Reaktionen auslösen.',
|
||||
'Feedback-QR-Codes funktionieren am besten, wenn sie die Hürde vor der Bewertung oder Antwort senken - und trotzdem messbar bleibt, welche Platzierungen wirklich Reaktionen auslösen.',
|
||||
answer:
|
||||
'Ein Feedback-QR-Code macht es Kunden leicht, im Moment eine Rückmeldung zu geben, und liefert Ihrem Team genug Kontext, um Standorte, Flächen und Follow-up-Performance zu vergleichen.',
|
||||
whenToUse: [
|
||||
@@ -1054,7 +1054,7 @@ export const useCasePagesDe: Record<string, UseCasePageContentDe> = {
|
||||
{ label: 'Bewertungs-Steuerung', text: 'Schwer zu justieren', value: true },
|
||||
],
|
||||
howToSteps: [
|
||||
'Platzieren Sie Feedback-QR-Codes dort, wo Kunden direkt nach dem Erlebnis handeln können – nicht Stunden später.',
|
||||
'Platzieren Sie Feedback-QR-Codes dort, wo Kunden direkt nach dem Erlebnis handeln können - nicht Stunden später.',
|
||||
'Leiten Sie den Scan in den passenden Feedback- oder Bewertungs-Flow für den jeweiligen Kontext.',
|
||||
'Tracken Sie Scans und Antworten pro Platzierung, damit Sie wissen, welche Flächen weiter bedruckt werden sollten.',
|
||||
],
|
||||
@@ -1065,7 +1065,7 @@ export const useCasePagesDe: Record<string, UseCasePageContentDe> = {
|
||||
{
|
||||
title: 'Feedback im Servicemoment',
|
||||
description:
|
||||
'Erfassen Sie Antworten, solange der Kunde noch vor Ort ist – am Tisch, an der Kasse oder direkt nach dem Kauf.',
|
||||
'Erfassen Sie Antworten, solange der Kunde noch vor Ort ist - am Tisch, an der Kasse oder direkt nach dem Kauf.',
|
||||
},
|
||||
{
|
||||
title: 'Bewertungs-Routing',
|
||||
@@ -1144,7 +1144,7 @@ export const useCasePagesDe: Record<string, UseCasePageContentDe> = {
|
||||
metaDescription:
|
||||
'Mit QR-Codes für Bewertungen leiten Sie zufriedene Kunden in den richtigen Bewertungs-Flow und messen, welche Platzierungen gescannt werden.',
|
||||
intro:
|
||||
'Bewertungs-QR-Codes funktionieren, wenn die Bitte genau in dem Moment erscheint, in dem der Kunde bereit ist zu antworten – und wenn sich jede Platzierung später auswerten lässt.',
|
||||
'Bewertungs-QR-Codes funktionieren, wenn die Bitte genau in dem Moment erscheint, in dem der Kunde bereit ist zu antworten - und wenn sich jede Platzierung später auswerten lässt.',
|
||||
answer:
|
||||
'Ein Bewertungs-QR-Code führt zufriedene Kunden in den passenden Bewertungs- oder Feedback-Flow und hilft Ihrem Team zu vergleichen, welche physischen Hinweise tatsächlich gescannt werden.',
|
||||
whenToUse: [
|
||||
@@ -1164,7 +1164,7 @@ export const useCasePagesDe: Record<string, UseCasePageContentDe> = {
|
||||
],
|
||||
workflowTitle: 'Bewertungs-Anfragen, die sich nach dem Launch verbessern lassen',
|
||||
workflowIntro:
|
||||
'Die beste Bewertungsanfrage ist nicht lauter – sie ist besser platziert, besser geroutet und gut genug gemessen, um die nächste Auflage zu verbessern.',
|
||||
'Die beste Bewertungsanfrage ist nicht lauter - sie ist besser platziert, besser geroutet und gut genug gemessen, um die nächste Auflage zu verbessern.',
|
||||
workflowCards: [
|
||||
{
|
||||
title: 'Zum Moment passende Hinweise',
|
||||
@@ -1174,7 +1174,7 @@ export const useCasePagesDe: Record<string, UseCasePageContentDe> = {
|
||||
{
|
||||
title: 'Kontrolliertes Bewertungs-Routing',
|
||||
description:
|
||||
'Leiten Sie zufriedene Kunden zum gewünschten Bewertungsziel – mit der Option, die Route zu ändern, wenn sich Plattform, Kampagne oder Richtlinie ändern.',
|
||||
'Leiten Sie zufriedene Kunden zum gewünschten Bewertungsziel - mit der Option, die Route zu ändern, wenn sich Plattform, Kampagne oder Richtlinie ändern.',
|
||||
},
|
||||
{
|
||||
title: 'Reporting pro Platzierung',
|
||||
@@ -1211,7 +1211,7 @@ export const useCasePagesDe: Record<string, UseCasePageContentDe> = {
|
||||
{
|
||||
question: 'Was ist ein Bewertungs-QR-Code?',
|
||||
answer:
|
||||
'Ein Bewertungs-QR-Code führt Kunden von einem gedruckten Hinweis in einen Bewertungs- oder Feedback-Flow – etwa einen Google-Bewertungslink, ein privates Formular oder eine geroutete Follow-up-Seite.',
|
||||
'Ein Bewertungs-QR-Code führt Kunden von einem gedruckten Hinweis in einen Bewertungs- oder Feedback-Flow - etwa einen Google-Bewertungslink, ein privates Formular oder eine geroutete Follow-up-Seite.',
|
||||
},
|
||||
{
|
||||
question: 'Wo sollte ich QR-Codes zum Bewertungen-Sammeln platzieren?',
|
||||
@@ -1221,12 +1221,12 @@ export const useCasePagesDe: Record<string, UseCasePageContentDe> = {
|
||||
{
|
||||
question: 'Sollten Bewertungs-QR-Codes dynamisch sein?',
|
||||
answer:
|
||||
'Ja – wenn Sie das Bewertungsziel aktualisieren, Platzierungen testen oder Kunden anders routen müssen, während das gedruckte Material bereits im Umlauf ist.',
|
||||
'Ja - wenn Sie das Bewertungsziel aktualisieren, Platzierungen testen oder Kunden anders routen müssen, während das gedruckte Material bereits im Umlauf ist.',
|
||||
},
|
||||
{
|
||||
question: 'Kann ich Scans von Bewertungs-QR-Codes tracken?',
|
||||
answer:
|
||||
'Ja. Ein trackbares Setup zeigt, welche Platzierungen oder Standorte Scans erzeugen – die eigentliche Bewertung wird weiterhin auf der Zielplattform oder im Formular abgegeben.',
|
||||
'Ja. Ein trackbares Setup zeigt, welche Platzierungen oder Standorte Scans erzeugen - die eigentliche Bewertung wird weiterhin auf der Zielplattform oder im Formular abgegeben.',
|
||||
},
|
||||
],
|
||||
heroImage: '/marketing/use-cases/qr-codes-for-review-collection.png',
|
||||
@@ -1247,11 +1247,11 @@ export const useCasePagesDe: Record<string, UseCasePageContentDe> = {
|
||||
eyebrow: 'Zahlungen',
|
||||
titleSuffix: 'für mobiles Bezahlen, Theken-Zahlungen und gedruckte Hinweise',
|
||||
metaDescription:
|
||||
'Mit Zahlungs-QR-Codes leiten Sie Kunden in eine mobile Zahlungsaktion, die aktuell bleibt – auch wenn sich Links oder Abläufe ändern.',
|
||||
'Mit Zahlungs-QR-Codes leiten Sie Kunden in eine mobile Zahlungsaktion, die aktuell bleibt - auch wenn sich Links oder Abläufe ändern.',
|
||||
intro:
|
||||
'Zahlungs-QR-Codes sind am nützlichsten, wenn der gedruckte Hinweis einfach bleibt, während sich das Zahlungsziel dahinter mit dem Geschäft ändern kann.',
|
||||
answer:
|
||||
'Ein Zahlungs-QR-Code sollte den Scanner direkt in die gewünschte mobile Zahlungsaktion führen – ohne dass das Unternehmen bei jeder Änderung des Zahlungsflows gedruckte Hinweise ersetzen muss.',
|
||||
'Ein Zahlungs-QR-Code sollte den Scanner direkt in die gewünschte mobile Zahlungsaktion führen - ohne dass das Unternehmen bei jeder Änderung des Zahlungsflows gedruckte Hinweise ersetzen muss.',
|
||||
whenToUse: [
|
||||
'Sie nutzen gedruckte Zahlungshinweise an Theken, auf Tischen, Rechnungen oder Auslage-Materialien.',
|
||||
'Sie brauchen einen mobilen Zahlungsweg, statt Kunden lange URLs abtippen zu lassen.',
|
||||
@@ -1274,7 +1274,7 @@ export const useCasePagesDe: Record<string, UseCasePageContentDe> = {
|
||||
{
|
||||
title: 'Theken- und Tisch-Zahlungen',
|
||||
description:
|
||||
'Bringen Sie Kunden mit gedruckten QR-Hinweisen in einen schnellen mobilen Zahlungsschritt – ohne manuelle URL-Eingabe.',
|
||||
'Bringen Sie Kunden mit gedruckten QR-Hinweisen in einen schnellen mobilen Zahlungsschritt - ohne manuelle URL-Eingabe.',
|
||||
},
|
||||
{
|
||||
title: 'Rechnungs- und Auslage-Flows',
|
||||
@@ -1320,7 +1320,7 @@ export const useCasePagesDe: Record<string, UseCasePageContentDe> = {
|
||||
{
|
||||
question: 'Sollten Zahlungs-QR-Codes dynamisch sein?',
|
||||
answer:
|
||||
'Ja – wenn sich Zahlungsziel, Anbieter oder Checkout-Flow ändern können, während der gedruckte Code bereits im Einsatz ist.',
|
||||
'Ja - wenn sich Zahlungsziel, Anbieter oder Checkout-Flow ändern können, während der gedruckte Code bereits im Einsatz ist.',
|
||||
},
|
||||
{
|
||||
question: 'Wo funktionieren Zahlungs-QR-Codes am besten?',
|
||||
@@ -1339,7 +1339,7 @@ export const useCasePagesDe: Record<string, UseCasePageContentDe> = {
|
||||
title: 'QR-Codes für Coupons',
|
||||
cluster: 'offers',
|
||||
summary:
|
||||
'Verbinden Sie Coupon-Platzierungen mit messbaren Scans – so wissen Sie, welche Print-Angebote wirklich eingelöst werden.',
|
||||
'Verbinden Sie Coupon-Platzierungen mit messbaren Scans - so wissen Sie, welche Print-Angebote wirklich eingelöst werden.',
|
||||
parentHref: '/qr-code-tracking',
|
||||
parentTitle: 'QR-Code-Tracking',
|
||||
ctaLabel: 'Coupon-QR-Code erstellen',
|
||||
@@ -1350,7 +1350,7 @@ export const useCasePagesDe: Record<string, UseCasePageContentDe> = {
|
||||
intro:
|
||||
'Coupon-QR-Codes sind am stärksten, wenn der Rabatt-Pfad aktuell bleibt und Ihr Team sieht, welche Print-Platzierungen tatsächlich Einlösungen erzeugen.',
|
||||
answer:
|
||||
'Ein Coupon-QR-Code verbindet ein gedrucktes Angebot mit einem später aktualisierbaren Landing- oder Einlösungs-Flow – mit genug Tracking-Kontext, um Platzierungen und Aktionswellen zu vergleichen.',
|
||||
'Ein Coupon-QR-Code verbindet ein gedrucktes Angebot mit einem später aktualisierbaren Landing- oder Einlösungs-Flow - mit genug Tracking-Kontext, um Platzierungen und Aktionswellen zu vergleichen.',
|
||||
whenToUse: [
|
||||
'Sie schalten Rabatte auf Flyern, Kassenbons, Beilegern, Plakaten oder lokalen Print-Kampagnen.',
|
||||
'Sie möchten vergleichen, welche gedruckten Angebots-Platzierungen Scans oder Einlösungen bringen.',
|
||||
@@ -1378,7 +1378,7 @@ export const useCasePagesDe: Record<string, UseCasePageContentDe> = {
|
||||
{
|
||||
title: 'Platzierungs-Reporting',
|
||||
description:
|
||||
'Vergleichen Sie, wo Coupons gescannt oder eingelöst werden – damit Plakate, Flyer, Beileger und Bons keine vermischte Quelle mehr sind.',
|
||||
'Vergleichen Sie, wo Coupons gescannt oder eingelöst werden - damit Plakate, Flyer, Beileger und Bons keine vermischte Quelle mehr sind.',
|
||||
},
|
||||
{
|
||||
title: 'Einlösungs-fokussiertes Follow-up',
|
||||
@@ -1424,7 +1424,7 @@ export const useCasePagesDe: Record<string, UseCasePageContentDe> = {
|
||||
{
|
||||
question: 'Sollte ein Coupon-QR-Code dynamisch sein?',
|
||||
answer:
|
||||
'Ja – wenn sich Aktion, Landingpage oder Einlösungs-Flow ändern können, während das gedruckte Material noch im Umlauf ist.',
|
||||
'Ja - wenn sich Aktion, Landingpage oder Einlösungs-Flow ändern können, während das gedruckte Material noch im Umlauf ist.',
|
||||
},
|
||||
],
|
||||
heroImage: '/marketing/use-cases/coupon-qr-codes.png',
|
||||
|
||||
@@ -243,7 +243,7 @@ export const allUseCases: UseCaseLink[] = [
|
||||
},
|
||||
];
|
||||
|
||||
// Slugs that 301-redirect elsewhere (see next.config.mjs) — must not be
|
||||
// Slugs that 301-redirect elsewhere (see next.config.mjs) - must not be
|
||||
// linked from nav, homepage, or sitemap.
|
||||
const redirectedUseCaseSlugs = ['restaurant-menu-qr-codes'];
|
||||
|
||||
@@ -1052,7 +1052,7 @@ export const useCasePageContent: Record<string, UseCasePageContent> = {
|
||||
{
|
||||
title: 'Employee and event feedback',
|
||||
description:
|
||||
'Use break-room posters, badge inserts, or post-event handouts to collect internal or attendee feedback anonymously — without email lists or logins.',
|
||||
'Use break-room posters, badge inserts, or post-event handouts to collect internal or attendee feedback anonymously - without email lists or logins.',
|
||||
},
|
||||
],
|
||||
checklistTitle: 'Feedback QR checklist',
|
||||
@@ -1113,7 +1113,7 @@ export const useCasePageContent: Record<string, UseCasePageContent> = {
|
||||
{
|
||||
question: 'Should feedback be anonymous or personalized?',
|
||||
answer:
|
||||
'Anonymous forms get more honest responses and work well for employee or in-store feedback. Personalized flows (with an order or table number in the destination URL) let you follow up on specific experiences. The QR code itself works the same either way — the difference is the form it points to.',
|
||||
'Anonymous forms get more honest responses and work well for employee or in-store feedback. Personalized flows (with an order or table number in the destination URL) let you follow up on specific experiences. The QR code itself works the same either way - the difference is the form it points to.',
|
||||
},
|
||||
{
|
||||
question: 'Can I use feedback QR codes for events?',
|
||||
@@ -1123,7 +1123,7 @@ export const useCasePageContent: Record<string, UseCasePageContent> = {
|
||||
{
|
||||
question: 'Can I use QR codes for employee feedback?',
|
||||
answer:
|
||||
'Yes. Break rooms, notice boards, and shift handout sheets are common placements. An anonymous form behind the QR code lowers the barrier for honest internal feedback — no login, no email trail.',
|
||||
'Yes. Break rooms, notice boards, and shift handout sheets are common placements. An anonymous form behind the QR code lowers the barrier for honest internal feedback - no login, no email trail.',
|
||||
},
|
||||
],
|
||||
heroImage: '/marketing/use-cases/feedback-qr-codes.png',
|
||||
|
||||
@@ -624,7 +624,7 @@ export const allIndustries: IndustryPage[] = [
|
||||
metaTitle: "QR Codes for Yoga Studios: Class Schedule & Intro Offers",
|
||||
metaDescription: "Fill your yoga classes faster with QR codes linking to schedules, intro offers, and instructor profiles. Perfect for studio entrance and social media.",
|
||||
headline: "QR Codes for Yoga Studios: Fill Every Class and Reduce No-Shows",
|
||||
subheadline: "Let new students book their intro class, view the weekly schedule, and find the right instructor with one scan — no app download required",
|
||||
subheadline: "Let new students book their intro class, view the weekly schedule, and find the right instructor with one scan - no app download required",
|
||||
heroImage: "/marketing/industries/yoga-studios.png",
|
||||
statistics: [
|
||||
{ value: "73%", label: "of yoga studios use QR codes for class bookings (Mindbody, 2024)" },
|
||||
@@ -635,7 +635,7 @@ export const allIndustries: IndustryPage[] = [
|
||||
{ title: "First-Visit Funnels", description: "A QR code at the studio entrance links curious passersby to your intro offer and booking form - capturing leads 24 hours a day." },
|
||||
{ title: "Live Class Schedules", description: "Students scan the door poster or social post to see this week's schedule and available spots, then book directly without calling." },
|
||||
{ title: "Instructor Profiles", description: "Help students find the right teacher. Link a studio QR to instructor bio pages with teaching style, certifications, and class specialties." },
|
||||
{ title: "Automated Booking Reminders", description: "Link your QR code to Mindbody, Pike13, or any booking platform that sends SMS and email reminders — turning casual sign-ups into confirmed attendees." }
|
||||
{ title: "Automated Booking Reminders", description: "Link your QR code to Mindbody, Pike13, or any booking platform that sends SMS and email reminders - turning casual sign-ups into confirmed attendees." }
|
||||
],
|
||||
useCases: [
|
||||
"Weekly class schedule with live booking availability",
|
||||
@@ -649,9 +649,9 @@ export const allIndustries: IndustryPage[] = [
|
||||
{ question: "How do yoga studios attract new students with QR codes?", answer: "A QR on the studio window or door links to an intro offer - like a first-week free deal - that captures email and converts walk-by traffic to bookings." },
|
||||
{ question: "Can QR codes reduce class no-shows?", answer: "Yes, linking to a booking system that sends automated reminders significantly reduces no-show rates compared to informal reservations." },
|
||||
{ question: "Where should yoga studio QR codes be placed?", answer: "Studio entrance door, mat storage area, and any printed flyers or community boards in the surrounding neighborhood." },
|
||||
{ question: "Can I use a QR code for class sign-ups and waitlists?", answer: "Yes. Link your QR to Mindbody, Pike13, or any booking platform that supports waitlists. When a spot opens, waitlisted students get notified automatically — no manual follow-up needed." },
|
||||
{ question: "Can I use a QR code for class sign-ups and waitlists?", answer: "Yes. Link your QR to Mindbody, Pike13, or any booking platform that supports waitlists. When a spot opens, waitlisted students get notified automatically - no manual follow-up needed." },
|
||||
{ question: "What's the best way to use QR codes to promote yoga workshops?", answer: "Print a QR on an A5 card and distribute it in the studio, at local health food shops, and on community boards. Link it to a registration page with the workshop details and an early-bird offer to drive urgency." },
|
||||
{ question: "How do yoga studios use QR codes for social media growth?", answer: "Place a QR code near the check-in desk linking to your Instagram or YouTube channel. Students who enjoyed a class scan it to follow you — turning each visit into a long-term digital connection." }
|
||||
{ question: "How do yoga studios use QR codes for social media growth?", answer: "Place a QR code near the check-in desk linking to your Instagram or YouTube channel. Students who enjoyed a class scan it to follow you - turning each visit into a long-term digital connection." }
|
||||
],
|
||||
placementTips: [
|
||||
"Laminated poster on the studio entrance door or window",
|
||||
@@ -693,7 +693,7 @@ export const allIndustries: IndustryPage[] = [
|
||||
{ question: "Can QR codes replace spa brochures?", answer: "Yes, a QR code linking to a digital treatment menu with photos is more current and far cheaper to maintain than printed brochures." },
|
||||
{ question: "Where should spa QR codes be placed?", answer: "Reception desk, waiting area, treatment room doors, and on checkout receipts are the four highest-performing placements for spas." },
|
||||
{ question: "How can spas use QR codes to get more Google reviews?", answer: "Print a QR code on the checkout receipt or a small thank-you card and link it directly to your Google Business review form. Clients who are relaxed and satisfied after a treatment are far more likely to leave a review than if you ask them days later by email." },
|
||||
{ question: "Can a QR code help spas promote seasonal packages?", answer: "Yes. A dynamic QR on your reception display or window can be updated to link to a new seasonal landing page — Christmas packages in December, bridal bundles in spring — without reprinting the code." },
|
||||
{ question: "Can a QR code help spas promote seasonal packages?", answer: "Yes. A dynamic QR on your reception display or window can be updated to link to a new seasonal landing page - Christmas packages in December, bridal bundles in spring - without reprinting the code." },
|
||||
{ question: "How do spas use QR codes for post-treatment product sales?", answer: "Staff hand clients a card after each treatment linking to the exact products used during their session. The client is relaxed and already familiar with the product, making this one of the highest-converting retail moments in any spa." }
|
||||
],
|
||||
placementTips: [
|
||||
@@ -732,7 +732,7 @@ export const allIndustries: IndustryPage[] = [
|
||||
tools: ["url-qr-code", "instagram-qr-code", "vcard-qr-code"],
|
||||
faq: [
|
||||
{ question: "How do beauty salons use QR codes to get more bookings?", answer: "A QR code on the station mirror or checkout counter links directly to the booking platform. Clients rebook while still at the salon, capturing high-intent conversions." },
|
||||
{ question: "Can a QR code replace a printed price list at a salon?", answer: "Yes, link a QR to your service menu page. When prices change, update the page — the physical QR code never needs to be reprinted. The same principle applies across hospitality: <a href=\"/blog/qr-code-restaurant-menu\" class=\"text-blue-600 underline\">see how restaurants handle this →</a>" },
|
||||
{ question: "Can a QR code replace a printed price list at a salon?", answer: "Yes, link a QR to your service menu page. When prices change, update the page - the physical QR code never needs to be reprinted. The same principle applies across hospitality: <a href=\"/blog/qr-code-restaurant-menu\" class=\"text-blue-600 underline\">see how restaurants handle this →</a>" },
|
||||
{ question: "What social platform should beauty salon QR codes link to?", answer: "Instagram is the strongest platform for beauty salons because transformation photos and styling reels perform extremely well there." }
|
||||
],
|
||||
placementTips: [
|
||||
@@ -746,10 +746,10 @@ export const allIndustries: IndustryPage[] = [
|
||||
slug: "barbershops",
|
||||
name: "Barbershops",
|
||||
title: "QR Codes for Barbershops",
|
||||
metaTitle: "QR Codes for Barbershops: Book a Cut, Reduce Waits & Get More Reviews",
|
||||
metaDescription: "Reduce walk-in wait times and fill appointment slots with QR codes for barbershops. Show your portfolio, booking link, and Google reviews in one scan.",
|
||||
metaTitle: "QR Codes for Barbershops: Bookings & Reviews",
|
||||
metaDescription: "A QR on the window lets clients book instead of waiting. A QR at checkout turns a fresh haircut into a Google review. Setup takes minutes and starts free.",
|
||||
headline: "QR Codes for Barbershops: Check the Wait, Book a Cut, Leave a Review",
|
||||
subheadline: "Let clients check current wait time and book their slot before they even walk through the door — and turn every checkout into a 5-star review",
|
||||
subheadline: "Let clients check current wait time and book their slot before they even walk through the door - and turn every checkout into a 5-star review",
|
||||
heroImage: "/marketing/industries/barbershops.jpeg",
|
||||
statistics: [
|
||||
{ value: "35%", label: "Increase in Repeat Bookings from Checkout QR (Square, 2024)" },
|
||||
@@ -760,7 +760,7 @@ export const allIndustries: IndustryPage[] = [
|
||||
{ title: "Live Wait Time Visibility", description: "Link a QR on your shop window to a live wait time or booking page. Clients decide to walk in or book a slot before they commit to waiting." },
|
||||
{ title: "Barber Portfolio", description: "Each barber can have their own QR card showing their personal Instagram or portfolio of cuts - helping clients choose their preferred stylist." },
|
||||
{ title: "Google Review Shortcut", description: "Print a QR code on a small card handed at checkout. Satisfied clients tap once to land on your Google review page - no searching required." },
|
||||
{ title: "Repeat Booking at Checkout", description: "A QR on the payment counter links directly to your booking calendar. Clients rebook their next cut while still in the chair — the single most effective way to reduce gaps between visits." }
|
||||
{ title: "Repeat Booking at Checkout", description: "A QR on the payment counter links directly to your booking calendar. Clients rebook their next cut while still in the chair - the single most effective way to reduce gaps between visits." }
|
||||
],
|
||||
useCases: [
|
||||
"Online booking link from window QR",
|
||||
@@ -774,9 +774,9 @@ export const allIndustries: IndustryPage[] = [
|
||||
{ question: "How do barbershops reduce walk-in wait times with QR codes?", answer: "A QR on the shop window links to your booking system. Clients book a slot instead of waiting, spreading demand more evenly throughout the day." },
|
||||
{ question: "Should each barber have their own QR code?", answer: "For shops with distinct stylists, yes. Individual barber portfolio QR codes help clients pick a preferred barber and follow them on Instagram." },
|
||||
{ question: "What's the best review strategy for barbershops?", answer: "Hand a small card with a Google review QR as clients pay. The experience is freshest in that moment and conversion rates are highest." },
|
||||
{ question: "How do barbers use QR codes to get more appointments?", answer: "Place a QR code sticker on the shop window and a small card on the counter linking to your booking platform (e.g. Booksy, Square, or Fresha). Walk-by foot traffic can book a slot on the spot without calling — converting passive interest into confirmed appointments." },
|
||||
{ question: "Can QR codes help barbershops build a loyal client base?", answer: "Yes. A QR linked to a digital loyalty program lets clients accumulate stamps or rewards without a paper card that gets lost. After 10 visits, they unlock a free cut — and every reminder keeps your shop top of mind." },
|
||||
{ question: "What's the easiest way for a barbershop to collect client intake information?", answer: "Link a QR code in the waiting area to a short digital form asking about preferred barber, style notes, and contact details. Clients complete it on their phone while they wait — saving time when they sit in the chair." }
|
||||
{ question: "How do barbers use QR codes to get more appointments?", answer: "Place a QR code sticker on the shop window and a small card on the counter linking to your booking platform (e.g. Booksy, Square, or Fresha). Walk-by foot traffic can book a slot on the spot without calling - converting passive interest into confirmed appointments." },
|
||||
{ question: "Can QR codes help barbershops build a loyal client base?", answer: "Yes. A QR linked to a digital loyalty program lets clients accumulate stamps or rewards without a paper card that gets lost. After 10 visits, they unlock a free cut - and every reminder keeps your shop top of mind." },
|
||||
{ question: "What's the easiest way for a barbershop to collect client intake information?", answer: "Link a QR code in the waiting area to a short digital form asking about preferred barber, style notes, and contact details. Clients complete it on their phone while they wait - saving time when they sit in the chair." }
|
||||
],
|
||||
placementTips: [
|
||||
"Window sticker for wait time and booking link",
|
||||
@@ -1661,7 +1661,7 @@ export const allIndustries: IndustryPage[] = [
|
||||
{ title: "Instant Lead Capture", description: "A QR on your stand banner links to a contact form with a compelling offer - visitors submit their details in 30 seconds without exchanging business cards." },
|
||||
{ title: "Digital Product Catalogue", description: "Replace printed brochures with a QR linking to a digital catalogue with full specs, pricing, and download options. Update it between shows without reprinting." },
|
||||
{ title: "Giveaway Engagement", description: "Print a QR on branded merchandise giveaways (pens, bags, notepads) so every item taken from the stand is a lead capture touchpoint throughout the event." },
|
||||
{ title: "Post-Show Follow-Up Automation", description: "Link your lead capture QR to a CRM or email automation tool. Every form submission triggers an immediate follow-up sequence — so warm leads stay warm after the show floor closes." }
|
||||
{ title: "Post-Show Follow-Up Automation", description: "Link your lead capture QR to a CRM or email automation tool. Every form submission triggers an immediate follow-up sequence - so warm leads stay warm after the show floor closes." }
|
||||
],
|
||||
useCases: [
|
||||
"Lead capture form linked from stand banner and panel",
|
||||
@@ -1675,9 +1675,9 @@ export const allIndustries: IndustryPage[] = [
|
||||
{ question: "How do trade show exhibitors use QR codes for lead capture?", answer: "A QR on stand panels and giveaways links to a contact form. Visitors submit their details for a free resource - giving exhibitors qualified leads with explicit opt-in." },
|
||||
{ question: "Should trade show QR codes link to a brochure or a form?", answer: "Lead capture form first. The brochure can be on the same page below the form - so visitors get value while you get their contact details." },
|
||||
{ question: "Where are the best QR placements on a trade show stand?", answer: "Stand back panel, table display, and every giveaway item are the three placements with the widest reach at any exhibition." },
|
||||
{ question: "How do I use QR codes to replace business cards at a trade show?", answer: "Create a vCard QR code for each team member at your stand. Visitors scan it to save the full contact — name, role, phone, and email — directly to their phone. No paper, no loss, no manual entry after the event." },
|
||||
{ question: "How do I use QR codes to replace business cards at a trade show?", answer: "Create a vCard QR code for each team member at your stand. Visitors scan it to save the full contact - name, role, phone, and email - directly to their phone. No paper, no loss, no manual entry after the event." },
|
||||
{ question: "Can QR codes help exhibitors qualify leads at a trade show?", answer: "Yes. Add a short qualifying question to your lead capture form (e.g. company size, buying timeline). Visitors self-select, so your sales team receives pre-qualified leads instead of a raw list of email addresses." },
|
||||
{ question: "How can I track which part of my trade show stand generates the most scans?", answer: "Create separate dynamic QR codes for each placement — stand banner, table card, and giveaway items — each with a unique UTM parameter. After the show, compare scan counts in your QR dashboard to see which location drove the most engagement." }
|
||||
{ question: "How can I track which part of my trade show stand generates the most scans?", answer: "Create separate dynamic QR codes for each placement - stand banner, table card, and giveaway items - each with a unique UTM parameter. After the show, compare scan counts in your QR dashboard to see which location drove the most engagement." }
|
||||
],
|
||||
placementTips: [
|
||||
"Stand back panel at eye level with lead capture QR",
|
||||
@@ -1927,7 +1927,7 @@ export const allIndustries: IndustryPage[] = [
|
||||
metaTitle: "QR Codes for Airports: Gates, Maps, Check-In & Retail Offers",
|
||||
metaDescription: "Improve passenger experience at airports with QR codes for live flight status, interactive terminal maps, mobile check-in, and retail promotions.",
|
||||
headline: "QR Codes for Airports: Self-Service Information at Every Terminal Sign",
|
||||
subheadline: "Point travelers to live departures, interactive maps, and mobile check-in directly from terminal signage — reducing queue pressure at information desks and turning dwell time into retail revenue",
|
||||
subheadline: "Point travelers to live departures, interactive maps, and mobile check-in directly from terminal signage - reducing queue pressure at information desks and turning dwell time into retail revenue",
|
||||
heroImage: "/marketing/industries/airports.jpeg",
|
||||
statistics: [
|
||||
{ value: "3x", label: "More QR Code Scans at Airports on Peak Travel Weekends (IATA, 2024)" },
|
||||
@@ -1938,7 +1938,7 @@ export const allIndustries: IndustryPage[] = [
|
||||
{ title: "Live Flight Status Access", description: "QR codes on terminal pillars and gate signage link to the live departures board filtered for the relevant gate area - passengers check status without crowding the screens." },
|
||||
{ title: "Interactive Terminal Maps", description: "A QR at each terminal entrance links to an interactive map showing the passenger's current location, nearest restrooms, gates, and retail options." },
|
||||
{ title: "Gate Dwell-Time Offers", description: "A QR on boarding pass envelopes and gate seating area signs links passengers to retail, food, and lounge offers - turning waiting time into retail revenue." },
|
||||
{ title: "Instant WiFi Access", description: "A QR code at each terminal entry and gate lounge links to airport WiFi credentials. Passengers connect in seconds without staff assistance — reducing one of the most common information desk enquiries." }
|
||||
{ title: "Instant WiFi Access", description: "A QR code at each terminal entry and gate lounge links to airport WiFi credentials. Passengers connect in seconds without staff assistance - reducing one of the most common information desk enquiries." }
|
||||
],
|
||||
useCases: [
|
||||
"Live flight status and departure board at gate signage",
|
||||
@@ -1953,8 +1953,8 @@ export const allIndustries: IndustryPage[] = [
|
||||
{ question: "Can QR codes at airports increase retail revenue?", answer: "Yes, gate area QR codes linking to time-limited retail and food offers during dwell time convert waiting passengers into active shoppers." },
|
||||
{ question: "Where should airport QR codes be placed?", answer: "Terminal entrance signs, gate seating area displays, check-in desk counters, and boarding pass envelopes are the highest-traffic placements." },
|
||||
{ question: "What do airports use QR codes for?", answer: "Modern airports use QR codes across multiple touchpoints: live departure boards, interactive terminal maps, mobile check-in prompts, WiFi access, lounge entry, retail offers, and passenger satisfaction surveys. Each replaces a friction point that previously required staff assistance or printed material." },
|
||||
{ question: "How do QR codes improve the airport passenger experience?", answer: "QR codes give travelers instant access to the information they need — gate numbers, flight status, directions, WiFi — without queuing at a desk or searching on a cluttered departures screen. This reduces stress, especially during delays, and frees up staff to handle more complex passenger needs." },
|
||||
{ question: "Can airports use QR codes for passenger feedback?", answer: "Yes. A QR code at security exits, gate lounges, or baggage claim areas can link to a short satisfaction survey. Airports that collect real-time feedback by location can identify problem areas — such as slow security lanes or confusing signage — and respond before they escalate." }
|
||||
{ question: "How do QR codes improve the airport passenger experience?", answer: "QR codes give travelers instant access to the information they need - gate numbers, flight status, directions, WiFi - without queuing at a desk or searching on a cluttered departures screen. This reduces stress, especially during delays, and frees up staff to handle more complex passenger needs." },
|
||||
{ question: "Can airports use QR codes for passenger feedback?", answer: "Yes. A QR code at security exits, gate lounges, or baggage claim areas can link to a short satisfaction survey. Airports that collect real-time feedback by location can identify problem areas - such as slow security lanes or confusing signage - and respond before they escalate." }
|
||||
],
|
||||
placementTips: [
|
||||
"Terminal entry pillar with interactive map and flight status QR",
|
||||
|
||||
358
src/lib/qr-shapes.ts
Normal file
358
src/lib/qr-shapes.ts
Normal file
@@ -0,0 +1,358 @@
|
||||
/**
|
||||
* QR module and eye shapes as SVG path data.
|
||||
*
|
||||
* Ported from qr-design-showcase.html, which drew to a canvas. SVG was chosen
|
||||
* instead for three reasons: the SVG download becomes a serialisation rather
|
||||
* than a rasterisation, print output stays sharp at any size (the whole point
|
||||
* for a code that ends up on a flyer), and html-to-image can still produce the
|
||||
* PNG from the same DOM node.
|
||||
*
|
||||
* Every function returns path data or a primitive descriptor. Nothing here
|
||||
* touches the DOM, so it can be unit tested and reused server-side later.
|
||||
*/
|
||||
|
||||
export type ModuleShape =
|
||||
| 'square'
|
||||
| 'rounded'
|
||||
| 'dots'
|
||||
| 'classy'
|
||||
| 'classy-rounded'
|
||||
| 'diamond'
|
||||
| 'star'
|
||||
| 'hexagon'
|
||||
| 'plus'
|
||||
| 'mosaic'
|
||||
| 'liquid';
|
||||
|
||||
/**
|
||||
* Only two eye frames ship.
|
||||
*
|
||||
* Measured on 27.07.2026 against OpenCV's decoder, 5 payloads x 3 resolutions:
|
||||
* square 15/15, rounded at radius 0.10 15/15, rounded at radius 0.28 0/15,
|
||||
* and circle, leaf, flower and hexagon 0/15 each. The finder pattern is what a
|
||||
* decoder locks onto first; changing its silhouette breaks the 1:1:3:1:1 ratio
|
||||
* it scans for. Shipping those four would mean handing someone a code that
|
||||
* looks finished and fails on the printed flyer - for an audience whose whole
|
||||
* fear is exactly that.
|
||||
*/
|
||||
export type EyeFrameShape = 'square' | 'rounded';
|
||||
|
||||
/** Measured 5/5 each, except star at 3/5 - which is why star is not here. */
|
||||
export type EyeBallShape =
|
||||
| 'square'
|
||||
| 'rounded'
|
||||
| 'circle'
|
||||
| 'diamond'
|
||||
| 'hexagon';
|
||||
|
||||
/** Shapes available on the Pro plan. Deliberately four, not six. */
|
||||
export const PRO_MODULE_SHAPES: ModuleShape[] = [
|
||||
'square',
|
||||
'rounded',
|
||||
'dots',
|
||||
'classy-rounded',
|
||||
];
|
||||
|
||||
/** Everything else needs Business. */
|
||||
export const BUSINESS_MODULE_SHAPES: ModuleShape[] = [
|
||||
'classy',
|
||||
'diamond',
|
||||
'star',
|
||||
'hexagon',
|
||||
'plus',
|
||||
'mosaic',
|
||||
'liquid',
|
||||
];
|
||||
|
||||
/**
|
||||
* Shapes that reduce the filled area of each module enough to hurt scanning.
|
||||
* Used to force error correction up and to warn before print.
|
||||
*/
|
||||
export const LOW_COVERAGE_SHAPES: ModuleShape[] = [
|
||||
'star',
|
||||
'plus',
|
||||
'diamond',
|
||||
'mosaic',
|
||||
'dots',
|
||||
];
|
||||
|
||||
export const MODULE_SHAPE_LABELS: Record<ModuleShape, string> = {
|
||||
square: 'Square (classic)',
|
||||
rounded: 'Rounded',
|
||||
dots: 'Dots',
|
||||
'classy-rounded': 'Flowing',
|
||||
classy: 'Classy',
|
||||
diamond: 'Diamond',
|
||||
star: 'Star',
|
||||
hexagon: 'Hexagon',
|
||||
plus: 'Plus',
|
||||
mosaic: 'Mosaic',
|
||||
liquid: 'Liquid',
|
||||
};
|
||||
|
||||
export const EYE_FRAME_LABELS: Record<EyeFrameShape, string> = {
|
||||
square: 'Square',
|
||||
rounded: 'Rounded',
|
||||
};
|
||||
|
||||
export const EYE_BALL_LABELS: Record<EyeBallShape, string> = {
|
||||
square: 'Square',
|
||||
rounded: 'Rounded',
|
||||
circle: 'Circle',
|
||||
diamond: 'Diamond',
|
||||
hexagon: 'Hexagon',
|
||||
};
|
||||
|
||||
const n = (v: number) => Math.round(v * 1000) / 1000;
|
||||
|
||||
/** Rounded rectangle with independently sized corners. */
|
||||
export function roundedRectPath(
|
||||
x: number,
|
||||
y: number,
|
||||
w: number,
|
||||
h: number,
|
||||
tl: number,
|
||||
tr: number,
|
||||
br: number,
|
||||
bl: number
|
||||
): string {
|
||||
return [
|
||||
`M${n(x + tl)},${n(y)}`,
|
||||
`L${n(x + w - tr)},${n(y)}`,
|
||||
tr ? `A${n(tr)},${n(tr)} 0 0 1 ${n(x + w)},${n(y + tr)}` : `L${n(x + w)},${n(y)}`,
|
||||
`L${n(x + w)},${n(y + h - br)}`,
|
||||
br ? `A${n(br)},${n(br)} 0 0 1 ${n(x + w - br)},${n(y + h)}` : `L${n(x + w)},${n(y + h)}`,
|
||||
`L${n(x + bl)},${n(y + h)}`,
|
||||
bl ? `A${n(bl)},${n(bl)} 0 0 1 ${n(x)},${n(y + h - bl)}` : `L${n(x)},${n(y + h)}`,
|
||||
`L${n(x)},${n(y + tl)}`,
|
||||
tl ? `A${n(tl)},${n(tl)} 0 0 1 ${n(x + tl)},${n(y)}` : `L${n(x)},${n(y)}`,
|
||||
'Z',
|
||||
].join(' ');
|
||||
}
|
||||
|
||||
export function hexagonPath(cx: number, cy: number, r: number): string {
|
||||
const pts: string[] = [];
|
||||
for (let i = 0; i < 6; i++) {
|
||||
const a = (Math.PI / 180) * (60 * i - 30);
|
||||
pts.push(`${n(cx + r * Math.cos(a))},${n(cy + r * Math.sin(a))}`);
|
||||
}
|
||||
return `M${pts.join(' L')} Z`;
|
||||
}
|
||||
|
||||
export function starPath(
|
||||
cx: number,
|
||||
cy: number,
|
||||
outerR: number,
|
||||
innerR: number,
|
||||
spikes = 5
|
||||
): string {
|
||||
let rot = (Math.PI / 2) * 3;
|
||||
const step = Math.PI / spikes;
|
||||
const pts: string[] = [`${n(cx)},${n(cy - outerR)}`];
|
||||
for (let i = 0; i < spikes; i++) {
|
||||
pts.push(`${n(cx + Math.cos(rot) * outerR)},${n(cy + Math.sin(rot) * outerR)}`);
|
||||
rot += step;
|
||||
pts.push(`${n(cx + Math.cos(rot) * innerR)},${n(cy + Math.sin(rot) * innerR)}`);
|
||||
rot += step;
|
||||
}
|
||||
return `M${pts.join(' L')} Z`;
|
||||
}
|
||||
|
||||
export function circlePath(cx: number, cy: number, r: number): string {
|
||||
return [
|
||||
`M${n(cx - r)},${n(cy)}`,
|
||||
`A${n(r)},${n(r)} 0 1 0 ${n(cx + r)},${n(cy)}`,
|
||||
`A${n(r)},${n(r)} 0 1 0 ${n(cx - r)},${n(cy)}`,
|
||||
'Z',
|
||||
].join(' ');
|
||||
}
|
||||
|
||||
/** Deterministic per-cell hash, so mosaic looks random but renders identically every time. */
|
||||
function cellHash(r: number, c: number): number {
|
||||
const v = Math.sin(r * 127.1 + c * 311.7) * 43758.5453;
|
||||
return v - Math.floor(v);
|
||||
}
|
||||
|
||||
export interface Neighbors {
|
||||
top: boolean;
|
||||
bottom: boolean;
|
||||
left: boolean;
|
||||
right: boolean;
|
||||
}
|
||||
|
||||
export function moduleShapePath(
|
||||
shape: ModuleShape,
|
||||
x: number,
|
||||
y: number,
|
||||
size: number,
|
||||
nb: Neighbors,
|
||||
row: number,
|
||||
col: number
|
||||
): string {
|
||||
const { top, bottom, left, right } = nb;
|
||||
|
||||
switch (shape) {
|
||||
case 'square':
|
||||
return roundedRectPath(x, y, size, size, 0, 0, 0, 0);
|
||||
|
||||
case 'dots':
|
||||
return circlePath(x + size / 2, y + size / 2, size * 0.42);
|
||||
|
||||
case 'diamond':
|
||||
return `M${n(x + size / 2)},${n(y)} L${n(x + size)},${n(y + size / 2)} L${n(
|
||||
x + size / 2
|
||||
)},${n(y + size)} L${n(x)},${n(y + size / 2)} Z`;
|
||||
|
||||
case 'star':
|
||||
return starPath(x + size / 2, y + size / 2, size * 0.5, size * 0.22, 5);
|
||||
|
||||
case 'hexagon':
|
||||
return hexagonPath(x + size / 2, y + size / 2, size * 0.52);
|
||||
|
||||
case 'plus': {
|
||||
const armW = size * 0.42;
|
||||
const off = (size - armW) / 2;
|
||||
return (
|
||||
roundedRectPath(x + off, y, armW, size, 0, 0, 0, 0) +
|
||||
' ' +
|
||||
roundedRectPath(x, y + off, size, armW, 0, 0, 0, 0)
|
||||
);
|
||||
}
|
||||
|
||||
case 'mosaic': {
|
||||
const h = cellHash(row, col);
|
||||
if (h < 0.34) return circlePath(x + size / 2, y + size / 2, size * 0.42);
|
||||
if (h < 0.67) {
|
||||
const r = size * 0.28;
|
||||
return roundedRectPath(x, y, size, size, r, r, r, r);
|
||||
}
|
||||
return roundedRectPath(x, y, size, size, 0, 0, 0, 0);
|
||||
}
|
||||
|
||||
case 'liquid':
|
||||
case 'classy': {
|
||||
const r = size * (shape === 'liquid' ? 0.55 : 0.5);
|
||||
return roundedRectPath(
|
||||
x,
|
||||
y,
|
||||
size,
|
||||
size,
|
||||
!top && !left ? r : 0,
|
||||
!top && !right ? r : 0,
|
||||
!bottom && !right ? r : 0,
|
||||
!bottom && !left ? r : 0
|
||||
);
|
||||
}
|
||||
|
||||
case 'classy-rounded': {
|
||||
const r = size * 0.5;
|
||||
const soft = r * 0.35;
|
||||
return roundedRectPath(
|
||||
x,
|
||||
y,
|
||||
size,
|
||||
size,
|
||||
!top && !left ? r : top && left ? 0 : soft,
|
||||
!top && !right ? r : top && right ? 0 : soft,
|
||||
!bottom && !right ? r : bottom && right ? 0 : soft,
|
||||
!bottom && !left ? r : bottom && left ? 0 : soft
|
||||
);
|
||||
}
|
||||
|
||||
case 'rounded':
|
||||
default: {
|
||||
const r = size * 0.32;
|
||||
return roundedRectPath(
|
||||
x,
|
||||
y,
|
||||
size,
|
||||
size,
|
||||
!top && !left ? r : 0,
|
||||
!top && !right ? r : 0,
|
||||
!bottom && !right ? r : 0,
|
||||
!bottom && !left ? r : 0
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Eye frame is a ring: outer shape minus inner shape, rendered with
|
||||
* fill-rule="evenodd" so the hole appears without a second fill colour.
|
||||
*/
|
||||
export function eyeFramePath(
|
||||
shape: EyeFrameShape,
|
||||
x: number,
|
||||
y: number,
|
||||
s: number
|
||||
): string {
|
||||
const inner = s * (5 / 7);
|
||||
const io = s * (1 / 7);
|
||||
|
||||
switch (shape) {
|
||||
case 'rounded': {
|
||||
// 0.10, not 0.28. Measured: at 0.28 the code stopped decoding in all 15
|
||||
// test renders, at 0.15 in a third of them, at 0.10 in none.
|
||||
const r1 = s * 0.1;
|
||||
const r2 = s * 0.1 * (5 / 7);
|
||||
return `${roundedRectPath(x, y, s, s, r1, r1, r1, r1)} ${roundedRectPath(
|
||||
x + io,
|
||||
y + io,
|
||||
inner,
|
||||
inner,
|
||||
r2,
|
||||
r2,
|
||||
r2,
|
||||
r2
|
||||
)}`;
|
||||
}
|
||||
|
||||
case 'square':
|
||||
default:
|
||||
return `${roundedRectPath(x, y, s, s, 0, 0, 0, 0)} ${roundedRectPath(
|
||||
x + io,
|
||||
y + io,
|
||||
inner,
|
||||
inner,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0
|
||||
)}`;
|
||||
}
|
||||
}
|
||||
|
||||
export function eyeBallPath(
|
||||
shape: EyeBallShape,
|
||||
x: number,
|
||||
y: number,
|
||||
size: number
|
||||
): string {
|
||||
switch (shape) {
|
||||
case 'circle':
|
||||
return circlePath(x + size / 2, y + size / 2, size / 2);
|
||||
case 'diamond':
|
||||
return `M${n(x + size / 2)},${n(y)} L${n(x + size)},${n(y + size / 2)} L${n(
|
||||
x + size / 2
|
||||
)},${n(y + size)} L${n(x)},${n(y + size / 2)} Z`;
|
||||
case 'hexagon':
|
||||
return hexagonPath(x + size / 2, y + size / 2, size * 0.55);
|
||||
case 'rounded': {
|
||||
const r = size * 0.3;
|
||||
return roundedRectPath(x, y, size, size, r, r, r, r);
|
||||
}
|
||||
case 'square':
|
||||
default:
|
||||
return roundedRectPath(x, y, size, size, 0, 0, 0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
/** True when the module at (r,c) belongs to one of the three finder patterns. */
|
||||
export function isInEye(r: number, c: number, size: number): boolean {
|
||||
const eyes: [number, number][] = [
|
||||
[0, 0],
|
||||
[0, size - 7],
|
||||
[size - 7, 0],
|
||||
];
|
||||
return eyes.some(([er, ec]) => r >= er && r < er + 7 && c >= ec && c < ec + 7);
|
||||
}
|
||||
148
src/lib/render-qr-svg.ts
Normal file
148
src/lib/render-qr-svg.ts
Normal file
@@ -0,0 +1,148 @@
|
||||
import QRCodeLib from 'qrcode';
|
||||
import {
|
||||
ModuleShape,
|
||||
EyeFrameShape,
|
||||
EyeBallShape,
|
||||
moduleShapePath,
|
||||
eyeFramePath,
|
||||
eyeBallPath,
|
||||
isInEye,
|
||||
} from '@/lib/qr-shapes';
|
||||
|
||||
/**
|
||||
* Renders a styled QR code to an SVG string.
|
||||
*
|
||||
* The React component in components/generator/StyledQRCode.tsx produces the same
|
||||
* output as JSX for the live preview; this is the string version, used where
|
||||
* there is no React tree to render into - the bulk generator writing 500 files
|
||||
* into a ZIP being the case that matters.
|
||||
*
|
||||
* Both paths call the same shape functions, so a preset previewed in /create and
|
||||
* the same preset applied to a batch cannot drift apart.
|
||||
*/
|
||||
|
||||
export interface QRDesignStyle {
|
||||
foregroundColor?: string;
|
||||
backgroundColor?: string;
|
||||
moduleShape?: ModuleShape;
|
||||
eyeFrameShape?: EyeFrameShape;
|
||||
eyeBallShape?: EyeBallShape;
|
||||
gradientMode?: 'none' | 'linear' | 'radial';
|
||||
gradientTo?: string;
|
||||
/** Data URL. Carried in presets so a batch keeps the client's mark. */
|
||||
logoUrl?: string;
|
||||
/** Logo edge length in the 200px editor scale. */
|
||||
logoSize?: number;
|
||||
}
|
||||
|
||||
export function renderStyledQRSvg(
|
||||
value: string,
|
||||
style: QRDesignStyle | null | undefined,
|
||||
size = 300,
|
||||
margin = 4
|
||||
): string {
|
||||
const fg = style?.foregroundColor || '#000000';
|
||||
const bg = style?.backgroundColor || '#FFFFFF';
|
||||
const moduleShape: ModuleShape = style?.moduleShape || 'square';
|
||||
const eyeFrameShape: EyeFrameShape = style?.eyeFrameShape || 'square';
|
||||
const eyeBallShape: EyeBallShape = style?.eyeBallShape || 'square';
|
||||
const gradientMode = style?.gradientMode ?? 'none';
|
||||
const gradientTo = style?.gradientTo || fg;
|
||||
|
||||
const logoUrl = style?.logoUrl || '';
|
||||
// Logo edge length as a share of the code, capped like the editor caps it.
|
||||
const logoSpan = logoUrl ? Math.min((style?.logoSize ?? 24) / 200, 0.28) : 0;
|
||||
|
||||
// Always H, matching the interactive editor.
|
||||
//
|
||||
// This started at 'M' for plain codes, and one payload out of three then
|
||||
// failed to decode at three of four render sizes - reproducibly, not as
|
||||
// noise. A batch of 500 headed for print is the worst possible place to save
|
||||
// a few modules, and preview and batch drifting apart is exactly what sharing
|
||||
// the shape functions was supposed to prevent.
|
||||
const ec = 'H';
|
||||
|
||||
const qr = QRCodeLib.create(value || ' ', { errorCorrectionLevel: ec });
|
||||
const count = qr.modules.size;
|
||||
const data = qr.modules.data;
|
||||
const total = count + margin * 2;
|
||||
const cell = size / total;
|
||||
const offset = margin * cell;
|
||||
|
||||
const at = (r: number, c: number): boolean =>
|
||||
r >= 0 && c >= 0 && r < count && c < count && data[r * count + c] === 1;
|
||||
|
||||
// Modules behind the logo are dropped, not painted over. Half-covered modules
|
||||
// confuse some decoders; removing them lets error correction do its job.
|
||||
const logoFrom = logoUrl ? Math.floor((count * (1 - logoSpan)) / 2) : -1;
|
||||
const logoTo = logoUrl ? Math.ceil((count * (1 + logoSpan)) / 2) : -1;
|
||||
const underLogo = (r: number, c: number) =>
|
||||
Boolean(logoUrl) && r >= logoFrom && r < logoTo && c >= logoFrom && c < logoTo;
|
||||
|
||||
const modulePaths: string[] = [];
|
||||
for (let r = 0; r < count; r++) {
|
||||
for (let c = 0; c < count; c++) {
|
||||
if (!at(r, c) || isInEye(r, c, count)) continue;
|
||||
if (underLogo(r, c)) continue;
|
||||
modulePaths.push(
|
||||
moduleShapePath(
|
||||
moduleShape,
|
||||
offset + c * cell,
|
||||
offset + r * cell,
|
||||
cell,
|
||||
{
|
||||
top: at(r - 1, c),
|
||||
bottom: at(r + 1, c),
|
||||
left: at(r, c - 1),
|
||||
right: at(r, c + 1),
|
||||
},
|
||||
r,
|
||||
c
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
const eyes: [number, number][] = [
|
||||
[0, 0],
|
||||
[0, count - 7],
|
||||
[count - 7, 0],
|
||||
];
|
||||
|
||||
const frames = eyes
|
||||
.map(([r, c]) =>
|
||||
eyeFramePath(eyeFrameShape, offset + c * cell, offset + r * cell, cell * 7)
|
||||
)
|
||||
.map((d) => `<path d="${d}" fill="FILL" fill-rule="evenodd"/>`)
|
||||
.join('');
|
||||
|
||||
const balls = eyes
|
||||
.map(([r, c]) =>
|
||||
eyeBallPath(eyeBallShape, offset + (c + 2) * cell, offset + (r + 2) * cell, cell * 3)
|
||||
)
|
||||
.map((d) => `<path d="${d}" fill="FILL"/>`)
|
||||
.join('');
|
||||
|
||||
const gradId = 'g';
|
||||
const fill = gradientMode === 'none' ? fg : `url(#${gradId})`;
|
||||
|
||||
const defs =
|
||||
gradientMode === 'none'
|
||||
? ''
|
||||
: gradientMode === 'linear'
|
||||
? `<defs><linearGradient id="${gradId}" gradientTransform="rotate(45 0.5 0.5)"><stop offset="0%" stop-color="${fg}"/><stop offset="100%" stop-color="${gradientTo}"/></linearGradient></defs>`
|
||||
: `<defs><radialGradient id="${gradId}"><stop offset="0%" stop-color="${fg}"/><stop offset="100%" stop-color="${gradientTo}"/></radialGradient></defs>`;
|
||||
|
||||
return [
|
||||
`<svg xmlns="http://www.w3.org/2000/svg" width="${size}" height="${size}" viewBox="0 0 ${size} ${size}" shape-rendering="geometricPrecision">`,
|
||||
defs,
|
||||
`<rect width="${size}" height="${size}" fill="${bg}"/>`,
|
||||
`<path d="${modulePaths.join(' ')}" fill="${fill}"/>`,
|
||||
frames.split('FILL').join(fill),
|
||||
balls.split('FILL').join(fill),
|
||||
logoUrl
|
||||
? `<image href="${logoUrl}" x="${(size - size * logoSpan) / 2}" y="${(size - size * logoSpan) / 2}" width="${size * logoSpan}" height="${size * logoSpan}" preserveAspectRatio="xMidYMid meet"/>`
|
||||
: '',
|
||||
'</svg>',
|
||||
].join('');
|
||||
}
|
||||
@@ -96,9 +96,9 @@ export const JOB_ROLE_OPTIONS: OnboardingOption[] = [
|
||||
|
||||
export const TEAM_SIZE_OPTIONS: OnboardingOption[] = [
|
||||
{ value: 'just_me', label: 'Just me' },
|
||||
{ value: '2_5', label: '2–5' },
|
||||
{ value: '6_20', label: '6–20' },
|
||||
{ value: '21_100', label: '21–100' },
|
||||
{ value: '2_5', label: '2-5' },
|
||||
{ value: '6_20', label: '6-20' },
|
||||
{ value: '21_100', label: '21-100' },
|
||||
{ value: '100_plus', label: '100+' },
|
||||
];
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@ export const AUTH_COOKIE_NAME = 'userId';
|
||||
function getSecret(): string {
|
||||
const secret = process.env.NEXTAUTH_SECRET;
|
||||
if (!secret) {
|
||||
throw new Error('NEXTAUTH_SECRET is not set — cannot sign or verify session cookies');
|
||||
throw new Error('NEXTAUTH_SECRET is not set - cannot sign or verify session cookies');
|
||||
}
|
||||
return secret;
|
||||
}
|
||||
|
||||
@@ -86,7 +86,7 @@ export const missingIndustries: IndustryPage[] = [
|
||||
metaTitle: "QR Codes for Car Dealerships: Virtual Tours & Lead Gen",
|
||||
metaDescription: "Drive sales with QR codes for car spec sheets, virtual vehicle tours, financing calculators, and test drive booking.",
|
||||
headline: "QR Codes for Car Dealerships: Your 24/7 Digital Sales Floor",
|
||||
subheadline: "Let buyers explore every vehicle's specs, history, and financing options from the window—even when you're closed",
|
||||
subheadline: "Let buyers explore every vehicle's specs, history, and financing options from the window-even when you're closed",
|
||||
heroImage: "/marketing/industries/car-dealerships.png",
|
||||
statistics: [
|
||||
{ value: "2x", label: "More Weekend Leads via Window QRs" },
|
||||
|
||||
@@ -68,7 +68,7 @@ export const missingIndustries2: IndustryPage[] = [
|
||||
],
|
||||
tools: ["vcard-qr-code", "url-qr-code", "pdf-qr-code"],
|
||||
faq: [
|
||||
{ question: "How do insurance agencies use QR codes on ID cards?", answer: "A QR on the card links directly to the mobile claim filing portal or the agent's emergency contact numbers—providing help in high-stress moments." },
|
||||
{ question: "How do insurance agencies use QR codes on ID cards?", answer: "A QR on the card links directly to the mobile claim filing portal or the agent's emergency contact numbers-providing help in high-stress moments." },
|
||||
{ question: "Can QR codes help generate more insurance quotes?", answer: "Yes, by adding a QR to local signage and direct mail, agencies bridge the gap between people seeing an ad and getting a price instantly on their phone." },
|
||||
{ question: "Where should insurance QR codes be placed?", answer: "The back of ID cards, the front page of policy folders, and on all direct mail flyers are the most effective areas." }
|
||||
],
|
||||
@@ -94,7 +94,7 @@ export const missingIndustries2: IndustryPage[] = [
|
||||
{ value: "2x", label: "Increase in Reading-List Engagement" }
|
||||
],
|
||||
benefits: [
|
||||
{ title: "Shelf-Edge Storytelling", description: "A QR on the shelf tag links to author interviews, book trailers, or community reviews—helping customers discover their next favorite read." },
|
||||
{ title: "Shelf-Edge Storytelling", description: "A QR on the shelf tag links to author interviews, book trailers, or community reviews-helping customers discover their next favorite read." },
|
||||
{ title: "Digital Loyalty and Rewards", description: "A QR at the checkout or on the bookmark given with each purchase allows customers to join your loyalty program without filling out a paper form." },
|
||||
{ title: "Order-from-Shelf Capability", description: "If a popular title is out of stock, a QR on the shelf lets the customer order the book for home delivery immediately, preventing them from leaving for a competitor." }
|
||||
],
|
||||
@@ -133,7 +133,7 @@ export const missingIndustries2: IndustryPage[] = [
|
||||
{ value: "50%", label: "Faster E-Book and Audio Sample Access" }
|
||||
],
|
||||
benefits: [
|
||||
{ title: "Instant E-Source Access", description: "Place QR codes on physical shelves that link directly to the e-book or audiobook versions of those titles—ideal for when the physical copy is checked out." },
|
||||
{ title: "Instant E-Source Access", description: "Place QR codes on physical shelves that link directly to the e-book or audiobook versions of those titles-ideal for when the physical copy is checked out." },
|
||||
{ title: "Digital Event Calendars", description: "A QR on the main announcement board or entrance door links to your full digital event calendar, allowing visitors to register for workshops and storytime sessions." },
|
||||
{ title: "Learning Companion Guides", description: "For study groups and non-fiction sections, QR codes can link to high-quality external resources, video lessons, or digital bibliographies for deeper research." }
|
||||
],
|
||||
@@ -173,7 +173,7 @@ export const missingIndustries2: IndustryPage[] = [
|
||||
],
|
||||
benefits: [
|
||||
{ title: "Interactive Campus Wayfinding", description: "QR codes on pillars and building signs link to real-time interactive campus maps, helping new students find lecture halls and facilities effortlessly." },
|
||||
{ title: "Instant Course Material Distribution", description: "Professors place QR codes on lecture slides linking to PDFs, reference lists, or digital quizzes—ensuring every student has the material before the class ends." },
|
||||
{ title: "Instant Course Material Distribution", description: "Professors place QR codes on lecture slides linking to PDFs, reference lists, or digital quizzes-ensuring every student has the material before the class ends." },
|
||||
{ title: "Seamless Event Engagement", description: "A QR on the student union board or event poster links to the ticketing and RSVP portal, sending event reminders directly to student phones." }
|
||||
],
|
||||
useCases: [
|
||||
|
||||
@@ -29,7 +29,7 @@ export const missingIndustries3: IndustryPage[] = [
|
||||
],
|
||||
tools: ["url-qr-code", "pdf-qr-code", "event-qr-code"],
|
||||
faq: [
|
||||
{ question: "How do schools use QR codes for parents?", answer: "Schools place codes at gates or in reception that link to newsletters and school announcements—making mobile-first communication effortless for parents." },
|
||||
{ question: "How do schools use QR codes for parents?", answer: "Schools place codes at gates or in reception that link to newsletters and school announcements-making mobile-first communication effortless for parents." },
|
||||
{ question: "Can QR codes help with school event planning?", answer: "Yes, by putting a QR on any paper flyer, schools can get instant RSVPs and track attendance for events like plays and fairs." },
|
||||
{ question: "Where should school QR codes be placed?", answer: "The school gates, the main reception desk, student homework planners, and on all physical event posters." }
|
||||
],
|
||||
@@ -55,7 +55,7 @@ export const missingIndustries3: IndustryPage[] = [
|
||||
{ value: "2x", label: "More Community Event Registrations" }
|
||||
],
|
||||
benefits: [
|
||||
{ title: "Frictionless Digital Giving", description: "A QR code on the back of every pew or in the weekly program links directly to your secure donation portal—making it easy for the modern congregation to give." },
|
||||
{ title: "Frictionless Digital Giving", description: "A QR code on the back of every pew or in the weekly program links directly to your secure donation portal-making it easy for the modern congregation to give." },
|
||||
{ title: "Digital Bulletins and Hymnals", description: "Reduce your environmental impact and printing costs by linking to the week's program, lyrics, and announcements via a single scan." },
|
||||
{ title: "Community Calendar and Groups", description: "Link QR codes to your small group sign-up forms and community events calendar, encouraging deeper engagement beyond Sunday service." }
|
||||
],
|
||||
@@ -69,7 +69,7 @@ export const missingIndustries3: IndustryPage[] = [
|
||||
tools: ["url-qr-code", "pdf-qr-code", "event-qr-code"],
|
||||
faq: [
|
||||
{ question: "How do churches use QR codes for giving?", answer: "Churches place codes on pews or in bulletins that link directly to their payment provider, letting the congregation donate securely from their phones." },
|
||||
{ question: "Can QR codes replace printed church bulletins?", answer: "Yes, many congregations now scan a QR at the entrance to access the digital program and hymnal—saving thousands in annual printing costs." },
|
||||
{ question: "Can QR codes replace printed church bulletins?", answer: "Yes, many congregations now scan a QR at the entrance to access the digital program and hymnal-saving thousands in annual printing costs." },
|
||||
{ question: "Where should churches place QR codes?", answer: "The back of every pew, the main lobby notice board, and the front cover of the physical weekly program." }
|
||||
],
|
||||
placementTips: [
|
||||
@@ -94,9 +94,9 @@ export const missingIndustries3: IndustryPage[] = [
|
||||
{ value: "2x", label: "Higher Instagram Follower Growth" }
|
||||
],
|
||||
benefits: [
|
||||
{ title: "Deep-Dive Artist Biographies", description: "A QR on the wall label links to the artist's full biography, studio videos, and available works—providing context without crowding the gallery walls." },
|
||||
{ title: "Deep-Dive Artist Biographies", description: "A QR on the wall label links to the artist's full biography, studio videos, and available works-providing context without crowding the gallery walls." },
|
||||
{ title: "Immediate Purchase Inquiries", description: "Link QR codes to a direct inquiry form or purchase link for every artwork, allowing collectors to start the buying process the moment they feel inspired." },
|
||||
{ title: "Virtual Exhibition Catalogs", description: "Give visitors a QR code at the entrance linking to the full digital exhibition catalog—which they can easily share with fellow art lovers." }
|
||||
{ title: "Virtual Exhibition Catalogs", description: "Give visitors a QR code at the entrance linking to the full digital exhibition catalog-which they can easily share with fellow art lovers." }
|
||||
],
|
||||
useCases: [
|
||||
"Artist bio and video link on each artwork label",
|
||||
@@ -133,7 +133,7 @@ export const missingIndustries3: IndustryPage[] = [
|
||||
{ value: "50%", label: "Faster Wayfinding to Block and Row" }
|
||||
],
|
||||
benefits: [
|
||||
{ title: "In-Seat Concession Ordering", description: "Place a QR code on the back of every stadium seat. Fans scan to order food and drinks for collection—or even delivery—without missing a minute of the match." },
|
||||
{ title: "In-Seat Concession Ordering", description: "Place a QR code on the back of every stadium seat. Fans scan to order food and drinks for collection-or even delivery-without missing a minute of the match." },
|
||||
{ title: "Interactive Stadium Wayfinding", description: "Help fans find their block, row, nearest restrooms, and parking with QR codes on pillars that link to real-time interactive arena maps." },
|
||||
{ title: "Exclusive Fan Zone Content", description: "Link seat QR codes to digital match programs, team stats, and exclusive merch offers that are only available during the event." }
|
||||
],
|
||||
@@ -172,9 +172,9 @@ export const missingIndustries3: IndustryPage[] = [
|
||||
{ value: "40%", label: "Higher Engagement with Digital Programs" }
|
||||
],
|
||||
benefits: [
|
||||
{ title: "Digital Show Programs", description: "Place a QR on the back of every theater seat linking to the full cast list, director's notes, and show information—saving thousands on printing costs." },
|
||||
{ title: "Digital Show Programs", description: "Place a QR on the back of every theater seat linking to the full cast list, director's notes, and show information-saving thousands on printing costs." },
|
||||
{ title: "Fast-Track Concessions", description: "A QR in the lobby or on seats allows guests to pre-order popcorn and snacks, allowing them to skip the queue during the interval." },
|
||||
{ title: "Immediate Future Booking", description: "Place a QR code on the screen or in the exit foyer linking to tickets for the next show or film—capturing interest while the guest is still in the moment." }
|
||||
{ title: "Immediate Future Booking", description: "Place a QR code on the screen or in the exit foyer linking to tickets for the next show or film-capturing interest while the guest is still in the moment." }
|
||||
],
|
||||
useCases: [
|
||||
"Digital show guides and cast info from seat QR",
|
||||
@@ -185,7 +185,7 @@ export const missingIndustries3: IndustryPage[] = [
|
||||
],
|
||||
tools: ["url-qr-code", "pdf-qr-code", "youtube-qr-code"],
|
||||
faq: [
|
||||
{ question: "How do theaters use QR codes for programs?", answer: "They place codes on the back of seats that link to a PDF or web version of the program—meaning no more paper litter and easier updates." },
|
||||
{ question: "How do theaters use QR codes for programs?", answer: "They place codes on the back of seats that link to a PDF or web version of the program-meaning no more paper litter and easier updates." },
|
||||
{ question: "Can I order popcorn with a QR code?", answer: "Yes, many modern cinemas have QR codes in the lobby that let you order and pay for snacks from your phone to avoid waiting in line." },
|
||||
{ question: "Where should theater QR codes be placed?", answer: "The back of every theater seat, the main lobby counter, and on giant posters for upcoming films." }
|
||||
],
|
||||
|
||||
@@ -17,7 +17,7 @@ export const missingIndustries4: IndustryPage[] = [
|
||||
],
|
||||
benefits: [
|
||||
{ title: "One-Tap RSVPs and Registries", description: "Place a QR on the physical save-the-date or invitation. Guests scan to RSVP, select their meal, and access the gift registry instantly." },
|
||||
{ title: "Day-of Digital Wayfinding", description: "A QR on the welcome sign links to an interactive seating chart, timeline of events, and a digital guestbook—keeping everyone informed without bulky signage." },
|
||||
{ title: "Day-of Digital Wayfinding", description: "A QR on the welcome sign links to an interactive seating chart, timeline of events, and a digital guestbook-keeping everyone informed without bulky signage." },
|
||||
{ title: "Instant Shared Photo Albums", description: "Place a QR at every table. Guests scan to upload their photos and videos from the night directly to the couple's shared digital album." }
|
||||
],
|
||||
useCases: [
|
||||
@@ -55,7 +55,7 @@ export const missingIndustries4: IndustryPage[] = [
|
||||
{ value: "3x", label: "More Social Media Referral Traffic" }
|
||||
],
|
||||
benefits: [
|
||||
{ title: "Mobile Portfolio Access", description: "Ensure your best work is always with you. A QR on your business card links directly to your digital portfolio or Instagram—no more searching for URLs." },
|
||||
{ title: "Mobile Portfolio Access", description: "Ensure your best work is always with you. A QR on your business card links directly to your digital portfolio or Instagram-no more searching for URLs." },
|
||||
{ title: "Self-Service Session Booking", description: "Link a QR on your brochures or studio window directly to your booking calendar, allowing clients to pick a date and pay deposits from their phone." },
|
||||
{ title: "Simple Client Gallery Delivery", description: "Give clients a small branded card with a QR code linking to their secure private gallery for viewing and downloading their final photos." }
|
||||
],
|
||||
@@ -108,7 +108,7 @@ export const missingIndustries4: IndustryPage[] = [
|
||||
tools: ["url-qr-code", "pdf-qr-code", "vcard-qr-code"],
|
||||
faq: [
|
||||
{ question: "How do QR codes work for trade show lead gen?", answer: "Visitors scan a code at your booth that takes them to a form where they enter their details to receive a brochure or book a meeting." },
|
||||
{ question: "Can I replace all papers with QR codes at an event?", answer: "Yes, many booths use 'digital first' signage where all info, catalogs, and bios are accessed via QR codes—eliminating heavy paper waste." },
|
||||
{ question: "Can I replace all papers with QR codes at an event?", answer: "Yes, many booths use 'digital first' signage where all info, catalogs, and bios are accessed via QR codes-eliminating heavy paper waste." },
|
||||
{ question: "Where is the best place to put a QR code at a trade show?", answer: "Booth pillars at eye level, counter-top display cards, and on every staff member's badge or business card." }
|
||||
],
|
||||
placementTips: [
|
||||
@@ -172,7 +172,7 @@ export const missingIndustries4: IndustryPage[] = [
|
||||
{ value: "50%", label: "Increase in Video Message Attachment Adoption" }
|
||||
],
|
||||
benefits: [
|
||||
{ title: "Personal Video Messages", description: "Let customers record a personalized video card and attach it to their bouquet via a QR code—creating a unique, modern gifting experience." },
|
||||
{ title: "Personal Video Messages", description: "Let customers record a personalized video card and attach it to their bouquet via a QR code-creating a unique, modern gifting experience." },
|
||||
{ title: "Digital Flower Care Guides", description: "Provide a QR on the care card that links to detailed instructions and videos on how to keep their specific flowers fresh for longer." },
|
||||
{ title: "Subscription and Re-Order Ease", description: "A QR on the wrapping paper or card links to your subscription service or a one-click re-order page for future occasions." }
|
||||
],
|
||||
|
||||
@@ -68,7 +68,7 @@ export const missingIndustries5: IndustryPage[] = [
|
||||
],
|
||||
tools: ["url-qr-code", "youtube-qr-code", "pdf-qr-code"],
|
||||
faq: [
|
||||
{ question: "How do electronics stores use QR codes for manuals?", answer: "They place QR codes on shelf labels or boxes that link to the official digital PDF manual—saving paper and making it easier to search." },
|
||||
{ question: "How do electronics stores use QR codes for manuals?", answer: "They place QR codes on shelf labels or boxes that link to the official digital PDF manual-saving paper and making it easier to search." },
|
||||
{ question: "Can QR codes help with product comparisons?", answer: "Yes, the code on the shelf can link to a digital comparison tool where customers can see specs side-by-side on their own phone." },
|
||||
{ question: "Where are the best places for electronics store QR codes?", answer: "The shelf edge under the product name, on the back of display models for specs, and on the checkout receipt for warranties." }
|
||||
],
|
||||
@@ -94,7 +94,7 @@ export const missingIndustries5: IndustryPage[] = [
|
||||
{ value: "2x", label: "More Social Media Referral Traffic" }
|
||||
],
|
||||
benefits: [
|
||||
{ title: "Interactive Certificates of Authenticity", description: "Provide a QR code with every major purchase that links to the digital certification and history of the gemstone—boosting trust and transparency." },
|
||||
{ title: "Interactive Certificates of Authenticity", description: "Provide a QR code with every major purchase that links to the digital certification and history of the gemstone-boosting trust and transparency." },
|
||||
{ title: "Digital Style and Pairing Guides", description: "A QR on the display links to high-end lifestyle videos and guides showing how the piece can be styled and paired with other jewelry in your collection." },
|
||||
{ title: "Custom Design Collaboration", description: "Let clients start their unique journey. A QR on your showroom floor links to a design inquiry form where they can upload inspiration and book a consultation." }
|
||||
],
|
||||
|
||||
@@ -6,7 +6,7 @@ export const testimonials: Testimonial[] = [
|
||||
id: "pottery-claudia-knuth-001",
|
||||
rating: 5,
|
||||
title: "Perfect for my pottery",
|
||||
content: "I use QR-Master for my pottery as a link to my homepage and as a digital business card. I place the codes directly on my pottery pieces so interested customers can instantly access my website. Reliable and practical – a great solution!",
|
||||
content: "I use QR-Master for my pottery as a link to my homepage and as a digital business card. I place the codes directly on my pottery pieces so interested customers can instantly access my website. Reliable and practical - a great solution!",
|
||||
author: {
|
||||
name: "Claudia",
|
||||
role: "Owner",
|
||||
@@ -22,7 +22,7 @@ export const testimonials: Testimonial[] = [
|
||||
id: "restaurant-thomas-002",
|
||||
rating: 5,
|
||||
title: "Finally no more reprinting menus",
|
||||
content: "We used to reprint our menu every time prices changed — that was costing us hundreds of euros a year. With QR Master, I update the PDF online and all table QR codes instantly point to the new version. Setup took 10 minutes. This pays for itself after the first price adjustment.",
|
||||
content: "We used to reprint our menu every time prices changed - that was costing us hundreds of euros a year. With QR Master, I update the PDF online and all table QR codes instantly point to the new version. Setup took 10 minutes. This pays for itself after the first price adjustment.",
|
||||
author: {
|
||||
name: "Thomas B.",
|
||||
role: "Restaurant Owner",
|
||||
@@ -54,7 +54,7 @@ export const testimonials: Testimonial[] = [
|
||||
id: "retail-jennifer-004",
|
||||
rating: 5,
|
||||
title: "Generated 800 unique codes in under 5 minutes",
|
||||
content: "We needed individual QR codes for product packaging — one per SKU pointing to the corresponding product page. I uploaded our CSV with 800 rows and had every code ready to download in minutes. The bulk feature is exactly what large-scale packaging operations need.",
|
||||
content: "We needed individual QR codes for product packaging - one per SKU pointing to the corresponding product page. I uploaded our CSV with 800 rows and had every code ready to download in minutes. The bulk feature is exactly what large-scale packaging operations need.",
|
||||
author: {
|
||||
name: "Jennifer K.",
|
||||
role: "Operations Manager",
|
||||
@@ -86,7 +86,7 @@ export const testimonials: Testimonial[] = [
|
||||
id: "gdpr-stefan-006",
|
||||
rating: 5,
|
||||
title: "The only QR tool that takes GDPR seriously",
|
||||
content: "Our legal team reviewed several platforms before approving one for use. QR Master hashes IPs by default and doesn't store personally identifiable information — we also confirmed DNT header compliance. For a company operating under GDPR, this isn't optional, it's the baseline. QR Master delivered.",
|
||||
content: "Our legal team reviewed several platforms before approving one for use. QR Master hashes IPs by default and doesn't store personally identifiable information - we also confirmed DNT header compliance. For a company operating under GDPR, this isn't optional, it's the baseline. QR Master delivered.",
|
||||
author: {
|
||||
name: "Stefan W.",
|
||||
role: "Data Protection Officer",
|
||||
@@ -102,7 +102,7 @@ export const testimonials: Testimonial[] = [
|
||||
id: "agency-david-007",
|
||||
rating: 4,
|
||||
title: "Great platform for managing multiple client campaigns",
|
||||
content: "I manage QR code campaigns for six clients and QR Master keeps everything organized in one dashboard. The dynamic links mean I can redirect codes per campaign phase without going back to print. Does exactly what it says — clean, reliable, no bloat.",
|
||||
content: "I manage QR code campaigns for six clients and QR Master keeps everything organized in one dashboard. The dynamic links mean I can redirect codes per campaign phase without going back to print. Does exactly what it says - clean, reliable, no bloat.",
|
||||
author: {
|
||||
name: "David L.",
|
||||
role: "Digital Marketing Consultant",
|
||||
@@ -118,7 +118,7 @@ export const testimonials: Testimonial[] = [
|
||||
id: "fitness-anna-008",
|
||||
rating: 5,
|
||||
title: "Members scan for class schedules, WiFi, and waivers",
|
||||
content: "I put QR codes on every surface in my studio — reception desk, mirrors, equipment. One links to our class booking page, one shares WiFi, one opens the digital waiver form. When we switched booking software, I updated the URL in QR Master and nothing else had to change. Brilliant.",
|
||||
content: "I put QR codes on every surface in my studio - reception desk, mirrors, equipment. One links to our class booking page, one shares WiFi, one opens the digital waiver form. When we switched booking software, I updated the URL in QR Master and nothing else had to change. Brilliant.",
|
||||
author: {
|
||||
name: "Anna R.",
|
||||
role: "Studio Owner",
|
||||
@@ -134,7 +134,7 @@ export const testimonials: Testimonial[] = [
|
||||
id: "hotel-pierre-009",
|
||||
rating: 5,
|
||||
title: "Contactless check-in and room service made easy",
|
||||
content: "We placed dynamic QR codes on every room door and in the lobby. Guests scan to access our digital welcome guide, room service menu, and local recommendations — all updated centrally. When our restaurant hours changed, one edit in QR Master updated all 48 room codes instantly.",
|
||||
content: "We placed dynamic QR codes on every room door and in the lobby. Guests scan to access our digital welcome guide, room service menu, and local recommendations - all updated centrally. When our restaurant hours changed, one edit in QR Master updated all 48 room codes instantly.",
|
||||
author: {
|
||||
name: "Pierre D.",
|
||||
role: "General Manager",
|
||||
@@ -150,7 +150,7 @@ export const testimonials: Testimonial[] = [
|
||||
id: "freelancer-maya-010",
|
||||
rating: 5,
|
||||
title: "My vCard QR is now on every business card I print",
|
||||
content: "I switched to a vCard QR code from QR Master after my phone number changed and I had to throw away 200 printed cards. Now the QR on my card always points to the latest version of my contact info — I just update it online. It's the smartest small change I've made to my personal branding.",
|
||||
content: "I switched to a vCard QR code from QR Master after my phone number changed and I had to throw away 200 printed cards. Now the QR on my card always points to the latest version of my contact info - I just update it online. It's the smartest small change I've made to my personal branding.",
|
||||
author: {
|
||||
name: "Maya S.",
|
||||
role: "Freelance Brand Designer",
|
||||
@@ -166,7 +166,7 @@ export const testimonials: Testimonial[] = [
|
||||
id: "cafe-lars-011",
|
||||
rating: 5,
|
||||
title: "WiFi sharing has never been this clean",
|
||||
content: "Customers used to ask for our WiFi password 30 times a day. Now there's a QR code on every table — they scan, connect, done. We also linked a second code to our digital menu. QR Master was the easiest free tool I found that actually lets you keep the codes active without surprise paywalls.",
|
||||
content: "Customers used to ask for our WiFi password 30 times a day. Now there's a QR code on every table - they scan, connect, done. We also linked a second code to our digital menu. QR Master was the easiest free tool I found that actually lets you keep the codes active without surprise paywalls.",
|
||||
author: {
|
||||
name: "Lars N.",
|
||||
role: "Co-Owner",
|
||||
@@ -182,7 +182,7 @@ export const testimonials: Testimonial[] = [
|
||||
id: "realestate-carlos-012",
|
||||
rating: 5,
|
||||
title: "Property listing QR codes that stay current",
|
||||
content: "Real estate moves fast — a property I list today might be under offer tomorrow. With dynamic QR codes from QR Master, I print a yard sign once and update the link to the listing, price, or status page whenever things change. My signs stay accurate without paying for new prints.",
|
||||
content: "Real estate moves fast - a property I list today might be under offer tomorrow. With dynamic QR codes from QR Master, I print a yard sign once and update the link to the listing, price, or status page whenever things change. My signs stay accurate without paying for new prints.",
|
||||
author: {
|
||||
name: "Carlos M.",
|
||||
role: "Real Estate Agent",
|
||||
|
||||
@@ -9,11 +9,38 @@ import { z } from 'zod';
|
||||
// QR Code Schemas
|
||||
// ==========================================
|
||||
|
||||
/**
|
||||
* Zod strips unknown keys silently. This schema therefore has to list every
|
||||
* design field that is actually stored - otherwise the moment anyone switches
|
||||
* the route from saving `body.style` to saving the parsed output, every shape,
|
||||
* gradient and logo disappears without an error anywhere.
|
||||
*/
|
||||
export const qrStyleSchema = z.object({
|
||||
fgColor: z.string().regex(/^#[0-9A-F]{6}$/i, 'Invalid foreground color format').optional(),
|
||||
bgColor: z.string().regex(/^#[0-9A-F]{6}$/i, 'Invalid background color format').optional(),
|
||||
foregroundColor: z.string().optional(),
|
||||
backgroundColor: z.string().optional(),
|
||||
cornerStyle: z.enum(['square', 'rounded']).optional(),
|
||||
size: z.number().min(100).max(1000).optional(),
|
||||
moduleShape: z
|
||||
.enum([
|
||||
'square', 'rounded', 'dots', 'classy', 'classy-rounded',
|
||||
'diamond', 'star', 'hexagon', 'plus', 'mosaic', 'liquid',
|
||||
])
|
||||
.optional(),
|
||||
eyeFrameShape: z.enum(['square', 'rounded']).optional(),
|
||||
eyeBallShape: z.enum(['square', 'rounded', 'circle', 'diamond', 'hexagon']).optional(),
|
||||
gradientMode: z.enum(['none', 'linear', 'radial']).optional(),
|
||||
gradientTo: z.string().optional(),
|
||||
frameType: z.string().optional(),
|
||||
imageSettings: z
|
||||
.object({
|
||||
src: z.string(),
|
||||
height: z.number().optional(),
|
||||
width: z.number().optional(),
|
||||
excavate: z.boolean().optional(),
|
||||
})
|
||||
.optional(),
|
||||
});
|
||||
|
||||
export const createQRSchema = z.object({
|
||||
@@ -31,12 +58,33 @@ export const createQRSchema = z.object({
|
||||
|
||||
tags: z.array(z.string()).optional(),
|
||||
|
||||
style: z.object({
|
||||
foregroundColor: z.string().optional(),
|
||||
backgroundColor: z.string().optional(),
|
||||
cornerStyle: z.enum(['square', 'rounded']).optional(),
|
||||
size: z.number().optional(),
|
||||
}).optional(),
|
||||
style: z
|
||||
.object({
|
||||
foregroundColor: z.string().optional(),
|
||||
backgroundColor: z.string().optional(),
|
||||
cornerStyle: z.enum(['square', 'rounded']).optional(),
|
||||
size: z.number().optional(),
|
||||
moduleShape: z
|
||||
.enum([
|
||||
'square', 'rounded', 'dots', 'classy', 'classy-rounded',
|
||||
'diamond', 'star', 'hexagon', 'plus', 'mosaic', 'liquid',
|
||||
])
|
||||
.optional(),
|
||||
eyeFrameShape: z.enum(['square', 'rounded']).optional(),
|
||||
eyeBallShape: z.enum(['square', 'rounded', 'circle', 'diamond', 'hexagon']).optional(),
|
||||
gradientMode: z.enum(['none', 'linear', 'radial']).optional(),
|
||||
gradientTo: z.string().optional(),
|
||||
frameType: z.string().optional(),
|
||||
imageSettings: z
|
||||
.object({
|
||||
src: z.string(),
|
||||
height: z.number().optional(),
|
||||
width: z.number().optional(),
|
||||
excavate: z.boolean().optional(),
|
||||
})
|
||||
.optional(),
|
||||
})
|
||||
.optional(),
|
||||
});
|
||||
|
||||
export const updateQRSchema = z.object({
|
||||
@@ -53,6 +101,11 @@ export const updateQRSchema = z.object({
|
||||
style: qrStyleSchema.optional(),
|
||||
|
||||
isActive: z.boolean().optional(),
|
||||
|
||||
// Pausing frees a dynamic code slot without deleting the code or its scan
|
||||
// history. Used by the upgrade modal so hitting the limit has an exit that
|
||||
// does not cost money and does not destroy anything.
|
||||
status: z.enum(['ACTIVE', 'PAUSED']).optional(),
|
||||
});
|
||||
|
||||
export const bulkQRSchema = z.object({
|
||||
@@ -115,23 +168,23 @@ export const resetPasswordSchema = z.object({
|
||||
// Settings Schemas
|
||||
// ==========================================
|
||||
|
||||
export const updateProfileSchema = z.object({
|
||||
name: z.string()
|
||||
.min(2, 'Name must be at least 2 characters')
|
||||
.max(100, 'Name must be less than 100 characters')
|
||||
.trim(),
|
||||
});
|
||||
|
||||
export const onboardingUpdateSchema = z.object({
|
||||
signupSourceSelfReported: z.string().max(100).optional(),
|
||||
primaryUseCase: z.string().max(100).optional(),
|
||||
primaryGoal: z.string().max(100).optional(),
|
||||
jobRole: z.string().max(100).optional(),
|
||||
companyName: z.string().max(200).optional(),
|
||||
companyWebsite: z.string().max(200).optional(),
|
||||
teamSizeBucket: z.string().max(100).optional(),
|
||||
markProfileComplete: z.boolean().optional(),
|
||||
});
|
||||
export const updateProfileSchema = z.object({
|
||||
name: z.string()
|
||||
.min(2, 'Name must be at least 2 characters')
|
||||
.max(100, 'Name must be less than 100 characters')
|
||||
.trim(),
|
||||
});
|
||||
|
||||
export const onboardingUpdateSchema = z.object({
|
||||
signupSourceSelfReported: z.string().max(100).optional(),
|
||||
primaryUseCase: z.string().max(100).optional(),
|
||||
primaryGoal: z.string().max(100).optional(),
|
||||
jobRole: z.string().max(100).optional(),
|
||||
companyName: z.string().max(200).optional(),
|
||||
companyWebsite: z.string().max(200).optional(),
|
||||
teamSizeBucket: z.string().max(100).optional(),
|
||||
markProfileComplete: z.boolean().optional(),
|
||||
});
|
||||
|
||||
export const changePasswordSchema = z.object({
|
||||
currentPassword: z.string()
|
||||
|
||||
Reference in New Issue
Block a user