This commit is contained in:
2026-07-10 21:52:36 +02:00
parent bb528d6ef9
commit 671c1a1559
28 changed files with 6396 additions and 5561 deletions

File diff suppressed because it is too large Load Diff

1308
src/lib/growth-pages-de.ts Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -220,16 +220,16 @@ export const allUseCases: UseCaseLink[] = [
parentTitle: 'Dynamic QR Code Generator',
ctaLabel: 'Create your payment QR code',
},
{
slug: 'qr-codes-for-gyms',
href: '/use-cases/qr-codes-for-gyms',
title: 'QR Codes for Gyms',
cluster: 'gyms',
summary: 'Link workout equipment to tutorial videos, schedules, or trials without reprinting stickers on every machine.',
parentHref: '/dynamic-qr-code-generator',
parentTitle: 'Dynamic QR Code Generator',
ctaLabel: 'Create your gym QR code',
},
{
slug: 'qr-codes-for-gyms',
href: '/use-cases/qr-codes-for-gyms',
title: 'QR Codes for Gyms',
cluster: 'gyms',
summary: 'Link workout equipment to tutorial videos, schedules, or trials without reprinting stickers on every machine.',
parentHref: '/dynamic-qr-code-generator',
parentTitle: 'Dynamic QR Code Generator',
ctaLabel: 'Create your gym QR code',
},
{
slug: 'coupon-qr-codes',
href: '/use-cases/coupon-qr-codes',
@@ -243,9 +243,16 @@ export const allUseCases: UseCaseLink[] = [
},
];
export const featuredUseCases: UseCaseLink[] = allUseCases.filter((item) =>
// Slugs that 301-redirect elsewhere (see next.config.mjs) — must not be
// linked from nav, homepage, or sitemap.
const redirectedUseCaseSlugs = ['restaurant-menu-qr-codes'];
export const publishedUseCases: UseCaseLink[] = allUseCases.filter(
(item) => !redirectedUseCaseSlugs.includes(item.slug)
);
export const featuredUseCases: UseCaseLink[] = publishedUseCases.filter((item) =>
[
'restaurant-menu-qr-codes',
'business-card-qr-codes',
'flyer-qr-codes',
'packaging-qr-codes',
@@ -307,101 +314,101 @@ function bySlug(slug: string): UseCaseLink {
return match;
}
export const useCasePageContent: Record<string, UseCasePageContent> = {
'qr-codes-for-gyms': {
...bySlug('qr-codes-for-gyms'),
eyebrow: 'Gyms & Fitness',
titleSuffix: 'for Equipment Tutorials, Schedules, and Trials',
metaDescription:
'Use gym QR codes to route members to equipment video tutorials, class schedules, and free trial signups without replacing stickers.',
intro:
'Gym QR codes work best when heavy-duty stickers on equipment stay permanent, while the tutorial videos or schedules they link to can be updated.',
answer:
'A gym QR code should point members to an instructional video for the machine they are using, or direct prospects to a mobile signup flow.',
whenToUse: [
'You want to provide video instructions on how to use complex machines.',
'You have class schedules that change weekly or seasonally.',
'You need a contactless way for walk-ins to sign up for a free trial.',
],
comparisonItems: [
{ label: 'Sticker durability', text: 'Permanent application', value: true },
{ label: 'Video updates', text: 'Change links anytime', value: true },
{ label: 'Member engagement', text: 'Track usage stats', value: true },
],
howToSteps: [
'Create one dynamic QR code for each piece of equipment or studio door.',
'Print on durable, sweat-resistant vinyl stickers and apply to machines.',
'Update the linked videos or schedules in your dashboard as needed.',
],
workflowTitle: 'What a good gym QR setup should handle',
workflowIntro:
'Stickers on gym equipment are hard to remove. The QR workflow should make your physical labels permanent while the digital content evolves.',
workflowCards: [
{
title: 'Equipment tutorials',
description: 'Link QR codes on weight machines to short YouTube or TikTok videos demonstrating proper form.',
},
{
title: 'Class schedules',
description: 'Place a QR code on the studio door that links to the live, up-to-date weekly class schedule.',
},
{
title: 'Contactless signup',
description: 'Put a QR code on the front door or window for after-hours visitors to claim a guest pass digitally.',
},
],
checklistTitle: 'Gym QR checklist',
checklist: [
'Print QR codes on high-quality, sweat-resistant vinyl so they survive cleaning sprays.',
'Keep the URL destination dynamic so you never have to scrape off old stickers.',
"Add small text next to the code, e.g., 'Scan to see how to use'.",
'Ensure your gym has decent WiFi coverage for members to stream the videos.',
],
supportLinks: [
{
href: '/dynamic-qr-code-generator',
title: 'Commercial parent: Dynamic QR Code Generator',
description: 'Best fit for keeping equipment stickers permanent while updating video links.',
},
{
href: '/qr-code-tracking',
title: 'Sibling page: QR Code Tracking',
description: 'Useful to see which machines get the most scans and instructional video views.',
},
{
href: '/use-cases/feedback-qr-codes',
title: 'Feedback QR Codes',
description: 'Learn how to place QR codes in locker rooms for facility feedback.',
},
],
faq: [
{
question: 'How do I prevent members from peeling off QR codes on gym equipment?',
answer: 'Use heavy-duty, commercial-grade vinyl stickers with strong adhesive. Place them on flat, metal surfaces away from where members typically grip the machines. Polycarbonate overlays can also prevent peeling and scratching.'
},
{
question: 'Should gym equipment QR codes link to YouTube or a custom video player?',
answer: 'While YouTube is easy, an unlisted Vimeo video or a custom video player on your own domain is better. This prevents competitors\' ads from playing before the tutorial and keeps members focused on their workout.'
},
{
question: 'Can I track which machines are most popular using QR codes?',
answer: 'Yes! By using a unique dynamic QR code for each machine, you can track scan frequency in your dashboard. High scan rates usually indicate high usage, helping you decide which equipment to buy more of in the future.'
},
{
question: 'Do I need separate QR codes for iOS and Android users to download my gym app?',
answer: 'No. You can create a single dynamic App Store QR code that detects the user\'s device and automatically routes iPhones to the Apple App Store and Androids to the Google Play Store.'
},
{
question: 'How do QR codes help with 24/7 contactless gym signups?',
answer: 'You can place a large QR code on your front window. When scanned, it routes prospects to a mobile signup form and waiver. Once completed, your system can automatically issue a temporary digital access pass to their phone.'
},
{
question: 'What happens if we replace a machine with a newer model?',
answer: 'If you use dynamic QR codes, you don\'t need to change the physical sticker if you transfer it. Alternatively, if you apply a new sticker, you can just redirect the old QR code URL to the new machine\'s tutorial video.'
}
],
heroImage: '/marketing/use-cases/qr-codes-for-gyms.png',
heroImageAlt: 'QR code sticker on a gym weight machine being scanned for a video tutorial',
export const useCasePageContent: Record<string, UseCasePageContent> = {
'qr-codes-for-gyms': {
...bySlug('qr-codes-for-gyms'),
eyebrow: 'Gyms & Fitness',
titleSuffix: 'for Equipment Tutorials, Schedules, and Trials',
metaDescription:
'Use gym QR codes to route members to equipment video tutorials, class schedules, and free trial signups without replacing stickers.',
intro:
'Gym QR codes work best when heavy-duty stickers on equipment stay permanent, while the tutorial videos or schedules they link to can be updated.',
answer:
'A gym QR code should point members to an instructional video for the machine they are using, or direct prospects to a mobile signup flow.',
whenToUse: [
'You want to provide video instructions on how to use complex machines.',
'You have class schedules that change weekly or seasonally.',
'You need a contactless way for walk-ins to sign up for a free trial.',
],
comparisonItems: [
{ label: 'Sticker durability', text: 'Permanent application', value: true },
{ label: 'Video updates', text: 'Change links anytime', value: true },
{ label: 'Member engagement', text: 'Track usage stats', value: true },
],
howToSteps: [
'Create one dynamic QR code for each piece of equipment or studio door.',
'Print on durable, sweat-resistant vinyl stickers and apply to machines.',
'Update the linked videos or schedules in your dashboard as needed.',
],
workflowTitle: 'What a good gym QR setup should handle',
workflowIntro:
'Stickers on gym equipment are hard to remove. The QR workflow should make your physical labels permanent while the digital content evolves.',
workflowCards: [
{
title: 'Equipment tutorials',
description: 'Link QR codes on weight machines to short YouTube or TikTok videos demonstrating proper form.',
},
{
title: 'Class schedules',
description: 'Place a QR code on the studio door that links to the live, up-to-date weekly class schedule.',
},
{
title: 'Contactless signup',
description: 'Put a QR code on the front door or window for after-hours visitors to claim a guest pass digitally.',
},
],
checklistTitle: 'Gym QR checklist',
checklist: [
'Print QR codes on high-quality, sweat-resistant vinyl so they survive cleaning sprays.',
'Keep the URL destination dynamic so you never have to scrape off old stickers.',
"Add small text next to the code, e.g., 'Scan to see how to use'.",
'Ensure your gym has decent WiFi coverage for members to stream the videos.',
],
supportLinks: [
{
href: '/dynamic-qr-code-generator',
title: 'Commercial parent: Dynamic QR Code Generator',
description: 'Best fit for keeping equipment stickers permanent while updating video links.',
},
{
href: '/qr-code-tracking',
title: 'Sibling page: QR Code Tracking',
description: 'Useful to see which machines get the most scans and instructional video views.',
},
{
href: '/use-cases/feedback-qr-codes',
title: 'Feedback QR Codes',
description: 'Learn how to place QR codes in locker rooms for facility feedback.',
},
],
faq: [
{
question: 'How do I prevent members from peeling off QR codes on gym equipment?',
answer: 'Use heavy-duty, commercial-grade vinyl stickers with strong adhesive. Place them on flat, metal surfaces away from where members typically grip the machines. Polycarbonate overlays can also prevent peeling and scratching.'
},
{
question: 'Should gym equipment QR codes link to YouTube or a custom video player?',
answer: 'While YouTube is easy, an unlisted Vimeo video or a custom video player on your own domain is better. This prevents competitors\' ads from playing before the tutorial and keeps members focused on their workout.'
},
{
question: 'Can I track which machines are most popular using QR codes?',
answer: 'Yes! By using a unique dynamic QR code for each machine, you can track scan frequency in your dashboard. High scan rates usually indicate high usage, helping you decide which equipment to buy more of in the future.'
},
{
question: 'Do I need separate QR codes for iOS and Android users to download my gym app?',
answer: 'No. You can create a single dynamic App Store QR code that detects the user\'s device and automatically routes iPhones to the Apple App Store and Androids to the Google Play Store.'
},
{
question: 'How do QR codes help with 24/7 contactless gym signups?',
answer: 'You can place a large QR code on your front window. When scanned, it routes prospects to a mobile signup form and waiver. Once completed, your system can automatically issue a temporary digital access pass to their phone.'
},
{
question: 'What happens if we replace a machine with a newer model?',
answer: 'If you use dynamic QR codes, you don\'t need to change the physical sticker if you transfer it. Alternatively, if you apply a new sticker, you can just redirect the old QR code URL to the new machine\'s tutorial video.'
}
],
heroImage: '/marketing/use-cases/qr-codes-for-gyms.png',
heroImageAlt: 'QR code sticker on a gym weight machine being scanned for a video tutorial',
},
'restaurant-menu-qr-codes': {
...bySlug('restaurant-menu-qr-codes'),
@@ -668,12 +675,18 @@ export const useCasePageContent: Record<string, UseCasePageContent> = {
{
href: '/use-cases/flyer-qr-codes',
title: 'Sibling page: Flyer QR Codes',
description:
'Useful when event promotion depends on measurable printed distribution before event day.',
},
],
faq: [
{
description:
'Useful when event promotion depends on measurable printed distribution before event day.',
},
{
href: '/tools/teams-qr-code',
title: 'Teams QR Code Generator',
description:
'Free tool so attendees join Teams meetings and webinars with one scan.',
},
],
faq: [
{
question: 'How do dynamic QR codes prevent disaster if our event schedule changes?',
answer: 'If a speaker cancels or a room changes after you\'ve printed 5,000 attendee badges, a dynamic QR code saves the day. You simply update the digital schedule URL in your dashboard, and everyone\'s printed badge instantly points to the new information.',
},
@@ -864,6 +877,12 @@ export const useCasePageContent: Record<string, UseCasePageContent> = {
description:
'Useful when packaging scans need to trigger a measurable offer or retention prompt.',
},
{
href: '/tools/barcode-generator',
title: 'Barcode Generator',
description:
'Free tool when packaging needs retail barcodes alongside QR codes.',
},
],
faq: [
{
@@ -1063,6 +1082,12 @@ export const useCasePageContent: Record<string, UseCasePageContent> = {
description:
'Useful when the same offline surfaces support both feedback collection and post-visit offers.',
},
{
href: '/tools/google-review-qr-code',
title: 'Google Review QR Code Generator',
description:
'Free tool when the feedback ask should become a public Google review.',
},
],
faq: [
{
@@ -1260,8 +1285,8 @@ export const useCasePageContent: Record<string, UseCasePageContent> = {
'Useful for direct payment-oriented workflows when PayPal is the intended post-scan action.',
},
{
href: '/use-cases/restaurant-menu-qr-codes',
title: 'Sibling page: Restaurant Menu QR Codes',
href: '/restaurants',
title: 'Restaurant QR Codes',
description:
'Useful when table cards combine service information and a later payment or ordering action.',
},
@@ -1443,6 +1468,11 @@ export const useCasePageContent: Record<string, UseCasePageContent> = {
title: 'Dynamic vs Static QR Codes',
description: 'Existing editorial asset for choosing editable QR destinations.',
},
{
href: '/tools/wifi-qr-code',
title: 'WiFi QR Code Generator',
description: 'Free tool so guests join the hotel WiFi without typing a password.',
},
],
faq: [
{
@@ -1526,6 +1556,11 @@ export const useCasePageContent: Record<string, UseCasePageContent> = {
title: 'Dynamic vs Static QR Codes',
description: 'Useful background for choosing dynamic QR destinations.',
},
{
href: '/tools/google-review-qr-code',
title: 'Google Review QR Code Generator',
description: 'Free tool for turning happy clients at the counter into public Google reviews.',
},
],
faq: [
{

36
src/lib/i18n/index.ts Normal file
View File

@@ -0,0 +1,36 @@
import en from '@/i18n/en.json';
import de from '@/i18n/de.json';
export type Locale = 'en' | 'de';
export const locales: Locale[] = ['en', 'de'];
export const defaultLocale: Locale = 'en';
const dictionaries = { en, de } as const;
export type Dictionary = (typeof dictionaries)[Locale];
// Server-side dictionary access. The JSON files are bundled statically, so this
// works in Server Components without async loading.
export function getDictionary(locale: Locale): Dictionary {
return dictionaries[locale] ?? dictionaries[defaultLocale];
}
const BASE_URL = 'https://www.qrmaster.net';
// Builds alternates metadata for a localized page pair. English lives at the
// root, German under /de with its own (possibly localized) path.
export function buildLanguageAlternates(paths: { en: string; de: string }) {
return {
canonical: `${BASE_URL}${paths.en}`,
languages: {
'x-default': `${BASE_URL}${paths.en}`,
en: `${BASE_URL}${paths.en}`,
de: `${BASE_URL}${paths.de}`,
},
};
}
export function absoluteUrl(path: string) {
return `${BASE_URL}${path}`;
}

View File

@@ -3,6 +3,8 @@ import dotenv from 'dotenv';
import { blogPosts } from '../lib/blog-data';
import { pillarMeta } from '../lib/pillar-data';
import { authors } from '../lib/author-data';
import { publishedUseCases } from '../lib/growth-pages';
import { useCasePagesDe } from '../lib/growth-pages-de';
dotenv.config();
@@ -55,34 +57,44 @@ export function getAllIndexableUrls(): string[] {
'wifi-qr-code', 'crypto-qr-code', 'event-qr-code', 'facebook-qr-code',
'instagram-qr-code', 'twitter-qr-code', 'youtube-qr-code', 'whatsapp-qr-code',
'tiktok-qr-code', 'geolocation-qr-code', 'call-qr-code-generator', 'paypal-qr-code',
'zoom-qr-code', 'teams-qr-code',
'zoom-qr-code', 'teams-qr-code', 'google-review-qr-code',
].map(slug => `${baseUrl}/tools/${slug}`);
// Use-case pages (English) and their German twins under /de
const useCasePages = [
`${baseUrl}/use-cases`,
...publishedUseCases.map(uc => `${baseUrl}${uc.href}`),
];
const germanPages = [
`${baseUrl}/de/preise`,
...Object.values(useCasePagesDe).map(uc => `${baseUrl}${uc.href}`),
];
// Blog posts
const blogPages = blogPosts.map(post => `${baseUrl}/blog/${post.slug}`);
// Main pages (synced with sitemap.ts)
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`,
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}/privacy`,
`${baseUrl}/newsletter`,
];
`${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 = [
@@ -93,7 +105,7 @@ export function getAllIndexableUrls(): string[] {
// Author pages
const authorPages = authors.map(author => `${baseUrl}/authors/${author.slug}`);
return [...mainPages, ...freeTools, ...blogPages, ...learnPages, ...authorPages];
return [...mainPages, ...freeTools, ...useCasePages, ...germanPages, ...blogPages, ...learnPages, ...authorPages];
}
// If run directly