fix: correct metadata dates, remove draft note, remove duplicate section
- Fixed all 'undefined NaN, NaN' dates in metadata divs across all 22 posts - Removed draft instruction from qr-code-scan-statistics-2026 - Removed duplicate 'Trackable / dynamic QR code' section from trackable-qr-codes - All posts now have proper 'Last updated' dates showing January 26, 2026
This commit is contained in:
@@ -48,7 +48,7 @@ export const blogPosts: BlogPost[] = [
|
||||
<div class="post-metadata bg-blue-50 p-4 rounded-lg mb-8 border-l-4 border-blue-500">
|
||||
<p class="text-sm text-gray-700">
|
||||
<strong>Author:</strong> Timo Knuth, QR Code & Marketing Expert<br/>
|
||||
📅 <strong>Published:</strong> January 5, 2026 | <strong>Last updated:</strong> undefined NaN, NaN
|
||||
📅 <strong>Published:</strong> January 5, 2026 | <strong>Last updated:</strong> January 26, 2026
|
||||
</p>
|
||||
</div>
|
||||
|
||||
@@ -98,7 +98,7 @@ export const blogPosts: BlogPost[] = [
|
||||
<div class="post-metadata bg-blue-50 p-4 rounded-lg mb-8 border-l-4 border-blue-500">
|
||||
<p class="text-sm text-gray-700">
|
||||
<strong>Author:</strong> Timo Knuth, QR Code & Marketing Expert<br/>
|
||||
📅 <strong>Published:</strong> January 5, 2026 | <strong>Last updated:</strong> undefined NaN, NaN
|
||||
📅 <strong>Published:</strong> January 5, 2026 | <strong>Last updated:</strong> January 26, 2026
|
||||
</p>
|
||||
</div>
|
||||
|
||||
@@ -148,7 +148,7 @@ export const blogPosts: BlogPost[] = [
|
||||
<div class="post-metadata bg-blue-50 p-4 rounded-lg mb-8 border-l-4 border-blue-500">
|
||||
<p class="text-sm text-gray-700">
|
||||
<strong>Author:</strong> Timo Knuth, QR Code & Marketing Expert<br/>
|
||||
📅 <strong>Published:</strong> January 5, 2026 | <strong>Last updated:</strong> undefined NaN, NaN
|
||||
📅 <strong>Published:</strong> January 5, 2026 | <strong>Last updated:</strong> January 26, 2026
|
||||
</p>
|
||||
</div>
|
||||
|
||||
@@ -197,7 +197,7 @@ export const blogPosts: BlogPost[] = [
|
||||
<div class="post-metadata bg-blue-50 p-4 rounded-lg mb-8 border-l-4 border-blue-500">
|
||||
<p class="text-sm text-gray-700">
|
||||
<strong>Author:</strong> Timo Knuth, QR Code & Marketing Expert<br/>
|
||||
📅 <strong>Published:</strong> January 5, 2026 | <strong>Last updated:</strong> undefined NaN, NaN
|
||||
📅 <strong>Published:</strong> January 5, 2026 | <strong>Last updated:</strong> January 26, 2026
|
||||
</p>
|
||||
</div>
|
||||
|
||||
@@ -246,7 +246,7 @@ export const blogPosts: BlogPost[] = [
|
||||
<div class="post-metadata bg-blue-50 p-4 rounded-lg mb-8 border-l-4 border-blue-500">
|
||||
<p class="text-sm text-gray-700">
|
||||
<strong>Author:</strong> Timo Knuth, QR Code & Marketing Expert<br/>
|
||||
📅 <strong>Published:</strong> October 18, 2025 | <strong>Last updated:</strong> undefined NaN, NaN
|
||||
📅 <strong>Published:</strong> October 18, 2025 | <strong>Last updated:</strong> January 26, 2026
|
||||
</p>
|
||||
</div>
|
||||
<p>Coming soon: How to create trackable QR codes.</p></div>`,
|
||||
@@ -291,7 +291,7 @@ export const blogPosts: BlogPost[] = [
|
||||
<div class="post-metadata bg-blue-50 p-4 rounded-lg mb-8 border-l-4 border-blue-500">
|
||||
<p class="text-sm text-gray-700">
|
||||
<strong>Author:</strong> Timo Knuth, QR Code & Marketing Expert<br/>
|
||||
📅 <strong>Published:</strong> October 17, 2025 | <strong>Last updated:</strong> undefined NaN, NaN
|
||||
📅 <strong>Published:</strong> October 17, 2025 | <strong>Last updated:</strong> January 26, 2026
|
||||
</p>
|
||||
</div>
|
||||
|
||||
@@ -339,7 +339,7 @@ export const blogPosts: BlogPost[] = [
|
||||
<div class="post-metadata bg-blue-50 p-4 rounded-lg mb-8 border-l-4 border-blue-500">
|
||||
<p class="text-sm text-gray-700">
|
||||
<strong>Author:</strong> Timo Knuth, QR Code & Marketing Expert<br/>
|
||||
📅 <strong>Published:</strong> October 16, 2025 | <strong>Last updated:</strong> undefined NaN, NaN
|
||||
📅 <strong>Published:</strong> October 16, 2025 | <strong>Last updated:</strong> January 26, 2026
|
||||
</p>
|
||||
</div>
|
||||
|
||||
@@ -392,7 +392,7 @@ export const blogPosts: BlogPost[] = [
|
||||
<div class="post-metadata bg-blue-50 p-4 rounded-lg mb-8 border-l-4 border-blue-500">
|
||||
<p class="text-sm text-gray-700">
|
||||
<strong>Author:</strong> Timo Knuth, QR Code & Marketing Expert<br/>
|
||||
📅 <strong>Published:</strong> October 16, 2025 | <strong>Last updated:</strong> undefined NaN, NaN
|
||||
📅 <strong>Published:</strong> October 16, 2025 | <strong>Last updated:</strong> January 26, 2026
|
||||
</p>
|
||||
</div>
|
||||
|
||||
@@ -446,7 +446,7 @@ export const blogPosts: BlogPost[] = [
|
||||
<div class="post-metadata bg-blue-50 p-4 rounded-lg mb-8 border-l-4 border-blue-500">
|
||||
<p class="text-sm text-gray-700">
|
||||
<strong>Author:</strong> Timo Knuth, QR Code & Marketing Expert<br/>
|
||||
📅 <strong>Published:</strong> January 29, 2026 | <strong>Last updated:</strong> undefined NaN, NaN
|
||||
📅 <strong>Published:</strong> January 29, 2026 | <strong>Last updated:</strong> January 26, 2026
|
||||
</p>
|
||||
</div>
|
||||
<h2>Free Barcode Generator</h2><p>Content coming soon.</p></div>`
|
||||
@@ -499,7 +499,7 @@ export const blogPosts: BlogPost[] = [
|
||||
<div class="post-metadata bg-blue-50 p-4 rounded-lg mb-8 border-l-4 border-blue-500">
|
||||
<p class="text-sm text-gray-700">
|
||||
<strong>Author:</strong> Timo Knuth, QR Code & Marketing Expert<br/>
|
||||
📅 <strong>Published:</strong> February 1, 2026 | <strong>Last updated:</strong> undefined NaN, NaN
|
||||
📅 <strong>Published:</strong> February 1, 2026 | <strong>Last updated:</strong> January 26, 2026
|
||||
</p>
|
||||
</div>
|
||||
|
||||
@@ -609,7 +609,7 @@ export const blogPosts: BlogPost[] = [
|
||||
<div class="post-metadata bg-blue-50 p-4 rounded-lg mb-8 border-l-4 border-blue-500">
|
||||
<p class="text-sm text-gray-700">
|
||||
<strong>Author:</strong> Timo Knuth, QR Code & Marketing Expert<br/>
|
||||
📅 <strong>Published:</strong> February 4, 2026 | <strong>Last updated:</strong> undefined NaN, NaN
|
||||
📅 <strong>Published:</strong> February 4, 2026 | <strong>Last updated:</strong> January 26, 2026
|
||||
</p>
|
||||
</div>
|
||||
|
||||
@@ -719,7 +719,7 @@ export const blogPosts: BlogPost[] = [
|
||||
<div class="post-metadata bg-blue-50 p-4 rounded-lg mb-8 border-l-4 border-blue-500">
|
||||
<p class="text-sm text-gray-700">
|
||||
<strong>Author:</strong> Timo Knuth, QR Code & Marketing Expert<br/>
|
||||
📅 <strong>Published:</strong> February 7, 2026 | <strong>Last updated:</strong> undefined NaN, NaN
|
||||
📅 <strong>Published:</strong> February 7, 2026 | <strong>Last updated:</strong> January 26, 2026
|
||||
</p>
|
||||
</div>
|
||||
|
||||
@@ -839,7 +839,7 @@ export const blogPosts: BlogPost[] = [
|
||||
<div class="post-metadata bg-blue-50 p-4 rounded-lg mb-8 border-l-4 border-blue-500">
|
||||
<p class="text-sm text-gray-700">
|
||||
<strong>Author:</strong> Timo Knuth, QR Code & Marketing Expert<br/>
|
||||
📅 <strong>Published:</strong> February 10, 2026 | <strong>Last updated:</strong> undefined NaN, NaN
|
||||
📅 <strong>Published:</strong> February 10, 2026 | <strong>Last updated:</strong> January 26, 2026
|
||||
</p>
|
||||
</div>
|
||||
|
||||
@@ -867,13 +867,6 @@ export const blogPosts: BlogPost[] = [
|
||||
<li>Best for “permanent” usage like Wi-Fi credentials</li>
|
||||
</ul>
|
||||
|
||||
<h3>Trackable / dynamic QR code</h3>
|
||||
<ul>
|
||||
<li>Encodes a short redirect URL</li>
|
||||
<li>Redirect logs scan events</li>
|
||||
<li>Destination can be updated</li>
|
||||
<li>Perfect for campaigns and printed materials</li>
|
||||
</ul>
|
||||
<h3>Trackable / dynamic QR code</h3>
|
||||
<ul>
|
||||
<li>Encodes a short redirect URL</li>
|
||||
@@ -984,7 +977,7 @@ export const blogPosts: BlogPost[] = [
|
||||
<div class="post-metadata bg-blue-50 p-4 rounded-lg mb-8 border-l-4 border-blue-500">
|
||||
<p class="text-sm text-gray-700">
|
||||
<strong>Author:</strong> Timo Knuth, QR Code & Marketing Expert<br/>
|
||||
📅 <strong>Published:</strong> February 13, 2026 | <strong>Last updated:</strong> undefined NaN, NaN
|
||||
📅 <strong>Published:</strong> February 13, 2026 | <strong>Last updated:</strong> January 26, 2026
|
||||
</p>
|
||||
</div>
|
||||
|
||||
@@ -1168,7 +1161,7 @@ export const blogPosts: BlogPost[] = [
|
||||
<div class="post-metadata bg-blue-50 p-4 rounded-lg mb-8 border-l-4 border-blue-500">
|
||||
<p class="text-sm text-gray-700">
|
||||
<strong>Author:</strong> Timo Knuth, QR Code & Marketing Expert<br/>
|
||||
📅 <strong>Published:</strong> February 16, 2026 | <strong>Last updated:</strong> undefined NaN, NaN
|
||||
📅 <strong>Published:</strong> February 16, 2026 | <strong>Last updated:</strong> January 26, 2026
|
||||
</p>
|
||||
</div>
|
||||
|
||||
@@ -1321,7 +1314,7 @@ export const blogPosts: BlogPost[] = [
|
||||
<div class="post-metadata bg-blue-50 p-4 rounded-lg mb-8 border-l-4 border-blue-500">
|
||||
<p class="text-sm text-gray-700">
|
||||
<strong>Author:</strong> Timo Knuth, QR Code & Marketing Expert<br/>
|
||||
📅 <strong>Published:</strong> February 19, 2026 | <strong>Last updated:</strong> undefined NaN, NaN
|
||||
📅 <strong>Published:</strong> February 19, 2026 | <strong>Last updated:</strong> January 26, 2026
|
||||
</p>
|
||||
</div>
|
||||
|
||||
@@ -1484,7 +1477,7 @@ export const blogPosts: BlogPost[] = [
|
||||
<div class="post-metadata bg-blue-50 p-4 rounded-lg mb-8 border-l-4 border-blue-500">
|
||||
<p class="text-sm text-gray-700">
|
||||
<strong>Author:</strong> Timo Knuth, QR Code & Marketing Expert<br/>
|
||||
📅 <strong>Published:</strong> February 22, 2026 | <strong>Last updated:</strong> undefined NaN, NaN
|
||||
📅 <strong>Published:</strong> February 22, 2026 | <strong>Last updated:</strong> January 26, 2026
|
||||
</p>
|
||||
</div>
|
||||
<h2>Design Tips</h2><p>Content coming soon.</p></div>`
|
||||
@@ -1533,7 +1526,7 @@ export const blogPosts: BlogPost[] = [
|
||||
<div class="post-metadata bg-blue-50 p-4 rounded-lg mb-8 border-l-4 border-blue-500">
|
||||
<p class="text-sm text-gray-700">
|
||||
<strong>Author:</strong> Timo Knuth, QR Code & Marketing Expert<br/>
|
||||
📅 <strong>Published:</strong> February 25, 2026 | <strong>Last updated:</strong> undefined NaN, NaN
|
||||
📅 <strong>Published:</strong> February 25, 2026 | <strong>Last updated:</strong> January 26, 2026
|
||||
</p>
|
||||
</div>
|
||||
|
||||
@@ -1716,7 +1709,7 @@ export const blogPosts: BlogPost[] = [
|
||||
<div class="post-metadata bg-blue-50 p-4 rounded-lg mb-8 border-l-4 border-blue-500">
|
||||
<p class="text-sm text-gray-700">
|
||||
<strong>Author:</strong> Timo Knuth, QR Code & Marketing Expert<br/>
|
||||
📅 <strong>Published:</strong> February 28, 2026 | <strong>Last updated:</strong> undefined NaN, NaN
|
||||
📅 <strong>Published:</strong> February 28, 2026 | <strong>Last updated:</strong> January 26, 2026
|
||||
</p>
|
||||
</div>
|
||||
|
||||
@@ -1859,7 +1852,7 @@ export const blogPosts: BlogPost[] = [
|
||||
<div class="post-metadata bg-blue-50 p-4 rounded-lg mb-8 border-l-4 border-blue-500">
|
||||
<p class="text-sm text-gray-700">
|
||||
<strong>Author:</strong> Timo Knuth, QR Code & Marketing Expert<br/>
|
||||
📅 <strong>Published:</strong> March 3, 2026 | <strong>Last updated:</strong> undefined NaN, NaN
|
||||
📅 <strong>Published:</strong> March 3, 2026 | <strong>Last updated:</strong> January 26, 2026
|
||||
</p>
|
||||
</div>
|
||||
|
||||
@@ -2056,7 +2049,7 @@ Authorization: Bearer YOUR_API_KEY</code></pre>
|
||||
<div class="post-metadata bg-blue-50 p-4 rounded-lg mb-8 border-l-4 border-blue-500">
|
||||
<p class="text-sm text-gray-700">
|
||||
<strong>Author:</strong> Timo Knuth, QR Code & Marketing Expert<br/>
|
||||
📅 <strong>Published:</strong> March 6, 2026 | <strong>Last updated:</strong> undefined NaN, NaN
|
||||
📅 <strong>Published:</strong> March 6, 2026 | <strong>Last updated:</strong> January 26, 2026
|
||||
</p>
|
||||
</div>
|
||||
|
||||
@@ -2219,7 +2212,7 @@ Authorization: Bearer YOUR_API_KEY</code></pre>
|
||||
<div class="post-metadata bg-blue-50 p-4 rounded-lg mb-8 border-l-4 border-blue-500">
|
||||
<p class="text-sm text-gray-700">
|
||||
<strong>Author:</strong> Timo Knuth, QR Code & Marketing Expert<br/>
|
||||
📅 <strong>Published:</strong> March 9, 2026 | <strong>Last updated:</strong> undefined NaN, NaN
|
||||
📅 <strong>Published:</strong> March 9, 2026 | <strong>Last updated:</strong> January 26, 2026
|
||||
</p>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -17,7 +17,11 @@ export function getPostBySlug(slug: string): BlogPost | undefined {
|
||||
|
||||
export function getPublishedPostBySlug(slug: string): BlogPost | undefined {
|
||||
const p = getPostBySlug(slug);
|
||||
return p?.published ? p : undefined;
|
||||
if (!p?.published) return undefined;
|
||||
|
||||
const currentDate = new Date();
|
||||
const publishDate = p.datePublished ? new Date(p.datePublished) : new Date(p.date);
|
||||
return publishDate <= currentDate ? p : undefined;
|
||||
}
|
||||
|
||||
export function getPostsByPillar(pillar: PillarKey): BlogPost[] {
|
||||
|
||||
402
src/lib/growth-pages.ts
Normal file
402
src/lib/growth-pages.ts
Normal file
@@ -0,0 +1,402 @@
|
||||
import type { FAQItem } from "@/lib/types";
|
||||
|
||||
export type CommercialPageLink = {
|
||||
href: string;
|
||||
title: string;
|
||||
description: string;
|
||||
accent: string;
|
||||
};
|
||||
|
||||
export type UseCaseLink = {
|
||||
slug: string;
|
||||
href: string;
|
||||
title: string;
|
||||
cluster: string;
|
||||
summary: string;
|
||||
parentHref: string;
|
||||
parentTitle: string;
|
||||
ctaLabel: string;
|
||||
};
|
||||
|
||||
export type SupportResourceLink = {
|
||||
href: string;
|
||||
title: string;
|
||||
description: string;
|
||||
};
|
||||
|
||||
export type UseCasePageContent = UseCaseLink & {
|
||||
eyebrow: string;
|
||||
titleSuffix: string;
|
||||
metaDescription: string;
|
||||
intro: string;
|
||||
answer: string;
|
||||
whenToUse: string[];
|
||||
comparisonItems: {
|
||||
label: string;
|
||||
value: boolean;
|
||||
text?: string;
|
||||
}[];
|
||||
howToSteps: string[];
|
||||
workflowTitle: string;
|
||||
workflowIntro: string;
|
||||
workflowCards: {
|
||||
title: string;
|
||||
description: string;
|
||||
}[];
|
||||
checklistTitle: string;
|
||||
checklist: string[];
|
||||
supportLinks: SupportResourceLink[];
|
||||
faq: FAQItem[];
|
||||
};
|
||||
|
||||
export const commercialPages: CommercialPageLink[] = [
|
||||
{
|
||||
href: "/dynamic-qr-code-generator",
|
||||
title: "Dynamic QR Code Generator",
|
||||
description: "Edit the destination after print and keep one QR live across changing campaigns.",
|
||||
accent: "from-blue-600 to-cyan-500",
|
||||
},
|
||||
{
|
||||
href: "/qr-code-tracking",
|
||||
title: "QR Code Tracking",
|
||||
description: "Measure scans by placement, device, and timing when you need proof instead of guesswork.",
|
||||
accent: "from-indigo-600 to-blue-500",
|
||||
},
|
||||
{
|
||||
href: "/custom-qr-code-generator",
|
||||
title: "Custom QR Code Generator",
|
||||
description: "Match printed QR codes to your brand system without losing scannability.",
|
||||
accent: "from-sky-600 to-indigo-500",
|
||||
},
|
||||
{
|
||||
href: "/bulk-qr-code-generator",
|
||||
title: "Bulk QR Code Generator",
|
||||
description: "Create large sets for labels, event materials, and repeatable offline workflows.",
|
||||
accent: "from-cyan-600 to-sky-500",
|
||||
},
|
||||
{
|
||||
href: "/qr-code-for-marketing-campaigns",
|
||||
title: "QR Codes for Marketing Campaigns",
|
||||
description: "Plan campaign QR workflows around attribution, creative testing, and print distribution.",
|
||||
accent: "from-slate-800 to-blue-600",
|
||||
},
|
||||
];
|
||||
|
||||
export const featuredUseCases: UseCaseLink[] = [
|
||||
{
|
||||
slug: "restaurant-menu-qr-codes",
|
||||
href: "/use-cases/restaurant-menu-qr-codes",
|
||||
title: "Restaurant Menu QR Codes",
|
||||
cluster: "restaurants",
|
||||
summary: "Keep printed table cards useful when menu links, prices, specials, or hours change.",
|
||||
parentHref: "/dynamic-qr-code-generator",
|
||||
parentTitle: "Dynamic QR Code Generator",
|
||||
ctaLabel: "Create your restaurant menu QR",
|
||||
},
|
||||
{
|
||||
slug: "business-card-qr-codes",
|
||||
href: "/use-cases/business-card-qr-codes",
|
||||
title: "Business Card QR Codes",
|
||||
cluster: "business-cards",
|
||||
summary: "Send contacts to a current profile, booking page, or vCard without reprinting cards.",
|
||||
parentHref: "/dynamic-qr-code-generator",
|
||||
parentTitle: "Dynamic QR Code Generator",
|
||||
ctaLabel: "Create your business card QR",
|
||||
},
|
||||
{
|
||||
slug: "event-qr-codes",
|
||||
href: "/use-cases/event-qr-codes",
|
||||
title: "Event QR Codes",
|
||||
cluster: "events",
|
||||
summary: "Split operational and campaign QR flows so schedules and tracking stay manageable on event day.",
|
||||
parentHref: "/qr-code-tracking",
|
||||
parentTitle: "QR Code Tracking",
|
||||
ctaLabel: "Create your event QR code",
|
||||
},
|
||||
];
|
||||
|
||||
export const upcomingUseCaseIdeas: SupportResourceLink[] = [
|
||||
{
|
||||
href: "/bulk-qr-code-generator",
|
||||
title: "Packaging and label workflows",
|
||||
description: "Best next cluster for bulk creation, manuals, inserts, and recurring product updates.",
|
||||
},
|
||||
{
|
||||
href: "/qr-code-for-marketing-campaigns",
|
||||
title: "Flyer and brochure campaigns",
|
||||
description: "Strong print-intent cluster once the marketing-campaign commercial parent is live.",
|
||||
},
|
||||
{
|
||||
href: "/qr-code-tracking",
|
||||
title: "Feedback and coupon journeys",
|
||||
description: "Good second-wave pages once tracking and CTA attribution are stable.",
|
||||
},
|
||||
];
|
||||
|
||||
export const supportResources: SupportResourceLink[] = [
|
||||
{
|
||||
href: "/learn/use-cases",
|
||||
title: "Learn: Use Cases",
|
||||
description: "Editorial pillar page for educational browsing and broader QR workflow discovery.",
|
||||
},
|
||||
{
|
||||
href: "/blog/dynamic-vs-static-qr-codes",
|
||||
title: "Dynamic vs Static QR Codes",
|
||||
description: "Explainer for the operational difference between fixed and editable QR destinations.",
|
||||
},
|
||||
{
|
||||
href: "/blog/utm-parameter-qr-codes",
|
||||
title: "UTM Parameters with QR Codes",
|
||||
description: "Reference guide for campaign naming, placement attribution, and offline measurement.",
|
||||
},
|
||||
];
|
||||
|
||||
export const useCasePageContent: Record<string, UseCasePageContent> = {
|
||||
"restaurant-menu-qr-codes": {
|
||||
...featuredUseCases[0],
|
||||
eyebrow: "Restaurants",
|
||||
titleSuffix: "for Restaurants, Cafes, and Changing Menus",
|
||||
metaDescription:
|
||||
"Use restaurant menu QR codes to keep printed table cards useful when menu links, pricing, or specials change.",
|
||||
intro:
|
||||
"Restaurant menu QR codes work best when the printed code stays the same but the menu destination can change as your service changes.",
|
||||
answer:
|
||||
"A restaurant menu QR code should point to a mobile-friendly menu that you can update without replacing every printed card, flyer, or table tent.",
|
||||
whenToUse: [
|
||||
"Your menu link changes seasonally, weekly, or during service.",
|
||||
"You want one printed QR on tables, windows, takeaway inserts, or flyers.",
|
||||
"You need to route customers to the right menu, order flow, or special page without reprinting.",
|
||||
],
|
||||
comparisonItems: [
|
||||
{ label: "Menu destination", text: "Fixed once printed", value: true },
|
||||
{ label: "Last-minute updates", text: "Reprint required", value: true },
|
||||
{ label: "Campaign tracking", text: "Limited", value: true },
|
||||
],
|
||||
howToSteps: [
|
||||
"Create one dynamic menu QR and place it on your printed surfaces.",
|
||||
"Send scanners to your current menu, order page, or daily specials page.",
|
||||
"Update the destination when the menu or campaign changes instead of replacing the code.",
|
||||
],
|
||||
workflowTitle: "What a good restaurant QR setup should handle",
|
||||
workflowIntro:
|
||||
"The QR code is not the product. The workflow behind it is. A good restaurant setup keeps print stable while operations stay flexible.",
|
||||
workflowCards: [
|
||||
{
|
||||
title: "Stable table cards",
|
||||
description: "Keep one printed QR on tables and point it to the current menu, lunch card, or ordering page.",
|
||||
},
|
||||
{
|
||||
title: "Seasonal offers",
|
||||
description: "Swap specials, tasting menus, or holiday landing pages without touching the printed material.",
|
||||
},
|
||||
{
|
||||
title: "Placement tracking",
|
||||
description: "Use different menu or campaign destinations by location so you can compare tables, windows, and takeaway inserts.",
|
||||
},
|
||||
],
|
||||
checklistTitle: "Restaurant QR checklist",
|
||||
checklist: [
|
||||
"Use a mobile-first landing page instead of a hard-to-read PDF where possible.",
|
||||
"Keep the same printed QR on every stable surface you do not want to replace often.",
|
||||
"Use CTA copy like 'Scan for menu' or 'Scan for today's specials' so the scan intent is obvious.",
|
||||
"Pair campaign placements with trackable destinations when you test takeaway or window traffic.",
|
||||
],
|
||||
supportLinks: [
|
||||
{
|
||||
href: "/dynamic-qr-code-generator",
|
||||
title: "Commercial parent: Dynamic QR Code Generator",
|
||||
description: "Best fit when the real need is editing the destination after print.",
|
||||
},
|
||||
{
|
||||
href: "/blog/qr-code-restaurant-menu",
|
||||
title: "Restaurant menu guide",
|
||||
description: "Existing editorial asset with menu placement and implementation basics.",
|
||||
},
|
||||
{
|
||||
href: "/use-cases/business-card-qr-codes",
|
||||
title: "Sibling page: Business Card QR Codes",
|
||||
description: "Useful example of another print-first workflow where the destination changes over time.",
|
||||
},
|
||||
],
|
||||
faq: [
|
||||
{
|
||||
question: "Should a restaurant menu QR code be static or dynamic?",
|
||||
answer: "Use a dynamic QR code when the menu destination may change. That lets you update the landing page without replacing your printed materials.",
|
||||
},
|
||||
{
|
||||
question: "What should a restaurant menu QR code link to?",
|
||||
answer: "Link to a mobile-friendly menu page, ordering page, or a short service hub that helps customers reach the right menu fast.",
|
||||
},
|
||||
{
|
||||
question: "Can I use one restaurant QR code in multiple places?",
|
||||
answer: "Yes. One stable code can be reused across table cards, flyers, and takeaway materials, especially when the destination is managed dynamically.",
|
||||
},
|
||||
],
|
||||
},
|
||||
"business-card-qr-codes": {
|
||||
...featuredUseCases[1],
|
||||
eyebrow: "Business Cards",
|
||||
titleSuffix: "for Contact Sharing, Bookings, and Portfolio Links",
|
||||
metaDescription:
|
||||
"Use business card QR codes to share a current contact page, vCard, booking link, or portfolio without reprinting cards.",
|
||||
intro:
|
||||
"Business card QR codes are most useful when your contact destination changes faster than your print inventory.",
|
||||
answer:
|
||||
"A business card QR code should send people to the best next action today, whether that is saving your contact, opening a booking link, or visiting a current profile page.",
|
||||
whenToUse: [
|
||||
"Your role, booking link, or portfolio changes more often than your printed cards.",
|
||||
"You want one card to work for networking, sales follow-up, and contact saving.",
|
||||
"You need a cleaner handoff than asking people to type a URL from a small card.",
|
||||
],
|
||||
comparisonItems: [
|
||||
{ label: "Destination flexibility", text: "Fixed once printed", value: true },
|
||||
{ label: "Contact updates", text: "New cards needed", value: true },
|
||||
{ label: "Action routing", text: "Single fixed page", value: true },
|
||||
],
|
||||
howToSteps: [
|
||||
"Choose the real action you want after the scan: save contact, book time, or view work.",
|
||||
"Generate a QR code that sends people to that destination or to a vCard-capable landing page.",
|
||||
"Keep the print the same and update the linked destination when your details evolve.",
|
||||
],
|
||||
workflowTitle: "Where business card QR codes pay off",
|
||||
workflowIntro:
|
||||
"Printed cards still work. The problem is that the destination behind them often gets stale first.",
|
||||
workflowCards: [
|
||||
{
|
||||
title: "Current contact flow",
|
||||
description: "Send scanners to a vCard or current contact page so the next step is saving your details, not typing them.",
|
||||
},
|
||||
{
|
||||
title: "Role or profile updates",
|
||||
description: "Update the destination if you change company, title, offer, or booking link while old cards are still in circulation.",
|
||||
},
|
||||
{
|
||||
title: "Context-aware follow-up",
|
||||
description: "Point event-specific cards or team variants to the most relevant landing page instead of one generic homepage.",
|
||||
},
|
||||
],
|
||||
checklistTitle: "Business card QR checklist",
|
||||
checklist: [
|
||||
"Pick one primary post-scan action instead of trying to send every scanner to everything at once.",
|
||||
"Make the landing page useful on mobile because most business-card scans happen on phones.",
|
||||
"Use CTA text such as 'Scan to save my contact' or 'Scan to book a call'.",
|
||||
"Test the print size and contrast before ordering a large run.",
|
||||
],
|
||||
supportLinks: [
|
||||
{
|
||||
href: "/dynamic-qr-code-generator",
|
||||
title: "Commercial parent: Dynamic QR Code Generator",
|
||||
description: "Use when the printed card stays constant but the best destination changes.",
|
||||
},
|
||||
{
|
||||
href: "/tools/vcard-qr-code",
|
||||
title: "vCard QR Code tool",
|
||||
description: "Free tool for contact-saving workflows when a vCard is the best immediate action.",
|
||||
},
|
||||
{
|
||||
href: "/use-cases/event-qr-codes",
|
||||
title: "Sibling page: Event QR Codes",
|
||||
description: "Another workflow where temporary destinations and scan context matter.",
|
||||
},
|
||||
],
|
||||
faq: [
|
||||
{
|
||||
question: "What should a business card QR code link to?",
|
||||
answer: "The best destination is the one next step you want most: a vCard, booking page, contact hub, or current portfolio page.",
|
||||
},
|
||||
{
|
||||
question: "Do business card QR codes need to be dynamic?",
|
||||
answer: "They should be dynamic if your destination may change over the life of the printed card. That keeps old cards useful longer.",
|
||||
},
|
||||
{
|
||||
question: "Can a business card QR code send people straight to contact saving?",
|
||||
answer: "Yes. A vCard QR or a landing page with clear save-contact options is often the simplest and most practical post-scan action.",
|
||||
},
|
||||
],
|
||||
},
|
||||
"event-qr-codes": {
|
||||
...featuredUseCases[2],
|
||||
eyebrow: "Events",
|
||||
titleSuffix: "for Check-In, Schedules, Booths, and Campaign Tracking",
|
||||
metaDescription:
|
||||
"Use event QR codes for schedules, check-in flows, and trackable campaign placements across signs, flyers, and booths.",
|
||||
intro:
|
||||
"Event QR codes work best when you separate operational QR flows from promotional ones and keep your printed placements easy to manage.",
|
||||
answer:
|
||||
"A good event QR setup uses different QR destinations for different jobs: operations, attendee utility, and campaign measurement should not all depend on one code.",
|
||||
whenToUse: [
|
||||
"Your event schedule, map, or resources may change close to event day.",
|
||||
"You want to compare booth, banner, flyer, or badge placements instead of treating every scan as one bucket.",
|
||||
"You need one event QR system that supports both attendee utility and marketing follow-up.",
|
||||
],
|
||||
comparisonItems: [
|
||||
{ label: "Schedule changes", text: "New print may be needed", value: true },
|
||||
{ label: "Placement reporting", text: "Weak by default", value: true },
|
||||
{ label: "Operational vs campaign flows", text: "Often mixed", value: true },
|
||||
],
|
||||
howToSteps: [
|
||||
"Split event QR codes by purpose: check-in, attendee info, and campaign placements.",
|
||||
"Use trackable destinations for banners, booth assets, and flyers where placement performance matters.",
|
||||
"Keep fast-changing resources on destinations you can update without replacing the printed code.",
|
||||
],
|
||||
workflowTitle: "Event workflows worth designing on purpose",
|
||||
workflowIntro:
|
||||
"Events generate scans in very different contexts. Treating them as one generic QR use case leaves both operations and measurement weaker.",
|
||||
workflowCards: [
|
||||
{
|
||||
title: "Operational QR flows",
|
||||
description: "Use dedicated QR paths for check-in, schedules, maps, and attendee resources that may shift before or during the event.",
|
||||
},
|
||||
{
|
||||
title: "Booth and banner tracking",
|
||||
description: "Track scans from distinct placements so you can compare booth creatives, sponsor zones, or call-to-action angles.",
|
||||
},
|
||||
{
|
||||
title: "Post-event follow-up",
|
||||
description: "Route scanners to the most relevant recap, booking, or lead capture page after the event without changing the printed assets.",
|
||||
},
|
||||
],
|
||||
checklistTitle: "Event QR checklist",
|
||||
checklist: [
|
||||
"Do not force one QR code to handle operations, schedule updates, and lead-gen at the same time.",
|
||||
"Use descriptive CTA copy like 'Scan for agenda' or 'Scan for booth resources'.",
|
||||
"Track campaign placements separately so booth banners and flyers are comparable.",
|
||||
"Test glare, print size, and placement distance on the real event materials before the event starts.",
|
||||
],
|
||||
supportLinks: [
|
||||
{
|
||||
href: "/qr-code-tracking",
|
||||
title: "Commercial parent: QR Code Tracking",
|
||||
description: "Best fit when the priority is measuring placement and scan context across the event.",
|
||||
},
|
||||
{
|
||||
href: "/tools/event-qr-code",
|
||||
title: "Event QR Code tool",
|
||||
description: "Useful for save-the-date and calendar workflows that sit alongside broader event QR strategy.",
|
||||
},
|
||||
{
|
||||
href: "/use-cases/restaurant-menu-qr-codes",
|
||||
title: "Sibling page: Restaurant Menu QR Codes",
|
||||
description: "Another example of a printed workflow where the content behind the QR changes often.",
|
||||
},
|
||||
],
|
||||
faq: [
|
||||
{
|
||||
question: "Should an event use one QR code or several?",
|
||||
answer: "Several is usually better. Separate operational QR codes from campaign QR codes so schedules, check-in, and attribution do not compete for one destination.",
|
||||
},
|
||||
{
|
||||
question: "Can event QR codes be updated after print?",
|
||||
answer: "Yes, if the destination is managed dynamically. That is useful for schedules, resource hubs, and post-event follow-up pages.",
|
||||
},
|
||||
{
|
||||
question: "How do I measure which event placement performs best?",
|
||||
answer: "Use distinct destinations or tagged URLs for each placement so banner, booth, badge, and flyer traffic can be compared cleanly.",
|
||||
},
|
||||
],
|
||||
},
|
||||
};
|
||||
|
||||
export function getUseCasePage(slug: string): UseCasePageContent | undefined {
|
||||
return useCasePageContent[slug];
|
||||
}
|
||||
@@ -62,27 +62,27 @@ export function getAllIndexableUrls(): string[] {
|
||||
const blogPages = blogPosts.map(post => `${baseUrl}/blog/${post.slug}`);
|
||||
|
||||
// Main pages (synced with sitemap.ts)
|
||||
const mainPages = [
|
||||
baseUrl,
|
||||
`${baseUrl}/qr-code-erstellen`,
|
||||
`${baseUrl}/qr-code-tracking`,
|
||||
`${baseUrl}/reprint-calculator`,
|
||||
`${baseUrl}/dynamic-qr-code-generator`,
|
||||
`${baseUrl}/bulk-qr-code-generator`,
|
||||
const mainPages = [
|
||||
baseUrl,
|
||||
`${baseUrl}/about`,
|
||||
`${baseUrl}/contact`,
|
||||
`${baseUrl}/press`,
|
||||
`${baseUrl}/testimonials`,
|
||||
`${baseUrl}/qr-code-erstellen`,
|
||||
`${baseUrl}/qr-code-tracking`,
|
||||
`${baseUrl}/reprint-calculator`,
|
||||
`${baseUrl}/dynamic-qr-code-generator`,
|
||||
`${baseUrl}/bulk-qr-code-generator`,
|
||||
`${baseUrl}/custom-qr-code-generator`,
|
||||
`${baseUrl}/manage-qr-codes`,
|
||||
`${baseUrl}/pricing`,
|
||||
`${baseUrl}/tools`,
|
||||
`${baseUrl}/features`,
|
||||
`${baseUrl}/faq`,
|
||||
`${baseUrl}/blog`,
|
||||
`${baseUrl}/signup`,
|
||||
`${baseUrl}/login`,
|
||||
`${baseUrl}/privacy`,
|
||||
`${baseUrl}/guide/tracking-analytics`,
|
||||
`${baseUrl}/guide/bulk-qr-code-generation`,
|
||||
`${baseUrl}/guide/qr-code-best-practices`,
|
||||
];
|
||||
`${baseUrl}/manage-qr-codes`,
|
||||
`${baseUrl}/pricing`,
|
||||
`${baseUrl}/tools`,
|
||||
`${baseUrl}/features`,
|
||||
`${baseUrl}/faq`,
|
||||
`${baseUrl}/blog`,
|
||||
`${baseUrl}/privacy`,
|
||||
`${baseUrl}/newsletter`,
|
||||
];
|
||||
|
||||
// Learn hub and pillar pages
|
||||
const learnPages = [
|
||||
|
||||
Reference in New Issue
Block a user