Industries
This commit is contained in:
@@ -25,11 +25,11 @@ export default function IntegrationsPage() {
|
||||
const [apiKey, setApiKey] = useState('');
|
||||
const [webhookUrl, setWebhookUrl] = useState('');
|
||||
|
||||
const integrations: Integration[] = [
|
||||
{
|
||||
id: 'zapier',
|
||||
name: 'Zapier',
|
||||
description: 'Connect QR Master with 5,000+ apps',
|
||||
const integrations: Integration[] = [
|
||||
{
|
||||
id: 'zapier',
|
||||
name: 'Zapier',
|
||||
description: 'Connect QR Master with 5,000+ apps',
|
||||
icon: '⚡',
|
||||
status: 'active',
|
||||
category: 'Automation',
|
||||
@@ -112,12 +112,12 @@ export default function IntegrationsPage() {
|
||||
},
|
||||
];
|
||||
|
||||
const stats = {
|
||||
totalQRCodes: 234,
|
||||
activeIntegrations: 2,
|
||||
syncStatus: 'Synced',
|
||||
availableServices: 6,
|
||||
};
|
||||
const stats = {
|
||||
totalQRCodes: 234,
|
||||
activeIntegrations: 2,
|
||||
syncStatus: 'Synced',
|
||||
availableServices: 6,
|
||||
};
|
||||
|
||||
const handleActivate = (integration: Integration) => {
|
||||
setSelectedIntegration(integration);
|
||||
@@ -250,11 +250,11 @@ export default function IntegrationsPage() {
|
||||
))}
|
||||
</div>
|
||||
|
||||
{integration.status === 'active' ? (
|
||||
<Button variant="outline" className="w-full">
|
||||
Configure
|
||||
</Button>
|
||||
) : integration.status === 'coming_soon' ? (
|
||||
{integration.status === 'active' ? (
|
||||
<Button variant="outline" className="w-full">
|
||||
Configure
|
||||
</Button>
|
||||
) : integration.status === 'coming_soon' ? (
|
||||
<Button variant="outline" className="w-full" disabled>
|
||||
Coming Soon
|
||||
</Button>
|
||||
@@ -277,8 +277,8 @@ export default function IntegrationsPage() {
|
||||
<div className="bg-white rounded-xl shadow-lg border border-gray-200 p-6 max-w-lg mx-auto">
|
||||
<h2 className="text-lg font-semibold mb-4">Setup {selectedIntegration.name}</h2>
|
||||
<div className="space-y-4">
|
||||
{selectedIntegration.id === 'zapier' && (
|
||||
<>
|
||||
{selectedIntegration.id === 'zapier' && (
|
||||
<>
|
||||
<div>
|
||||
<label className="block text-sm font-medium text-gray-700 mb-2">
|
||||
Webhook URL
|
||||
@@ -326,11 +326,11 @@ export default function IntegrationsPage() {
|
||||
}`}
|
||||
</pre>
|
||||
</div>
|
||||
</>
|
||||
)}
|
||||
|
||||
{selectedIntegration.id === 'airtable' && (
|
||||
<>
|
||||
</>
|
||||
)}
|
||||
|
||||
{selectedIntegration.id === 'airtable' && (
|
||||
<>
|
||||
<Input
|
||||
label="API Key"
|
||||
type="password"
|
||||
@@ -389,4 +389,4 @@ export default function IntegrationsPage() {
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,10 +6,11 @@ import { usePathname } from 'next/navigation';
|
||||
import { Button } from '@/components/ui/Button';
|
||||
import { Footer } from '@/components/ui/Footer';
|
||||
import en from '@/i18n/en.json';
|
||||
import { ChevronDown, Wifi, Contact, MessageCircle, QrCode, Link2, Type, Mail, MessageSquare, Phone, Calendar, MapPin, Facebook, Instagram, Twitter, Youtube, Music, Bitcoin, CreditCard, Video, Users, Barcode as BarcodeIcon } from 'lucide-react';
|
||||
import { ChevronDown, BookOpen, Building2, Wifi, Contact, MessageCircle, QrCode, Link2, Type, Mail, MessageSquare, Phone, Calendar, MapPin, Facebook, Instagram, Twitter, Youtube, Music, Bitcoin, CreditCard, Video, Users, Barcode as BarcodeIcon } from 'lucide-react';
|
||||
import { cn } from '@/lib/utils';
|
||||
import { AnimatePresence, motion } from 'framer-motion';
|
||||
import { allUseCases } from '@/lib/growth-pages';
|
||||
import { industryPages } from '@/lib/industry-pages';
|
||||
|
||||
export default function MarketingLayout({
|
||||
children,
|
||||
@@ -19,7 +20,9 @@ export default function MarketingLayout({
|
||||
const [mobileMenuOpen, setMobileMenuOpen] = useState(false);
|
||||
const [scrolled, setScrolled] = useState(false);
|
||||
const [toolsOpen, setToolsOpen] = useState(false);
|
||||
const [resourcesOpen, setResourcesOpen] = useState(false);
|
||||
const [mobileToolsOpen, setMobileToolsOpen] = useState(false);
|
||||
const [mobileResourcesOpen, setMobileResourcesOpen] = useState(false);
|
||||
const pathname = usePathname();
|
||||
|
||||
useEffect(() => {
|
||||
@@ -35,7 +38,9 @@ export default function MarketingLayout({
|
||||
useEffect(() => {
|
||||
setMobileMenuOpen(false);
|
||||
setToolsOpen(false);
|
||||
setResourcesOpen(false);
|
||||
setMobileToolsOpen(false);
|
||||
setMobileResourcesOpen(false);
|
||||
}, [pathname]);
|
||||
|
||||
// Default to English for general marketing pages
|
||||
@@ -64,6 +69,13 @@ export default function MarketingLayout({
|
||||
{ name: 'Barcode', description: 'Generate barcodes', href: '/tools/barcode-generator', icon: BarcodeIcon, color: 'text-slate-800', bgColor: 'bg-slate-100' },
|
||||
];
|
||||
|
||||
const resources = [
|
||||
{ name: t.nav.blog, description: 'Insights and tutorials', href: '/blog', icon: MessageSquare, color: 'text-indigo-500', bgColor: 'bg-indigo-50' },
|
||||
{ name: 'Use Cases', description: 'Industry inspiration', href: '/use-cases', icon: Users, color: 'text-blue-500', bgColor: 'bg-blue-50' },
|
||||
{ name: t.nav.learn, description: 'Knowledge center', href: '/learn', icon: BookOpen, color: 'text-amber-500', bgColor: 'bg-amber-50' },
|
||||
{ name: t.nav.all_industries, description: 'Industry solutions', href: '/qr-code-for', icon: Building2, color: 'text-emerald-500', bgColor: 'bg-emerald-50' },
|
||||
];
|
||||
|
||||
return (
|
||||
<div className="min-h-screen bg-white">
|
||||
{/* Server-rendered navigation links for SEO (crawlers) - Placed first for priority */}
|
||||
@@ -92,6 +104,10 @@ export default function MarketingLayout({
|
||||
{allUseCases.map((uc) => (
|
||||
<li key={uc.slug}><a href={uc.href}>{uc.title}</a></li>
|
||||
))}
|
||||
{/* Industry pages */}
|
||||
{industryPages.map((ind) => (
|
||||
<li key={ind.slug}><a href={`/qr-code-for/${ind.slug}`}>{ind.title}</a></li>
|
||||
))}
|
||||
{/* Tools */}
|
||||
<li><a href="/tools/url-qr-code">URL QR Code</a></li>
|
||||
<li><a href="/tools/text-qr-code">Text QR Code</a></li>
|
||||
@@ -135,6 +151,48 @@ export default function MarketingLayout({
|
||||
{/* Desktop Navigation */}
|
||||
<div className="hidden md:flex items-center space-x-1">
|
||||
|
||||
{/* Resources Dropdown */}
|
||||
<div
|
||||
className="relative group px-3 py-2"
|
||||
onMouseEnter={() => setResourcesOpen(true)}
|
||||
onMouseLeave={() => setResourcesOpen(false)}
|
||||
>
|
||||
<button className="flex items-center space-x-1 text-sm font-medium text-slate-600 group-hover:text-slate-900 transition-colors">
|
||||
<span>{t.nav.resources}</span>
|
||||
<ChevronDown className={cn("w-4 h-4 transition-transform duration-200", resourcesOpen && "rotate-180")} />
|
||||
</button>
|
||||
|
||||
<AnimatePresence>
|
||||
{resourcesOpen && (
|
||||
<motion.div
|
||||
initial={{ opacity: 0, y: 10 }}
|
||||
animate={{ opacity: 1, y: 0 }}
|
||||
exit={{ opacity: 0, y: 10 }}
|
||||
transition={{ duration: 0.15 }}
|
||||
className="absolute left-1/2 -translate-x-1/2 top-full mt-2 w-72 bg-white rounded-2xl shadow-lg border border-slate-100 p-2 overflow-hidden"
|
||||
>
|
||||
<div className="flex flex-col">
|
||||
{resources.map((item) => (
|
||||
<Link
|
||||
key={item.name}
|
||||
href={item.href}
|
||||
className="flex items-center space-x-3 p-3 rounded-xl transition-colors hover:bg-slate-50"
|
||||
>
|
||||
<div className={cn("p-2 rounded-lg shrink-0", item.bgColor, item.color)}>
|
||||
<item.icon className="w-4 h-4" />
|
||||
</div>
|
||||
<div>
|
||||
<div className="text-sm font-semibold text-slate-900">{item.name}</div>
|
||||
<p className="text-xs text-slate-500 leading-snug">{item.description}</p>
|
||||
</div>
|
||||
</Link>
|
||||
))}
|
||||
</div>
|
||||
</motion.div>
|
||||
)}
|
||||
</AnimatePresence>
|
||||
</div>
|
||||
|
||||
{/* Tools Dropdown */}
|
||||
<div
|
||||
className="relative group px-3 py-2"
|
||||
@@ -189,15 +247,6 @@ export default function MarketingLayout({
|
||||
<Link href="/about" className="px-3 py-2 text-sm font-medium text-slate-600 hover:text-slate-900 transition-colors">
|
||||
{t.nav.about}
|
||||
</Link>
|
||||
<Link href="/blog" className="px-3 py-2 text-sm font-medium text-slate-600 hover:text-slate-900 transition-colors">
|
||||
{t.nav.blog}
|
||||
</Link>
|
||||
<Link href="/use-cases" className="px-3 py-2 text-sm font-medium text-slate-600 hover:text-slate-900 transition-colors">
|
||||
Use Cases
|
||||
</Link>
|
||||
<Link href="/learn" className="px-3 py-2 text-sm font-medium text-slate-600 hover:text-slate-900 transition-colors">
|
||||
{t.nav.learn}
|
||||
</Link>
|
||||
<Link href="/#faq" className="px-3 py-2 text-sm font-medium text-slate-600 hover:text-slate-900 transition-colors">
|
||||
{t.nav.faq}
|
||||
</Link>
|
||||
@@ -244,6 +293,40 @@ export default function MarketingLayout({
|
||||
className="md:hidden bg-white border-b border-slate-100 overflow-hidden"
|
||||
>
|
||||
<div className="container mx-auto px-4 py-6 space-y-2">
|
||||
{/* Resources Accordion */}
|
||||
<button
|
||||
onClick={() => setMobileResourcesOpen(!mobileResourcesOpen)}
|
||||
className="flex items-center justify-between w-full px-4 py-3 rounded-xl hover:bg-slate-50 text-slate-700 font-semibold"
|
||||
>
|
||||
<span>{t.nav.resources}</span>
|
||||
<ChevronDown className={cn("w-5 h-5 transition-transform", mobileResourcesOpen && "rotate-180")} />
|
||||
</button>
|
||||
|
||||
<AnimatePresence>
|
||||
{mobileResourcesOpen && (
|
||||
<motion.div
|
||||
initial={{ opacity: 0, height: 0 }}
|
||||
animate={{ opacity: 1, height: 'auto' }}
|
||||
exit={{ opacity: 0, height: 0 }}
|
||||
className="overflow-hidden"
|
||||
>
|
||||
<div className="pl-4 space-y-1 border-l-2 border-slate-100 ml-4">
|
||||
{resources.map((item) => (
|
||||
<Link
|
||||
key={item.name}
|
||||
href={item.href}
|
||||
className="flex items-center gap-3 px-4 py-2.5 rounded-lg hover:bg-slate-50 text-slate-600 text-sm"
|
||||
onClick={() => { setMobileMenuOpen(false); setMobileResourcesOpen(false); }}
|
||||
>
|
||||
<item.icon className={cn("w-4 h-4", item.color)} />
|
||||
{item.name}
|
||||
</Link>
|
||||
))}
|
||||
</div>
|
||||
</motion.div>
|
||||
)}
|
||||
</AnimatePresence>
|
||||
|
||||
{/* Free Tools Accordion */}
|
||||
<button
|
||||
onClick={() => setMobileToolsOpen(!mobileToolsOpen)}
|
||||
@@ -283,9 +366,6 @@ export default function MarketingLayout({
|
||||
<Link href="/#features" className="block px-4 py-3 text-slate-700 font-medium rounded-xl hover:bg-slate-50" onClick={() => setMobileMenuOpen(false)}>{t.nav.features}</Link>
|
||||
<Link href="/#pricing" className="block px-4 py-3 text-slate-700 font-medium rounded-xl hover:bg-slate-50" onClick={() => setMobileMenuOpen(false)}>{t.nav.pricing}</Link>
|
||||
<Link href="/about" className="block px-4 py-3 text-slate-700 font-medium rounded-xl hover:bg-slate-50" onClick={() => setMobileMenuOpen(false)}>{t.nav.about}</Link>
|
||||
<Link href="/blog" className="block px-4 py-3 text-slate-700 font-medium rounded-xl hover:bg-slate-50" onClick={() => setMobileMenuOpen(false)}>{t.nav.blog}</Link>
|
||||
<Link href="/use-cases" className="block px-4 py-3 text-slate-700 font-medium rounded-xl hover:bg-slate-50" onClick={() => setMobileMenuOpen(false)}>Use Cases</Link>
|
||||
<Link href="/learn" className="block px-4 py-3 text-slate-700 font-medium rounded-xl hover:bg-slate-50" onClick={() => setMobileMenuOpen(false)}>{t.nav.learn}</Link>
|
||||
<Link href="/#faq" className="block px-4 py-3 text-slate-700 font-medium rounded-xl hover:bg-slate-50" onClick={() => setMobileMenuOpen(false)}>{t.nav.faq}</Link>
|
||||
|
||||
<div className="grid grid-cols-2 gap-4 pt-4">
|
||||
|
||||
168
src/app/(main)/(marketing)/qr-code-for/[industry]/page.tsx
Normal file
168
src/app/(main)/(marketing)/qr-code-for/[industry]/page.tsx
Normal file
@@ -0,0 +1,168 @@
|
||||
import { notFound } from "next/navigation";
|
||||
|
||||
import {
|
||||
buildIndustryMetadata,
|
||||
IndustryPageTemplate,
|
||||
} from "@/components/marketing/IndustryPageTemplate";
|
||||
import { industryPages } from "@/lib/industry-pages";
|
||||
|
||||
type Cta = {
|
||||
href: string;
|
||||
label: string;
|
||||
};
|
||||
|
||||
const toolsMap: Record<string, { href: string; title: string; description: string }> = {
|
||||
"url-qr-code": { href: "/tools/url-qr-code", title: "URL QR Code Generator", description: "Create a scannable link to any webpage and update the destination any time." },
|
||||
"wifi-qr-code": { href: "/tools/wifi-qr-code", title: "WiFi QR Code Generator", description: "Print once, let guests scan to connect, and remove the friction of sharing passwords." },
|
||||
"vcard-qr-code": { href: "/tools/vcard-qr-code", title: "vCard QR Code", description: "Share contact details with a single scan so prospects can save your team instantly." },
|
||||
"email-qr-code": { href: "/tools/email-qr-code", title: "Email QR Code", description: "Open a pre-addressed email draft so customers can contact you faster." },
|
||||
"sms-qr-code": { href: "/tools/sms-qr-code", title: "SMS QR Code", description: "Pre-fill a text message to support bookings, follow-ups, and reminder flows." },
|
||||
"instagram-qr-code": { href: "/tools/instagram-qr-code", title: "Instagram QR Code", description: "Send visitors directly to your Instagram profile, gallery, or creator page." },
|
||||
"facebook-qr-code": { href: "/tools/facebook-qr-code", title: "Facebook QR Code", description: "Link to your Facebook Page or Group with a single scan." },
|
||||
"youtube-qr-code": { href: "/tools/youtube-qr-code", title: "YouTube QR Code", description: "Point visitors to a video, product demo, tutorial, or playlist." },
|
||||
"video-qr-code": { href: "/tools/youtube-qr-code", title: "Video QR Code", description: "Use a video-focused QR workflow for demos, walkthroughs, and visual proof." },
|
||||
"event-qr-code": { href: "/tools/event-qr-code", title: "Event QR Code", description: "Let visitors save event details directly to their phone calendar." },
|
||||
"app-store-qr-code": { href: "/tools/url-qr-code", title: "App Download QR Code", description: "Use a URL QR code to send scans to your App Store or Play Store listing." },
|
||||
"geolocation-qr-code": { href: "/tools/geolocation-qr-code", title: "Location QR Code", description: "Open Google Maps navigation to your store, venue, or office address." },
|
||||
"call-qr-code-generator": { href: "/tools/call-qr-code-generator", title: "Phone Call QR Code", description: "Open the dialer with your number pre-filled for instant contact." },
|
||||
"paypal-qr-code": { href: "/tools/paypal-qr-code", title: "PayPal QR Code", description: "Link directly to a PayPal payment, invoice, or donation page." },
|
||||
"pdf-qr-code": { href: "/tools/url-qr-code", title: "PDF QR Code", description: "Use a URL QR code to open a hosted PDF like a menu, brochure, or operating guide." },
|
||||
"whatsapp-qr-code": { href: "/tools/whatsapp-qr-code", title: "WhatsApp QR Code", description: "Open a WhatsApp chat with your number pre-loaded for faster support." },
|
||||
};
|
||||
|
||||
const industryPrimaryCtas: Record<string, Cta> = {
|
||||
restaurants: { href: "/dynamic-qr-code-generator", label: "Create a Dynamic Menu QR Code" },
|
||||
cafes: { href: "/tools/url-qr-code", label: "Create a Cafe QR Code" },
|
||||
hotels: { href: "/tools/wifi-qr-code", label: "Create a Hotel WiFi QR Code" },
|
||||
"real-estate": { href: "/qr-code-tracking", label: "Track Real Estate QR Scans" },
|
||||
retail: { href: "/bulk-qr-code-generator", label: "Create Bulk Retail QR Codes" },
|
||||
events: { href: "/tools/event-qr-code", label: "Create an Event QR Code" },
|
||||
"doctors-dentists": { href: "/tools/url-qr-code", label: "Create an Intake Form QR Code" },
|
||||
dentists: { href: "/tools/url-qr-code", label: "Create a Dental QR Code" },
|
||||
"trade-shows": { href: "/qr-code-tracking", label: "Track Trade Show QR Leads" },
|
||||
pharmacies: { href: "/tools/email-qr-code", label: "Create a Pharmacy Follow-Up QR Code" },
|
||||
"car-dealerships": { href: "/qr-code-tracking", label: "Track Dealership QR Scans" },
|
||||
"pet-grooming": { href: "/tools/url-qr-code", label: "Create a Grooming Booking QR Code" },
|
||||
veterinarians: { href: "/tools/url-qr-code", label: "Create a Veterinary QR Code" },
|
||||
};
|
||||
|
||||
const industrySecondaryCtas: Record<string, Cta> = {
|
||||
restaurants: { href: "/qr-code-tracking", label: "See QR Tracking Features" },
|
||||
cafes: { href: "/dynamic-qr-code-generator", label: "Try Dynamic QR Codes" },
|
||||
hotels: { href: "/dynamic-qr-code-generator", label: "Try Dynamic QR Codes" },
|
||||
"real-estate": { href: "/dynamic-qr-code-generator", label: "Try Dynamic QR Codes" },
|
||||
retail: { href: "/qr-code-tracking", label: "See QR Tracking Features" },
|
||||
events: { href: "/qr-code-tracking", label: "See QR Tracking Features" },
|
||||
"doctors-dentists": { href: "/qr-code-tracking", label: "See QR Tracking Features" },
|
||||
dentists: { href: "/qr-code-tracking", label: "See QR Tracking Features" },
|
||||
"trade-shows": { href: "/bulk-qr-code-generator", label: "Create Bulk QR Codes" },
|
||||
};
|
||||
|
||||
export function generateStaticParams() {
|
||||
return industryPages.map((page) => ({ industry: page.slug }));
|
||||
}
|
||||
|
||||
export function generateMetadata({ params }: { params: { industry: string } }) {
|
||||
const page = industryPages.find((entry) => entry.slug === params.industry);
|
||||
if (!page) return {};
|
||||
|
||||
return buildIndustryMetadata({
|
||||
title: page.metaTitle || page.title,
|
||||
fallbackTitle: page.title,
|
||||
description: page.metaDescription,
|
||||
canonicalPath: `/qr-code-for/${page.slug}`,
|
||||
});
|
||||
}
|
||||
|
||||
function getToolCta(toolSlug?: string): Cta | null {
|
||||
if (!toolSlug) return null;
|
||||
const tool = toolsMap[toolSlug];
|
||||
if (!tool) return null;
|
||||
|
||||
if (toolSlug === "url-qr-code") {
|
||||
return { href: tool.href, label: "Create a QR Code" };
|
||||
}
|
||||
|
||||
return { href: tool.href, label: `Create a ${tool.title}` };
|
||||
}
|
||||
|
||||
function getPrimaryCta(page: (typeof industryPages)[number]): Cta {
|
||||
return (
|
||||
industryPrimaryCtas[page.slug] ??
|
||||
getToolCta(page.tools[0]) ?? {
|
||||
href: "/dynamic-qr-code-generator",
|
||||
label: "Create a Dynamic QR Code",
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
function getSecondaryCta(page: (typeof industryPages)[number]): Cta {
|
||||
return (
|
||||
industrySecondaryCtas[page.slug] ?? {
|
||||
href: "/pricing",
|
||||
label: "View Plans",
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
function getHeroImageAlt(page: (typeof industryPages)[number]) {
|
||||
return `${page.name} QR code example showing a real-world workflow for ${page.useCases[0]?.toLowerCase() ?? "customer engagement"}.`;
|
||||
}
|
||||
|
||||
export default function IndustryPage({ params }: { params: { industry: string } }) {
|
||||
const page = industryPages.find((entry) => entry.slug === params.industry);
|
||||
if (!page) notFound();
|
||||
|
||||
const primaryCta = getPrimaryCta(page);
|
||||
const secondaryCta = getSecondaryCta(page);
|
||||
const supportLinks = page.tools.map(
|
||||
(slug) =>
|
||||
toolsMap[slug] ?? {
|
||||
href: "/tools/url-qr-code",
|
||||
title: "QR Code Generator",
|
||||
description: "Create a QR code for your business.",
|
||||
}
|
||||
);
|
||||
const useCaseStrings = Array.isArray(page.useCases) ? page.useCases : [];
|
||||
|
||||
return (
|
||||
<IndustryPageTemplate
|
||||
title={page.title}
|
||||
description={page.metaDescription}
|
||||
eyebrow={page.name}
|
||||
intro={page.subheadline || page.headline}
|
||||
pageType="commercial"
|
||||
cluster="industry"
|
||||
useCase={page.slug}
|
||||
breadcrumbs={[
|
||||
{ name: "Home", url: "/" },
|
||||
{ name: "QR Codes by Industry", url: "/qr-code-for" },
|
||||
{ name: page.title, url: `/qr-code-for/${page.slug}` },
|
||||
]}
|
||||
answer={page.headline}
|
||||
whenToUse={useCaseStrings.slice(0, 3)}
|
||||
comparisonItems={[
|
||||
{ label: "Update destination after printing", value: true, text: "Dynamic QR codes" },
|
||||
{ label: "Track scans by date, device & location", value: true, text: "Built-in analytics" },
|
||||
{ label: "No app needed to scan", value: true, text: "Works with native camera" },
|
||||
]}
|
||||
howToSteps={page.placementTips.slice(0, 3)}
|
||||
primaryCta={primaryCta}
|
||||
secondaryCta={secondaryCta}
|
||||
workflowTitle={`How ${page.name} Use QR Codes`}
|
||||
workflowIntro={`Practical QR code workflows built around how ${page.name.toLowerCase()} actually operate.`}
|
||||
workflowCards={useCaseStrings.slice(0, 3).map((useCase, index) => ({
|
||||
title: `Workflow ${index + 1}`,
|
||||
description: useCase,
|
||||
}))}
|
||||
checklistTitle={`${page.name} QR Code Checklist`}
|
||||
checklist={page.placementTips}
|
||||
supportLinks={supportLinks}
|
||||
faq={page.faq}
|
||||
heroImage={page.heroImage}
|
||||
heroImageAlt={getHeroImageAlt(page)}
|
||||
statistics={page.statistics}
|
||||
benefits={page.benefits}
|
||||
/>
|
||||
);
|
||||
}
|
||||
333
src/app/(main)/(marketing)/qr-code-for/page.tsx
Normal file
333
src/app/(main)/(marketing)/qr-code-for/page.tsx
Normal file
@@ -0,0 +1,333 @@
|
||||
import type { Metadata } from "next";
|
||||
import Link from "next/link";
|
||||
import { ArrowRight, Building2, CheckCircle2 } from "lucide-react";
|
||||
|
||||
import { FAQSection } from "@/components/aeo/FAQSection";
|
||||
import SeoJsonLd from "@/components/SeoJsonLd";
|
||||
import { Button } from "@/components/ui/Button";
|
||||
import { industryPages } from "@/lib/industry-pages";
|
||||
import { breadcrumbSchema, faqPageSchema } from "@/lib/schema";
|
||||
|
||||
type IndustryCategory = {
|
||||
id: string;
|
||||
title: string;
|
||||
description: string;
|
||||
slugs: string[];
|
||||
};
|
||||
|
||||
const categories: IndustryCategory[] = [
|
||||
{
|
||||
id: "food-hospitality",
|
||||
title: "Food, Hospitality, and Guest Experience",
|
||||
description: "Use QR codes to replace printed menus, simplify guest WiFi, speed up bookings, and keep in-venue information current without reprinting.",
|
||||
slugs: [
|
||||
"restaurants",
|
||||
"cafes",
|
||||
"hotels",
|
||||
"bars",
|
||||
"food-trucks",
|
||||
"bakeries",
|
||||
"breweries",
|
||||
"nightclubs",
|
||||
"catering",
|
||||
"wineries",
|
||||
],
|
||||
},
|
||||
{
|
||||
id: "health-lifestyle",
|
||||
title: "Health, Wellness, and Personal Services",
|
||||
description: "Support appointment booking, aftercare, digital treatment menus, and high-intent follow-up flows across health and lifestyle businesses.",
|
||||
slugs: [
|
||||
"gyms",
|
||||
"doctors-dentists",
|
||||
"dentists",
|
||||
"yoga-studios",
|
||||
"spas",
|
||||
"beauty-salons",
|
||||
"barbershops",
|
||||
"nail-salons",
|
||||
"tattoo-studios",
|
||||
"pharmacies",
|
||||
"pet-grooming",
|
||||
"veterinarians",
|
||||
],
|
||||
},
|
||||
{
|
||||
id: "retail-commerce",
|
||||
title: "Retail, Packaging, and Product Discovery",
|
||||
description: "Bridge shelf, packaging, and in-store discovery with QR codes for demos, manuals, size guides, reviews, and product detail pages.",
|
||||
slugs: [
|
||||
"retail",
|
||||
"clothing-stores",
|
||||
"car-dealerships",
|
||||
"florists",
|
||||
"pet-stores",
|
||||
"electronics-stores",
|
||||
"jewelry-stores",
|
||||
"hardware-stores",
|
||||
"bookstores",
|
||||
],
|
||||
},
|
||||
{
|
||||
id: "education-culture-public",
|
||||
title: "Education, Culture, and Public Spaces",
|
||||
description: "Improve access to maps, resources, ticketing, audio guides, and visitor information across campuses, venues, and cultural institutions.",
|
||||
slugs: [
|
||||
"universities",
|
||||
"schools",
|
||||
"museums",
|
||||
"libraries",
|
||||
"theaters",
|
||||
"cinemas",
|
||||
"churches",
|
||||
"art-galleries",
|
||||
"stadiums",
|
||||
"airports",
|
||||
],
|
||||
},
|
||||
{
|
||||
id: "services-b2b-events",
|
||||
title: "Services, Real Estate, and Lead Capture",
|
||||
description: "Turn printed materials into measurable lead-gen assets for agencies, property businesses, events, and professional service firms.",
|
||||
slugs: [
|
||||
"real-estate",
|
||||
"events",
|
||||
"wedding-planners",
|
||||
"photographers",
|
||||
"trade-shows",
|
||||
"law-firms",
|
||||
"accountants",
|
||||
"insurance-agencies",
|
||||
"travel-agencies",
|
||||
"coworking-spaces",
|
||||
"property-management",
|
||||
],
|
||||
},
|
||||
];
|
||||
|
||||
const hubFaq = [
|
||||
{
|
||||
question: "Which industries get the most value from dynamic QR codes?",
|
||||
answer:
|
||||
"Industries that print menus, flyers, labels, in-store signage, or operational materials usually benefit most because they can update destinations without reprinting every asset.",
|
||||
},
|
||||
{
|
||||
question: "Should industry QR code pages focus on tools or workflows?",
|
||||
answer:
|
||||
"Both matter, but workflow intent usually ranks better. Searchers often want a job-to-be-done answer first, then the right QR code tool to implement it.",
|
||||
},
|
||||
{
|
||||
question: "Are industry-specific QR code pages good for SEO?",
|
||||
answer:
|
||||
"Yes, when each page targets a real search intent, has unique examples, and connects to a relevant next step such as tracking, dynamic QR management, or the matching QR tool.",
|
||||
},
|
||||
{
|
||||
question: "What makes a QR code industry page convert well?",
|
||||
answer:
|
||||
"Clear use cases, realistic placement advice, trust-building FAQs, and a CTA that matches the industry workflow outperform generic sign-up prompts.",
|
||||
},
|
||||
];
|
||||
|
||||
const highlightedLinks = [
|
||||
{ href: "/dynamic-qr-code-generator", title: "Dynamic QR Code Generator", description: "Best next step for menus, signage, packaging, and any printed asset that may change later." },
|
||||
{ href: "/qr-code-tracking", title: "QR Code Tracking", description: "Measure scans from flyers, property signage, retail displays, trade shows, and offline campaigns." },
|
||||
{ href: "/bulk-qr-code-generator", title: "Bulk QR Code Generator", description: "Best fit for packaging, product lines, multi-location rollouts, and large campaigns." },
|
||||
{ href: "/tools/wifi-qr-code", title: "WiFi QR Code Tool", description: "Popular for hotels, cafes, coworking spaces, clinics, and guest-facing venues." },
|
||||
];
|
||||
|
||||
export const metadata: Metadata = {
|
||||
title: "QR Codes by Industry: Use Cases and Examples",
|
||||
description:
|
||||
"Explore QR code ideas by industry, including restaurants, hotels, retail, healthcare, events, education, and professional services. Find use cases, examples, and the best QR workflow for your business.",
|
||||
alternates: {
|
||||
canonical: "https://www.qrmaster.net/qr-code-for",
|
||||
},
|
||||
openGraph: {
|
||||
title: "QR Codes by Industry | QR Master",
|
||||
description:
|
||||
"Find industry-specific QR code use cases, workflows, and examples for hospitality, retail, healthcare, events, education, and more.",
|
||||
url: "https://www.qrmaster.net/qr-code-for",
|
||||
type: "website",
|
||||
images: ["/og-image.png"],
|
||||
},
|
||||
twitter: {
|
||||
title: "QR Codes by Industry | QR Master",
|
||||
description:
|
||||
"Industry-specific QR code ideas and workflows for restaurants, hotels, retail, events, healthcare, and more.",
|
||||
},
|
||||
};
|
||||
|
||||
function getIndustryBySlug(slug: string) {
|
||||
return industryPages.find((industry) => industry.slug === slug);
|
||||
}
|
||||
|
||||
export default function IndustryOverviewPage() {
|
||||
const itemListSchema = {
|
||||
"@context": "https://schema.org",
|
||||
"@type": "CollectionPage",
|
||||
name: "QR Codes by Industry",
|
||||
url: "https://www.qrmaster.net/qr-code-for",
|
||||
mainEntity: {
|
||||
"@type": "ItemList",
|
||||
itemListElement: industryPages.map((industry, index) => ({
|
||||
"@type": "ListItem",
|
||||
position: index + 1,
|
||||
url: `https://www.qrmaster.net/qr-code-for/${industry.slug}`,
|
||||
name: industry.title,
|
||||
})),
|
||||
},
|
||||
};
|
||||
|
||||
return (
|
||||
<>
|
||||
<SeoJsonLd
|
||||
data={[
|
||||
itemListSchema,
|
||||
breadcrumbSchema([
|
||||
{ name: "Home", url: "/" },
|
||||
{ name: "QR Codes by Industry", url: "/qr-code-for" },
|
||||
]),
|
||||
faqPageSchema(hubFaq),
|
||||
]}
|
||||
/>
|
||||
|
||||
<div className="min-h-screen bg-white text-slate-900 font-sans">
|
||||
<section className="relative overflow-hidden border-b border-slate-100 bg-slate-50/70 pt-24 pb-20 lg:pt-32 lg:pb-24">
|
||||
<div className="pointer-events-none absolute inset-0 bg-[linear-gradient(to_right,#cbd5e1_1px,transparent_1px),linear-gradient(to_bottom,#cbd5e1_1px,transparent_1px)] bg-[size:4rem_4rem] [mask-image:radial-gradient(ellipse_85%_75%_at_50%_0%,#000_70%,transparent_110%)] opacity-25" />
|
||||
<div className="pointer-events-none absolute top-0 right-0 h-[28rem] w-[28rem] rounded-full bg-blue-200/40 blur-[110px]" />
|
||||
|
||||
<div className="relative z-10 container mx-auto max-w-7xl px-4 sm:px-6 lg:px-8">
|
||||
<div className="mx-auto max-w-4xl text-center">
|
||||
<div className="mb-6 inline-flex items-center gap-2 rounded-full bg-blue-100 px-3 py-1.5 text-sm font-semibold text-blue-700">
|
||||
<Building2 className="h-4 w-4" />
|
||||
Industry Solutions
|
||||
</div>
|
||||
<h1 className="text-4xl font-extrabold tracking-tight text-slate-900 md:text-6xl">
|
||||
QR Codes by Industry
|
||||
</h1>
|
||||
<p className="mx-auto mt-6 max-w-3xl text-lg leading-relaxed text-slate-600 md:text-xl">
|
||||
Explore industry-specific QR code strategies for hospitality, retail, healthcare, events, education, and professional services. Each page is built around real workflows like menu updates, review collection, guest WiFi, bookings, packaging, and offline campaign tracking.
|
||||
</p>
|
||||
|
||||
<div className="mt-10 flex flex-col items-center justify-center gap-4 sm:flex-row">
|
||||
<Link href="/dynamic-qr-code-generator">
|
||||
<Button size="lg" className="rounded-full bg-blue-600 px-8 py-6 text-base font-bold text-white hover:bg-blue-700">
|
||||
Create a Dynamic QR Code
|
||||
</Button>
|
||||
</Link>
|
||||
<Link href="/qr-code-tracking">
|
||||
<Button variant="outline" size="lg" className="rounded-full px-8 py-6 text-base font-bold">
|
||||
See QR Tracking Features
|
||||
</Button>
|
||||
</Link>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section className="border-b border-slate-100 bg-white py-8">
|
||||
<div className="container mx-auto max-w-7xl px-4 sm:px-6 lg:px-8">
|
||||
<div className="flex flex-wrap gap-3">
|
||||
{categories.map((category) => (
|
||||
<a
|
||||
key={category.id}
|
||||
href={`#${category.id}`}
|
||||
className="rounded-full border border-slate-200 bg-slate-50 px-4 py-2 text-sm font-semibold text-slate-700 transition-colors hover:border-blue-200 hover:bg-blue-50 hover:text-blue-700"
|
||||
>
|
||||
{category.title}
|
||||
</a>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section className="py-16">
|
||||
<div className="container mx-auto max-w-7xl px-4 sm:px-6 lg:px-8">
|
||||
<div className="grid gap-6 lg:grid-cols-4">
|
||||
{highlightedLinks.map((item) => (
|
||||
<Link
|
||||
key={item.href}
|
||||
href={item.href}
|
||||
className="group rounded-3xl border border-slate-200 bg-white p-6 shadow-sm transition-all hover:-translate-y-1 hover:border-blue-200 hover:shadow-lg"
|
||||
>
|
||||
<h2 className="text-lg font-bold text-slate-900 group-hover:text-blue-600">{item.title}</h2>
|
||||
<p className="mt-3 text-sm leading-relaxed text-slate-600">{item.description}</p>
|
||||
<div className="mt-4 inline-flex items-center text-sm font-semibold text-blue-600">
|
||||
Explore <ArrowRight className="ml-2 h-4 w-4" />
|
||||
</div>
|
||||
</Link>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{categories.map((category) => {
|
||||
const entries = category.slugs
|
||||
.map(getIndustryBySlug)
|
||||
.filter((industry): industry is NonNullable<typeof industry> => Boolean(industry));
|
||||
|
||||
return (
|
||||
<section
|
||||
key={category.id}
|
||||
id={category.id}
|
||||
className="border-t border-slate-100 py-20 scroll-mt-28"
|
||||
>
|
||||
<div className="container mx-auto max-w-7xl px-4 sm:px-6 lg:px-8">
|
||||
<div className="mb-12 max-w-3xl">
|
||||
<h2 className="text-3xl font-bold tracking-tight text-slate-900 sm:text-4xl">
|
||||
{category.title}
|
||||
</h2>
|
||||
<p className="mt-4 text-lg leading-relaxed text-slate-600">
|
||||
{category.description}
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div className="grid grid-cols-1 gap-8 md:grid-cols-2 lg:grid-cols-3">
|
||||
{entries.map((industry) => (
|
||||
<Link
|
||||
key={industry.slug}
|
||||
href={`/qr-code-for/${industry.slug}`}
|
||||
className="group flex flex-col rounded-3xl border border-slate-200 bg-white p-8 shadow-sm transition-all duration-300 hover:-translate-y-1 hover:border-blue-200 hover:shadow-xl"
|
||||
>
|
||||
<h3 className="text-2xl font-bold text-slate-900 transition-colors group-hover:text-blue-600">
|
||||
{industry.name}
|
||||
</h3>
|
||||
<p className="mt-3 flex-grow text-slate-600">
|
||||
{industry.metaDescription}
|
||||
</p>
|
||||
<ul className="mt-6 space-y-2">
|
||||
{industry.useCases.slice(0, 2).map((useCase) => (
|
||||
<li key={useCase} className="flex items-start gap-2 text-sm text-slate-500">
|
||||
<CheckCircle2 className="mt-0.5 h-4 w-4 shrink-0 text-blue-600" />
|
||||
<span>{useCase}</span>
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
<div className="mt-8 flex items-center text-blue-600 font-semibold transition-transform group-hover:translate-x-1">
|
||||
Explore Solutions <ArrowRight className="ml-2 h-5 w-5" />
|
||||
</div>
|
||||
</Link>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
);
|
||||
})}
|
||||
|
||||
<section className="border-t border-slate-100 bg-slate-50 py-20">
|
||||
<div className="container mx-auto max-w-4xl px-4 sm:px-6 lg:px-8">
|
||||
<div className="mb-10 text-center">
|
||||
<h2 className="text-3xl font-bold tracking-tight text-slate-900 sm:text-4xl">
|
||||
Frequently Asked Questions
|
||||
</h2>
|
||||
</div>
|
||||
<div className="rounded-3xl border border-slate-200 bg-white p-6 shadow-sm sm:p-10">
|
||||
<FAQSection items={hubFaq} title="" />
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
</>
|
||||
);
|
||||
}
|
||||
@@ -51,7 +51,7 @@ export default function ReprintCalculatorPage() {
|
||||
|
||||
<p className="text-xl text-slate-600 mb-8 leading-relaxed max-w-2xl mx-auto">
|
||||
Every time a URL changes, static QR codes become useless trash.
|
||||
Dynamic QR codes update instantly—keeping your print materials alive forever.
|
||||
Dynamic QR codes let you update the destination URL at any time — your printed materials stay usable even when links change.
|
||||
</p>
|
||||
|
||||
<div className="flex justify-center">
|
||||
|
||||
@@ -148,8 +148,8 @@ export default function CallQRCodePage() {
|
||||
</h1>
|
||||
|
||||
<p className="text-lg md:text-xl text-indigo-100 max-w-2xl mx-auto lg:mx-0 mb-8 leading-relaxed">
|
||||
The #1 Tool for Click-to-Call QR Codes. Scanners instantly open their phone dialer with your number pre-filled.
|
||||
<strong className="text-white block sm:inline mt-2 sm:mt-0"> Perfect for print marketing.</strong>
|
||||
Create a QR code that opens the phone dialer with your number pre-filled — one scan, no typing.
|
||||
<strong className="text-white block sm:inline mt-2 sm:mt-0"> Works on every smartphone.</strong>
|
||||
</p>
|
||||
|
||||
<div className="flex flex-wrap justify-center lg:justify-start gap-4 text-sm font-medium text-white/80">
|
||||
|
||||
@@ -149,7 +149,7 @@ export default function FacebookQRCodePage() {
|
||||
|
||||
<p className="text-lg md:text-xl text-blue-50 max-w-2xl mx-auto lg:mx-0 mb-8 leading-relaxed">
|
||||
Make it easy for customers to find and follow you. A single scan opens your Page directly in the Facebook app.
|
||||
<strong className="text-white block sm:inline mt-2 sm:mt-0"> Boost likes instantly.</strong>
|
||||
<strong className="text-white block sm:inline mt-2 sm:mt-0"> No app switching required.</strong>
|
||||
</p>
|
||||
|
||||
<div className="flex flex-wrap justify-center lg:justify-start gap-4 text-sm font-medium text-white/80">
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { NextResponse } from 'next/server';
|
||||
import { db } from '@/lib/db';
|
||||
import { Prisma } from '@prisma/client';
|
||||
import { NextResponse } from 'next/server';
|
||||
import { db } from '@/lib/db';
|
||||
import { Prisma } from '@prisma/client';
|
||||
|
||||
interface LeadInput {
|
||||
email: string;
|
||||
@@ -25,17 +25,17 @@ export async function POST(request: Request) {
|
||||
// Use typed db client - keeping (db as any) temporarily if types are missing locally,
|
||||
// but cleaner code should use db.lead directly.
|
||||
// We will trust the user to run `npm run build` which runs `prisma generate`.
|
||||
const lead = await db.lead.create({
|
||||
data: {
|
||||
email: email.toLowerCase().trim(),
|
||||
const lead = await db.lead.create({
|
||||
data: {
|
||||
email: email.toLowerCase().trim(),
|
||||
source: source || 'reprint-calculator',
|
||||
reprintCost: reprintCost ? Number(reprintCost) : null,
|
||||
updatesPerYear: updatesPerYear ? Number(updatesPerYear) : null,
|
||||
annualSavings: annualSavings ? Number(annualSavings) : null,
|
||||
},
|
||||
});
|
||||
|
||||
return NextResponse.json({ success: true, id: lead.id });
|
||||
},
|
||||
});
|
||||
|
||||
return NextResponse.json({ success: true, id: lead.id });
|
||||
} catch (error) {
|
||||
console.error('Error saving lead:', error);
|
||||
|
||||
|
||||
@@ -1,65 +1,66 @@
|
||||
import { MetadataRoute } from 'next';
|
||||
import { blogPosts } from '../lib/blog-data';
|
||||
import { pillarMeta } from '../lib/pillar-data';
|
||||
import { authors } from '../lib/author-data';
|
||||
|
||||
export default function sitemap(): MetadataRoute.Sitemap {
|
||||
const baseUrl = 'https://www.qrmaster.net';
|
||||
|
||||
// All free tool slugs
|
||||
const freeTools = [
|
||||
'url-qr-code',
|
||||
'vcard-qr-code',
|
||||
'text-qr-code',
|
||||
'email-qr-code',
|
||||
'sms-qr-code',
|
||||
'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',
|
||||
'barcode-generator',
|
||||
];
|
||||
|
||||
// All blog posts
|
||||
// Filter out future posts so Google doesn't see them
|
||||
const blogPages = blogPosts
|
||||
.filter(post => {
|
||||
const publishDate = post.datePublished ? new Date(post.datePublished) : new Date(post.date);
|
||||
return publishDate <= new Date();
|
||||
})
|
||||
.map((post) => ({
|
||||
url: `${baseUrl}/blog/${post.slug}`,
|
||||
// Use updatedAt if available, otherwise dateModified or datePublished
|
||||
lastModified: post.updatedAt ? new Date(post.updatedAt) : (post.dateModified ? new Date(post.dateModified) : new Date()),
|
||||
changeFrequency: 'monthly' as const,
|
||||
priority: 0.8,
|
||||
}));
|
||||
|
||||
const toolPages = freeTools.map((slug) => ({
|
||||
url: `${baseUrl}/tools/${slug}`,
|
||||
lastModified: new Date(),
|
||||
changeFrequency: 'monthly' as const,
|
||||
priority: 0.8,
|
||||
}));
|
||||
|
||||
// Learn hub and pillar pages
|
||||
import { MetadataRoute } from 'next';
|
||||
import { blogPosts } from '../lib/blog-data';
|
||||
import { pillarMeta } from '../lib/pillar-data';
|
||||
import { authors } from '../lib/author-data';
|
||||
import { industryPages } from '../lib/industry-pages';
|
||||
|
||||
export default function sitemap(): MetadataRoute.Sitemap {
|
||||
const baseUrl = 'https://www.qrmaster.net';
|
||||
|
||||
// All free tool slugs
|
||||
const freeTools = [
|
||||
'url-qr-code',
|
||||
'vcard-qr-code',
|
||||
'text-qr-code',
|
||||
'email-qr-code',
|
||||
'sms-qr-code',
|
||||
'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',
|
||||
'barcode-generator',
|
||||
];
|
||||
|
||||
// All blog posts
|
||||
// Filter out future posts so Google doesn't see them
|
||||
const blogPages = blogPosts
|
||||
.filter(post => {
|
||||
const publishDate = post.datePublished ? new Date(post.datePublished) : new Date(post.date);
|
||||
return publishDate <= new Date();
|
||||
})
|
||||
.map((post) => ({
|
||||
url: `${baseUrl}/blog/${post.slug}`,
|
||||
// Use updatedAt if available, otherwise dateModified or datePublished
|
||||
lastModified: post.updatedAt ? new Date(post.updatedAt) : (post.dateModified ? new Date(post.dateModified) : new Date()),
|
||||
changeFrequency: 'monthly' as const,
|
||||
priority: 0.8,
|
||||
}));
|
||||
|
||||
const toolPages = freeTools.map((slug) => ({
|
||||
url: `${baseUrl}/tools/${slug}`,
|
||||
lastModified: new Date(),
|
||||
changeFrequency: 'monthly' as const,
|
||||
priority: 0.8,
|
||||
}));
|
||||
|
||||
// Learn hub and pillar pages
|
||||
const learnPages = [
|
||||
{
|
||||
url: `${baseUrl}/learn`,
|
||||
lastModified: new Date(),
|
||||
changeFrequency: 'weekly' as const,
|
||||
priority: 0.9,
|
||||
},
|
||||
lastModified: new Date(),
|
||||
changeFrequency: 'weekly' as const,
|
||||
priority: 0.9,
|
||||
},
|
||||
...pillarMeta.map((pillar) => ({
|
||||
url: `${baseUrl}/learn/${pillar.key}`,
|
||||
lastModified: new Date(),
|
||||
@@ -68,6 +69,13 @@ export default function sitemap(): MetadataRoute.Sitemap {
|
||||
})),
|
||||
];
|
||||
|
||||
const industryUrls = industryPages.map((industry) => ({
|
||||
url: `${baseUrl}/qr-code-for/${industry.slug}`,
|
||||
lastModified: new Date(),
|
||||
changeFrequency: 'monthly' as const,
|
||||
priority: 0.85,
|
||||
}));
|
||||
|
||||
const growthUseCasePages = [
|
||||
{
|
||||
url: `${baseUrl}/use-cases`,
|
||||
@@ -75,6 +83,12 @@ export default function sitemap(): MetadataRoute.Sitemap {
|
||||
changeFrequency: 'weekly' as const,
|
||||
priority: 0.9,
|
||||
},
|
||||
{
|
||||
url: `${baseUrl}/qr-code-for`,
|
||||
lastModified: new Date(),
|
||||
changeFrequency: 'weekly' as const,
|
||||
priority: 0.9,
|
||||
},
|
||||
{
|
||||
url: `${baseUrl}/use-cases/restaurant-menu-qr-codes`,
|
||||
lastModified: new Date(),
|
||||
@@ -136,34 +150,34 @@ export default function sitemap(): MetadataRoute.Sitemap {
|
||||
priority: 0.85,
|
||||
},
|
||||
];
|
||||
|
||||
// Author pages
|
||||
const authorPages = authors.map((author) => ({
|
||||
url: `${baseUrl}/authors/${author.slug}`,
|
||||
lastModified: new Date(),
|
||||
changeFrequency: 'monthly' as const,
|
||||
priority: 0.7,
|
||||
}));
|
||||
|
||||
return [
|
||||
{
|
||||
url: baseUrl,
|
||||
lastModified: new Date(),
|
||||
changeFrequency: 'weekly',
|
||||
priority: 1.0,
|
||||
},
|
||||
{
|
||||
url: `${baseUrl}/newsletter`,
|
||||
lastModified: new Date(),
|
||||
changeFrequency: 'monthly',
|
||||
priority: 0.7,
|
||||
},
|
||||
{
|
||||
url: `${baseUrl}/qr-code-erstellen`,
|
||||
lastModified: new Date(),
|
||||
changeFrequency: 'weekly',
|
||||
priority: 1.0,
|
||||
},
|
||||
|
||||
// Author pages
|
||||
const authorPages = authors.map((author) => ({
|
||||
url: `${baseUrl}/authors/${author.slug}`,
|
||||
lastModified: new Date(),
|
||||
changeFrequency: 'monthly' as const,
|
||||
priority: 0.7,
|
||||
}));
|
||||
|
||||
return [
|
||||
{
|
||||
url: baseUrl,
|
||||
lastModified: new Date(),
|
||||
changeFrequency: 'weekly',
|
||||
priority: 1.0,
|
||||
},
|
||||
{
|
||||
url: `${baseUrl}/newsletter`,
|
||||
lastModified: new Date(),
|
||||
changeFrequency: 'monthly',
|
||||
priority: 0.7,
|
||||
},
|
||||
{
|
||||
url: `${baseUrl}/qr-code-erstellen`,
|
||||
lastModified: new Date(),
|
||||
changeFrequency: 'weekly',
|
||||
priority: 1.0,
|
||||
},
|
||||
{
|
||||
url: `${baseUrl}/qr-code-tracking`,
|
||||
lastModified: new Date(),
|
||||
@@ -180,95 +194,95 @@ export default function sitemap(): MetadataRoute.Sitemap {
|
||||
url: `${baseUrl}/reprint-calculator`,
|
||||
lastModified: new Date(),
|
||||
changeFrequency: 'monthly',
|
||||
priority: 0.9,
|
||||
},
|
||||
{
|
||||
url: `${baseUrl}/dynamic-qr-code-generator`,
|
||||
lastModified: new Date(),
|
||||
changeFrequency: 'monthly',
|
||||
priority: 0.9,
|
||||
},
|
||||
{
|
||||
url: `${baseUrl}/bulk-qr-code-generator`,
|
||||
lastModified: new Date(),
|
||||
changeFrequency: 'monthly',
|
||||
priority: 0.9,
|
||||
},
|
||||
{
|
||||
url: `${baseUrl}/custom-qr-code-generator`,
|
||||
lastModified: new Date(),
|
||||
changeFrequency: 'weekly',
|
||||
priority: 0.9,
|
||||
},
|
||||
|
||||
{
|
||||
url: `${baseUrl}/pricing`,
|
||||
lastModified: new Date(),
|
||||
changeFrequency: 'monthly',
|
||||
priority: 0.8,
|
||||
},
|
||||
{
|
||||
url: `${baseUrl}/tools`,
|
||||
lastModified: new Date(),
|
||||
changeFrequency: 'monthly',
|
||||
priority: 0.9,
|
||||
},
|
||||
{
|
||||
url: `${baseUrl}/features`,
|
||||
lastModified: new Date(),
|
||||
changeFrequency: 'monthly',
|
||||
priority: 0.8,
|
||||
},
|
||||
{
|
||||
url: `${baseUrl}/faq`,
|
||||
lastModified: new Date(),
|
||||
changeFrequency: 'monthly',
|
||||
priority: 0.7,
|
||||
},
|
||||
{
|
||||
url: `${baseUrl}/blog`,
|
||||
lastModified: new Date(),
|
||||
changeFrequency: 'weekly',
|
||||
priority: 0.8,
|
||||
},
|
||||
|
||||
{
|
||||
url: `${baseUrl}/privacy`,
|
||||
lastModified: new Date(),
|
||||
changeFrequency: 'yearly',
|
||||
priority: 0.4,
|
||||
},
|
||||
{
|
||||
url: `${baseUrl}/contact`,
|
||||
lastModified: new Date(),
|
||||
changeFrequency: 'yearly',
|
||||
priority: 0.5,
|
||||
},
|
||||
{
|
||||
url: `${baseUrl}/about`,
|
||||
lastModified: new Date(),
|
||||
changeFrequency: 'yearly',
|
||||
priority: 0.6,
|
||||
},
|
||||
{
|
||||
url: `${baseUrl}/press`,
|
||||
lastModified: new Date(),
|
||||
changeFrequency: 'monthly',
|
||||
priority: 0.7,
|
||||
},
|
||||
{
|
||||
url: `${baseUrl}/testimonials`,
|
||||
lastModified: new Date(),
|
||||
changeFrequency: 'monthly',
|
||||
priority: 0.7,
|
||||
},
|
||||
|
||||
|
||||
priority: 0.9,
|
||||
},
|
||||
{
|
||||
url: `${baseUrl}/dynamic-qr-code-generator`,
|
||||
lastModified: new Date(),
|
||||
changeFrequency: 'monthly',
|
||||
priority: 0.9,
|
||||
},
|
||||
{
|
||||
url: `${baseUrl}/bulk-qr-code-generator`,
|
||||
lastModified: new Date(),
|
||||
changeFrequency: 'monthly',
|
||||
priority: 0.9,
|
||||
},
|
||||
{
|
||||
url: `${baseUrl}/custom-qr-code-generator`,
|
||||
lastModified: new Date(),
|
||||
changeFrequency: 'weekly',
|
||||
priority: 0.9,
|
||||
},
|
||||
|
||||
{
|
||||
url: `${baseUrl}/pricing`,
|
||||
lastModified: new Date(),
|
||||
changeFrequency: 'monthly',
|
||||
priority: 0.8,
|
||||
},
|
||||
{
|
||||
url: `${baseUrl}/tools`,
|
||||
lastModified: new Date(),
|
||||
changeFrequency: 'monthly',
|
||||
priority: 0.9,
|
||||
},
|
||||
{
|
||||
url: `${baseUrl}/features`,
|
||||
lastModified: new Date(),
|
||||
changeFrequency: 'monthly',
|
||||
priority: 0.8,
|
||||
},
|
||||
{
|
||||
url: `${baseUrl}/faq`,
|
||||
lastModified: new Date(),
|
||||
changeFrequency: 'monthly',
|
||||
priority: 0.7,
|
||||
},
|
||||
{
|
||||
url: `${baseUrl}/blog`,
|
||||
lastModified: new Date(),
|
||||
changeFrequency: 'weekly',
|
||||
priority: 0.8,
|
||||
},
|
||||
|
||||
{
|
||||
url: `${baseUrl}/privacy`,
|
||||
lastModified: new Date(),
|
||||
changeFrequency: 'yearly',
|
||||
priority: 0.4,
|
||||
},
|
||||
{
|
||||
url: `${baseUrl}/contact`,
|
||||
lastModified: new Date(),
|
||||
changeFrequency: 'yearly',
|
||||
priority: 0.5,
|
||||
},
|
||||
{
|
||||
url: `${baseUrl}/about`,
|
||||
lastModified: new Date(),
|
||||
changeFrequency: 'yearly',
|
||||
priority: 0.6,
|
||||
},
|
||||
{
|
||||
url: `${baseUrl}/press`,
|
||||
lastModified: new Date(),
|
||||
changeFrequency: 'monthly',
|
||||
priority: 0.7,
|
||||
},
|
||||
{
|
||||
url: `${baseUrl}/testimonials`,
|
||||
lastModified: new Date(),
|
||||
changeFrequency: 'monthly',
|
||||
priority: 0.7,
|
||||
},
|
||||
|
||||
|
||||
...toolPages,
|
||||
...blogPages,
|
||||
...learnPages,
|
||||
...growthUseCasePages,
|
||||
...industryUrls,
|
||||
...authorPages,
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user