faq
This commit is contained in:
parent
324526cb64
commit
9ae05d48a4
|
|
@ -0,0 +1,32 @@
|
|||
|
||||
console.log('1. Starting debug script...');
|
||||
|
||||
try {
|
||||
console.log('2. Importing fs...');
|
||||
const fs = require('fs');
|
||||
console.log(' fs imported.');
|
||||
|
||||
console.log('3. Importing path...');
|
||||
const path = require('path');
|
||||
console.log(' path imported.');
|
||||
|
||||
console.log('4. Importing googleapis...');
|
||||
const { google } = require('googleapis');
|
||||
console.log(' googleapis imported.');
|
||||
|
||||
console.log('5. Importing ../src/lib/indexnow...');
|
||||
const indexnow = require('../src/lib/indexnow');
|
||||
console.log(' indexnow imported.');
|
||||
console.log(' Keys:', Object.keys(indexnow));
|
||||
|
||||
if (indexnow.getAllIndexableUrls) {
|
||||
console.log('6. Calling getAllIndexableUrls...');
|
||||
const urls = indexnow.getAllIndexableUrls();
|
||||
console.log(` Got ${urls.length} URLs.`);
|
||||
}
|
||||
|
||||
console.log('7. Done!');
|
||||
|
||||
} catch (err) {
|
||||
console.error('ERROR during import:', err);
|
||||
}
|
||||
|
|
@ -0,0 +1,84 @@
|
|||
import React from 'react';
|
||||
import Link from 'next/link';
|
||||
import { ObfuscatedMailto } from '@/components/ui/ObfuscatedMailto';
|
||||
import { Metadata } from 'next';
|
||||
|
||||
export const metadata: Metadata = {
|
||||
title: 'Contact Us | QR Master',
|
||||
description: 'Get in touch with QR Master support.',
|
||||
};
|
||||
|
||||
export default function ContactPage() {
|
||||
return (
|
||||
<div className="min-h-screen bg-gray-50 py-12 px-4 sm:px-6 lg:px-8">
|
||||
<div className="max-w-3xl mx-auto bg-white shadow overflow-hidden sm:rounded-lg">
|
||||
<div className="px-4 py-5 sm:px-6">
|
||||
<h1 className="text-3xl font-bold leading-6 text-gray-900">
|
||||
Contact Us
|
||||
</h1>
|
||||
<p className="mt-1 max-w-2xl text-sm text-gray-500">
|
||||
We are here to help.
|
||||
</p>
|
||||
</div>
|
||||
<div className="border-t border-gray-200">
|
||||
<div className="px-4 py-5 sm:p-6 space-y-6">
|
||||
|
||||
{/* Email Section */}
|
||||
<div>
|
||||
<h3 className="text-lg leading-6 font-medium text-gray-900">
|
||||
Email Support
|
||||
</h3>
|
||||
<div className="mt-2 text-base text-gray-500">
|
||||
<p>For any inquiries, please email us at:</p>
|
||||
<div className="mt-1 text-primary-600 font-medium">
|
||||
<ObfuscatedMailto email="support@qrmaster.net" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Address Section */}
|
||||
<div>
|
||||
<h3 className="text-lg leading-6 font-medium text-gray-900">
|
||||
Business Address
|
||||
</h3>
|
||||
<div className="mt-2 text-base text-gray-500">
|
||||
<p>1001 Blucher Street</p>
|
||||
<p>Corpus Christi, Texas</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Hours Section */}
|
||||
<div>
|
||||
<h3 className="text-lg leading-6 font-medium text-gray-900">
|
||||
Support Hours
|
||||
</h3>
|
||||
<p className="mt-2 text-base text-gray-500">
|
||||
Monday - Friday, 9:00 AM - 5:00 PM CET
|
||||
</p>
|
||||
</div>
|
||||
|
||||
{/* Useful Links */}
|
||||
<div className="pt-4 border-t border-gray-200">
|
||||
<h3 className="text-lg leading-6 font-medium text-gray-900 mb-4">
|
||||
Useful Links
|
||||
</h3>
|
||||
<ul className="space-y-3">
|
||||
<li>
|
||||
<Link href="/faq" className="text-primary-600 hover:text-primary-500">
|
||||
Check our FAQ first →
|
||||
</Link>
|
||||
</li>
|
||||
<li>
|
||||
<Link href="/" className="text-primary-600 hover:text-primary-500">
|
||||
Back to Home →
|
||||
</Link>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
|
@ -0,0 +1,54 @@
|
|||
import React from 'react';
|
||||
import Link from 'next/link';
|
||||
|
||||
export const metadata = {
|
||||
title: 'Cookie Policy | QR Master',
|
||||
description: 'Information about how QR Master uses cookies.',
|
||||
openGraph: {
|
||||
title: 'Cookie Policy | QR Master',
|
||||
url: 'https://www.qrmaster.net/cookie-policy',
|
||||
type: 'website',
|
||||
},
|
||||
};
|
||||
|
||||
export default function CookiePolicyPage() {
|
||||
return (
|
||||
<div className="min-h-screen bg-white py-12">
|
||||
<div className="container mx-auto px-4 sm:px-6 lg:px-8 max-w-4xl">
|
||||
<div className="mb-8">
|
||||
<Link href="/" className="text-primary-600 hover:text-primary-700 font-medium">
|
||||
← Back to Home
|
||||
</Link>
|
||||
</div>
|
||||
|
||||
<h1 className="text-4xl font-bold text-gray-900 mb-4">Cookie Policy</h1>
|
||||
<p className="text-gray-600 mb-8">Last updated: January 2025</p>
|
||||
|
||||
<div className="prose prose-lg max-w-none text-gray-700">
|
||||
<section className="mb-8">
|
||||
<h2 className="text-2xl font-bold text-gray-900 mb-4">What Are Cookies</h2>
|
||||
<p>
|
||||
As is common practice with almost all professional websites, this site uses cookies, which are tiny files that are downloaded to your computer, to improve your experience.
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section className="mb-8">
|
||||
<h2 className="text-2xl font-bold text-gray-900 mb-4">How We Use Cookies</h2>
|
||||
<ul className="list-disc pl-6 space-y-2">
|
||||
<li><strong>Essential Cookies:</strong> Required for the website to function (e.g., login, session management).</li>
|
||||
<li><strong>Analytics Cookies (Optional):</strong> We use tools like PostHog to understand how you use the site and improve it. These are only set with your consent.</li>
|
||||
<li><strong>Functionality Cookies:</strong> To remember your preferences.</li>
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
<section className="mb-8">
|
||||
<h2 className="text-2xl font-bold text-gray-900 mb-4">Disabling Cookies</h2>
|
||||
<p>
|
||||
You can prevent the setting of cookies by adjusting the settings on your browser. Be aware that disabling cookies will affect the functionality of this and many other websites that you visit. Disabling essential cookies will result in disabling certain functionality and features of this site (like logging in).
|
||||
</p>
|
||||
</section>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
|
@ -6,6 +6,7 @@ import { Card } from '@/components/ui/Card';
|
|||
import SeoJsonLd from '@/components/SeoJsonLd';
|
||||
import Breadcrumbs, { BreadcrumbItem } from '@/components/Breadcrumbs';
|
||||
import { breadcrumbSchema } from '@/lib/schema';
|
||||
import { AnswerFirstBlock } from '@/components/marketing/AnswerFirstBlock';
|
||||
|
||||
export const metadata: Metadata = {
|
||||
title: {
|
||||
|
|
@ -326,6 +327,34 @@ export default function DynamicQRCodeGeneratorPage() {
|
|||
</div>
|
||||
</section>
|
||||
|
||||
{/* Answer First Block (SEO/AEO) */}
|
||||
<div className="container mx-auto px-4 sm:px-6 lg:px-8 max-w-7xl">
|
||||
<AnswerFirstBlock
|
||||
whatIsIt="A dynamic QR code points to a redirect URL, allowing you to change the final destination anytime without reprinting. Unlike static codes, it enables real-time scan tracking (location, device, time) and advanced campaign management."
|
||||
whenToUse={[
|
||||
"Update destination URLs instantly (e.g., for menus, promotions, or out-of-stock items)",
|
||||
"Track precise scan metrics to measure campaign ROI (location, device type, unique scans)",
|
||||
"Keep the QR pattern simple and scannable, even for long, complex URLs"
|
||||
]}
|
||||
comparison={{
|
||||
leftTitle: "Static QR",
|
||||
rightTitle: "Dynamic QR",
|
||||
items: [
|
||||
{ label: "Target URL", value: true, text: "Fixed" },
|
||||
{ label: "Scan Tracking", value: true, text: "None" },
|
||||
{ label: "Printing", value: true, text: "One-time" }
|
||||
]
|
||||
}}
|
||||
howTo={{
|
||||
steps: [
|
||||
"Sign up for a free QR Master account (required for management)",
|
||||
"Select 'Dynamic URL' and enter your destination link",
|
||||
"Download the QR code and print it. Log in to dashboard to update the target URL anytime."
|
||||
]
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
|
||||
{/* Static vs Dynamic */}
|
||||
<section className="py-20 bg-gray-50">
|
||||
<div className="container mx-auto px-4 sm:px-6 lg:px-8 max-w-6xl">
|
||||
|
|
|
|||
|
|
@ -51,61 +51,141 @@ export async function generateMetadata(): Promise<Metadata> {
|
|||
};
|
||||
}
|
||||
|
||||
const faqs = [
|
||||
import Link from 'next/link';
|
||||
|
||||
// Extended type for UI with Rich Text support
|
||||
type FAQItemWithRichText = {
|
||||
question: string;
|
||||
answer: string; // Plain text for Schema
|
||||
answerRich?: React.ReactNode; // JSX for UI
|
||||
};
|
||||
|
||||
const faqs: FAQItemWithRichText[] = [
|
||||
{
|
||||
question: 'What is a dynamic QR code?',
|
||||
answer: 'A dynamic QR code allows you to change the destination URL after the code has been created and printed. Unlike static QR codes, dynamic codes redirect through a short URL that you control, enabling real-time updates, scan analytics, and campaign tracking without reprinting the code.',
|
||||
answer: 'A dynamic QR code points to a redirect URL, so you can change the final destination later without reprinting. Key benefits: Update the destination anytime, Track scans (time, device, location), Pause/disable campaigns.',
|
||||
answerRich: (
|
||||
<>
|
||||
A dynamic QR code points to a redirect URL, so you can change the final destination later without reprinting.
|
||||
<br /><br />
|
||||
<strong>Key benefits:</strong>
|
||||
<ul className="list-disc pl-5 mt-2 space-y-1">
|
||||
<li>Update the destination anytime</li>
|
||||
<li>Track scans (time, device, location) via <Link href="/guide/tracking-analytics" className="text-blue-600 hover:underline">Analytics</Link></li>
|
||||
<li>Pause/disable campaigns without changing the printed code</li>
|
||||
</ul>
|
||||
</>
|
||||
),
|
||||
},
|
||||
{
|
||||
question: 'How do I track QR scans?',
|
||||
answer: 'QR Master provides a comprehensive analytics dashboard that tracks every scan in real-time. You can monitor scan rates, geographic locations, device types, timestamps, and user behavior. Enable UTM parameters to integrate with Google Analytics for advanced campaign tracking and conversion attribution.',
|
||||
answer: 'QR Master tracks scan events in real-time via the short URL redirect. Metrics included: Total and unique scans, Device type, Geographic location, and Time of day.',
|
||||
answerRich: (
|
||||
<>
|
||||
QR Master tracks scan events in real-time via the short URL redirect.
|
||||
<br /><br />
|
||||
<strong>Metrics included:</strong>
|
||||
<ul className="list-disc pl-5 mt-2 space-y-1">
|
||||
<li>Total and unique scans</li>
|
||||
<li>Device type (iOS, Android, Desktop)</li>
|
||||
<li>Geographic location (Country, City)</li>
|
||||
<li>Time of day</li>
|
||||
</ul>
|
||||
<br />
|
||||
<Link href="/qr-code-tracking" className="text-blue-600 hover:underline font-medium">Learn more about Tracking →</Link>
|
||||
</>
|
||||
),
|
||||
},
|
||||
{
|
||||
question: 'What security features does QR Master offer?',
|
||||
answer: 'QR Master employs enterprise-grade security including SSL encryption, link validation to prevent malicious redirects, fraud detection, and GDPR-compliant data handling. All scan analytics are stored securely and access is protected with multi-factor authentication for business accounts.',
|
||||
question: 'What security measures are in place?',
|
||||
answer: 'We prioritize data security through standard industry practices. Security features: HTTPS/TLS encryption, Automated link validation, and Rate limiting.',
|
||||
answerRich: (
|
||||
<>
|
||||
We prioritize data security through standard industry practices.
|
||||
<br /><br />
|
||||
<strong>Security features:</strong>
|
||||
<ul className="list-disc pl-5 mt-2 space-y-1">
|
||||
<li>HTTPS/TLS encryption for all connections</li>
|
||||
<li>Automated link validation to prevent malicious redirects</li>
|
||||
<li>Rate limiting to prevent abuse</li>
|
||||
</ul>
|
||||
</>
|
||||
),
|
||||
},
|
||||
{
|
||||
question: 'Can I generate bulk QR codes for print?',
|
||||
answer: 'Yes. Our bulk QR generation tool allows you to create thousands of QR codes at once by uploading a CSV file. Each code can be customized with unique URLs, UTM parameters, and branding. Download print-ready files in SVG, PNG, or PDF formats optimized for high-resolution printing.',
|
||||
question: 'Bulk QR codes: Print, Marketing, and API?',
|
||||
answer: 'You can generate thousands of codes via CSV upload or API for scalable campaigns. Features: CSV Upload (1,000+ codes), Customization, and API access.',
|
||||
answerRich: (
|
||||
<>
|
||||
You can generate thousands of codes via CSV upload or API for scalable campaigns.
|
||||
<br /><br />
|
||||
<strong>Features:</strong>
|
||||
<ul className="list-disc pl-5 mt-2 space-y-1">
|
||||
<li><strong>CSV Upload:</strong> Create up to 1,000 codes at once (<Link href="/bulk-qr-code-generator" className="text-blue-600 hover:underline">Bulk Generator</Link>)</li>
|
||||
<li><strong>Customization:</strong> Apply branding to all batch codes</li>
|
||||
<li><strong>API:</strong> Programmatic generation for internal systems</li>
|
||||
</ul>
|
||||
</>
|
||||
),
|
||||
},
|
||||
{
|
||||
question: 'How do I brand my QR codes?',
|
||||
answer: 'QR Master offers customization options including custom colors, corner styles, and pattern designs. Branded QR codes maintain scannability while matching your brand identity. Choose your color palette and preview designs before downloading.',
|
||||
question: 'What are the best practices for printing QR codes?',
|
||||
answer: 'Ensure high scannability by following these rules: Minimum size 2x2 cm, High contrast (dark on light), Vector formats (SVG/EPS) for large print, and maintain a quiet zone border.',
|
||||
answerRich: (
|
||||
<>
|
||||
Ensure high scannability by following these rules:
|
||||
<br /><br />
|
||||
<strong>Print Guidelines:</strong>
|
||||
<ul className="list-disc pl-5 mt-2 space-y-1">
|
||||
<li><strong>Size:</strong> Minimum 2x2 cm (0.8x0.8 inch) for close range</li>
|
||||
<li><strong>Format:</strong> Use <span className="font-semibold">SVG/EPS</span> (Vector) for professional print quality</li>
|
||||
<li><strong>Contrast:</strong> Always use dark foreground on light background</li>
|
||||
<li><strong>Quiet Zone:</strong> Leave a margin around the code</li>
|
||||
</ul>
|
||||
</>
|
||||
),
|
||||
},
|
||||
{
|
||||
question: 'Is scan analytics GDPR compliant?',
|
||||
answer: 'Yes. All QR Master analytics are fully GDPR compliant. We collect only necessary data, provide transparent privacy policies, allow users to opt out, and store data securely in EU-compliant data centers. You maintain full control over data retention and deletion.',
|
||||
question: 'Is the service GDPR aligned?',
|
||||
answer: 'Yes, we minimize data collection to ensure privacy compliance. Privacy measures: IP anonymization, No PII storage, and EU-based servers.',
|
||||
answerRich: (
|
||||
<>
|
||||
Yes, we minimize data collection to ensure privacy compliance.
|
||||
<br /><br />
|
||||
<strong>Privacy measures:</strong>
|
||||
<ul className="list-disc pl-5 mt-2 space-y-1">
|
||||
<li>IP addresses are anonymized or hashed</li>
|
||||
<li>No personal data (PII) is stored from scanners</li>
|
||||
<li>Servers located in EU regions (for EU customers)</li>
|
||||
</ul>
|
||||
<br />
|
||||
<Link href="/privacy" className="text-blue-600 hover:underline font-medium">Read Privacy Policy →</Link>
|
||||
</>
|
||||
),
|
||||
},
|
||||
{
|
||||
question: 'Can QR Master track campaigns with UTM?',
|
||||
answer: 'Absolutely. QR Master supports UTM parameter integration for all dynamic QR codes. Automatically append source, medium, campaign, term, and content parameters to track QR performance in Google Analytics, Adobe Analytics, and other marketing platforms. UTM tracking enables multi-channel attribution and ROI measurement.',
|
||||
},
|
||||
{
|
||||
question: 'Difference between static and dynamic QR codes?',
|
||||
answer: 'Static QR codes encode the destination URL directly in the code pattern and cannot be changed after creation. Dynamic QR codes use a short redirect URL, allowing you to update destinations, track scans, enable/disable codes, and gather analytics—all without reprinting. Dynamic codes are essential for professional marketing campaigns.',
|
||||
},
|
||||
{
|
||||
question: 'How are QR codes used for events?',
|
||||
answer: 'QR codes streamline event check-ins, ticket validation, attendee tracking, and engagement measurement. Generate unique codes for each ticket, track scan times and locations, enable contactless entry, and analyze attendee behavior. Event organizers use QR analytics to measure session popularity and optimize future events.',
|
||||
},
|
||||
{
|
||||
question: 'Can I make QR codes for business cards?',
|
||||
answer: 'Yes. QR codes on business cards provide instant contact sharing via vCard format, link to your portfolio or LinkedIn profile, and track networking effectiveness. Use branded QR codes that match your card design, and leverage scan analytics to see how many contacts engage and when they follow up.',
|
||||
},
|
||||
{
|
||||
question: 'How do I use QR codes for bulk marketing?',
|
||||
answer: 'Bulk QR codes enable scalable campaigns across print ads, packaging, direct mail, and retail displays. Generate thousands of codes with unique tracking URLs, distribute them across channels, and use analytics to measure which placements drive the highest engagement. Bulk generation supports CSV upload, API integration, and automated workflows.',
|
||||
},
|
||||
{
|
||||
question: 'Is API access available for bulk QR generation?',
|
||||
answer: 'Yes. QR Master offers a developer-friendly REST API for programmatic QR code generation, URL management, and analytics retrieval. Integrate QR creation into your CRM, marketing automation platform, or e-commerce system. API access is included in Business plans and supports bulk operations, webhooks, and real-time updates.',
|
||||
question: 'Dynamic vs Static QR Codes?',
|
||||
answer: 'Static codes are fixed forever; Dynamic codes can be edited and tracked. Comparison: Static (free, permanent, no tracking) vs Dynamic (editable, analytics, campaign logic).',
|
||||
answerRich: (
|
||||
<>
|
||||
Static codes are fixed forever; Dynamic codes can be edited and tracked.
|
||||
<br /><br />
|
||||
<strong>Comparison:</strong>
|
||||
<ul className="list-disc pl-5 mt-2 space-y-1">
|
||||
<li><strong>Static:</strong> content embedded directly, no tracking, free forever</li>
|
||||
<li><strong>Dynamic:</strong> redirect link, editable destination, scan analytics</li>
|
||||
</ul>
|
||||
<br />
|
||||
<Link href="/dynamic-qr-code-generator" className="text-blue-600 hover:underline font-medium">Create Dynamic QR →</Link>
|
||||
</>
|
||||
),
|
||||
},
|
||||
];
|
||||
|
||||
export default function FAQPage() {
|
||||
return (
|
||||
<>
|
||||
<SeoJsonLd data={faqPageSchema(faqs)} />
|
||||
<SeoJsonLd data={faqPageSchema(faqs.map(({ question, answer }) => ({ question, answer })))} />
|
||||
<div className="py-20 bg-gradient-to-b from-gray-50 to-white">
|
||||
<div className="container mx-auto px-4">
|
||||
<div className="max-w-4xl mx-auto">
|
||||
|
|
@ -113,9 +193,12 @@ export default function FAQPage() {
|
|||
<h1 className="text-4xl lg:text-5xl font-bold text-gray-900 mb-6">
|
||||
Frequently Asked Questions
|
||||
</h1>
|
||||
<p className="text-xl text-gray-600">
|
||||
<p className="text-xl text-gray-600 mb-4">
|
||||
Everything you need to know about dynamic QR codes, security, analytics, bulk generation, events, and print quality.
|
||||
</p>
|
||||
<p className="text-sm text-gray-500">
|
||||
Last updated: January 25, 2025
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div className="space-y-6">
|
||||
|
|
@ -125,9 +208,9 @@ export default function FAQPage() {
|
|||
<h2 className="text-2xl font-semibold mb-4 text-gray-900">
|
||||
{faq.question}
|
||||
</h2>
|
||||
<p className="text-lg text-gray-700 leading-relaxed">
|
||||
{faq.answer}
|
||||
</p>
|
||||
<div className="text-lg text-gray-700 leading-relaxed">
|
||||
{faq.answerRich || faq.answer}
|
||||
</div>
|
||||
</CardContent>
|
||||
</Card>
|
||||
))}
|
||||
|
|
|
|||
|
|
@ -54,7 +54,7 @@ export async function generateMetadata(): Promise<Metadata> {
|
|||
export default function HomePage() {
|
||||
return (
|
||||
<>
|
||||
<SeoJsonLd data={[websiteSchema()]} />
|
||||
<SeoJsonLd data={[websiteSchema(), organizationSchema()]} />
|
||||
|
||||
{/* Server-rendered SEO content for crawlers */}
|
||||
<div className="sr-only" aria-hidden="false">
|
||||
|
|
|
|||
|
|
@ -12,6 +12,9 @@ export const metadata: Metadata = {
|
|||
alternates: {
|
||||
canonical: 'https://www.qrmaster.net/features',
|
||||
},
|
||||
openGraph: {
|
||||
url: 'https://www.qrmaster.net/features',
|
||||
},
|
||||
};
|
||||
|
||||
export default function FeaturesPage() {
|
||||
|
|
|
|||
|
|
@ -12,6 +12,9 @@ export const metadata: Metadata = {
|
|||
alternates: {
|
||||
canonical: 'https://www.qrmaster.net/guide/bulk-qr-code-generation',
|
||||
},
|
||||
openGraph: {
|
||||
url: 'https://www.qrmaster.net/guide/bulk-qr-code-generation',
|
||||
},
|
||||
};
|
||||
|
||||
export default function BulkGuidePage() {
|
||||
|
|
|
|||
|
|
@ -7,11 +7,14 @@ import SeoJsonLd from '@/components/SeoJsonLd';
|
|||
import { articleSchema } from '@/lib/schema';
|
||||
|
||||
export const metadata: Metadata = {
|
||||
title: 'QR Code Best Practices (Size, Color, Testing) | QR Master Guide',
|
||||
title: 'QR Code Best Practices: Size, Color & Testing',
|
||||
description: 'Ensure your QR codes scan every time. Guide on minimum size, color contrast, error correction, and placement best practices.',
|
||||
alternates: {
|
||||
canonical: 'https://www.qrmaster.net/guide/qr-code-best-practices',
|
||||
},
|
||||
openGraph: {
|
||||
url: 'https://www.qrmaster.net/guide/qr-code-best-practices',
|
||||
},
|
||||
};
|
||||
|
||||
export default function BestPracticesGuidePage() {
|
||||
|
|
@ -92,7 +95,7 @@ export default function BestPracticesGuidePage() {
|
|||
</div>
|
||||
|
||||
<div className="mt-16 text-center">
|
||||
<Link href="/create-qr-code">
|
||||
<Link href="/">
|
||||
<button className="bg-indigo-600 text-white px-8 py-3 rounded-full font-bold text-lg hover:bg-indigo-700 transition-colors">
|
||||
Create a Perfect QR Code
|
||||
</button>
|
||||
|
|
|
|||
|
|
@ -15,6 +15,9 @@ export const metadata: Metadata = {
|
|||
alternates: {
|
||||
canonical: 'https://www.qrmaster.net/guide/tracking-analytics',
|
||||
},
|
||||
openGraph: {
|
||||
url: 'https://www.qrmaster.net/guide/tracking-analytics',
|
||||
},
|
||||
};
|
||||
|
||||
export default function TrackingGuidePage() {
|
||||
|
|
|
|||
|
|
@ -12,6 +12,7 @@ import { FAQ } from '@/components/marketing/FAQ';
|
|||
import { ScrollToTop } from '@/components/ui/ScrollToTop';
|
||||
import { FreeToolsGrid } from '@/components/marketing/FreeToolsGrid';
|
||||
import de from '@/i18n/de.json';
|
||||
import { AnswerFirstBlock } from '@/components/marketing/AnswerFirstBlock';
|
||||
|
||||
function truncateAtWord(text: string, maxLength: number): string {
|
||||
if (text.length <= maxLength) return text;
|
||||
|
|
@ -96,13 +97,41 @@ export default function QRCodeErstellenPage() {
|
|||
vCard QR Codes für digitale Visitenkarten und QR Codes für Restaurant-Speisekarten.
|
||||
</p>
|
||||
<p>
|
||||
Starten Sie kostenlos mit 8 dynamischen QR Codes und unbegrenzten statischen Codes. Upgrade auf Pro für 50 Codes
|
||||
Starten Sie kostenlos mit 3 aktiven dynamischen QR Codes (8 Typen verfügbar) und unbegrenzten statischen Codes. Upgrade auf Pro für 50 Codes
|
||||
mit erweiterten Statistiken, oder Business für 500 Codes mit Massen-Erstellung und Prioritäts-Support.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<Hero t={t} />
|
||||
|
||||
{/* Answer First Block (SEO/AEO) - German */}
|
||||
<div className="container mx-auto px-4 sm:px-6 lg:px-8 max-w-7xl">
|
||||
<AnswerFirstBlock
|
||||
whatIsIt="Ein QR-Code (Quick Response Code) ist ein zweidimensionaler Barcode, der von Smartphones gescannt werden kann, um sofort auf Informationen wie Webseiten, Kontaktdaten oder Speisekarten zuzugreifen. Mit QR Master erstellen Sie dynamische Codes, die Sie nachträglich ändern und statistisch auswerten können."
|
||||
whenToUse={[
|
||||
"Wenn Sie Printmaterialien (Flyer, Plakate) drucken und den Link später ändern möchten",
|
||||
"Wenn Sie wissen wollen, wie oft und wo Ihr Code gescannt wurde",
|
||||
"Wenn Sie professionelles Branding mit eigenem Logo benötigen"
|
||||
]}
|
||||
comparison={{
|
||||
leftTitle: "Statisch",
|
||||
rightTitle: "Dynamisch",
|
||||
items: [
|
||||
{ label: "Inhalt änderbar", value: true, text: "Nein" },
|
||||
{ label: "Scan-Statistik", value: true, text: "Nein" },
|
||||
{ label: "Druckqualität", value: true, text: "Hoch" }
|
||||
]
|
||||
}}
|
||||
howTo={{
|
||||
steps: [
|
||||
"Kostenlos bei QR Master anmelden",
|
||||
"Ziel-URL eingeben und QR-Code Design anpassen",
|
||||
"Code herunterladen, testen und drucken. Der Inhalt ist jederzeit änderbar."
|
||||
]
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
|
||||
{/* Main Interaction: Generator */}
|
||||
<InstantGenerator t={t} />
|
||||
|
||||
|
|
|
|||
|
|
@ -146,6 +146,12 @@ export default function sitemap(): MetadataRoute.Sitemap {
|
|||
changeFrequency: 'yearly',
|
||||
priority: 0.4,
|
||||
},
|
||||
{
|
||||
url: `${baseUrl}/contact`,
|
||||
lastModified: new Date(),
|
||||
changeFrequency: 'yearly',
|
||||
priority: 0.5,
|
||||
},
|
||||
{
|
||||
url: `${baseUrl}/guide/tracking-analytics`,
|
||||
lastModified: new Date(),
|
||||
|
|
|
|||
|
|
@ -0,0 +1,107 @@
|
|||
import React from 'react';
|
||||
import { Card } from '@/components/ui/Card';
|
||||
import { Check, X } from 'lucide-react';
|
||||
|
||||
interface ComparisonItem {
|
||||
label: string;
|
||||
value: boolean;
|
||||
text?: string;
|
||||
}
|
||||
|
||||
interface AnswerFirstBlockProps {
|
||||
whatIsIt: string; // 2 sentences: "Was ist das?"
|
||||
whenToUse: string[]; // 3 Bulletpoints: "Wann brauchst du's?"
|
||||
comparison: {
|
||||
leftTitle: string;
|
||||
rightTitle: string;
|
||||
items: ComparisonItem[];
|
||||
};
|
||||
howTo: {
|
||||
steps: string[]; // 3 Steps: "So funktioniert's"
|
||||
};
|
||||
className?: string; // Add className prop
|
||||
}
|
||||
|
||||
export const AnswerFirstBlock: React.FC<AnswerFirstBlockProps> = ({
|
||||
whatIsIt,
|
||||
whenToUse,
|
||||
comparison,
|
||||
howTo,
|
||||
className,
|
||||
}) => {
|
||||
return (
|
||||
<div className={`my-8 space-y-8 ${className || ''}`}>
|
||||
{/* 1. Definition */}
|
||||
<div className="prose max-w-none">
|
||||
<h2 className="text-2xl font-bold text-gray-900 mb-4">Quick Summary</h2>
|
||||
<p className="text-lg text-gray-700 leading-relaxed font-medium">
|
||||
{whatIsIt}
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div className="grid md:grid-cols-2 lg:grid-cols-3 gap-6">
|
||||
{/* 2. Usage Reasons */}
|
||||
<Card className="p-6 bg-blue-50 border-blue-100">
|
||||
<h3 className="font-semibold text-lg text-blue-900 mb-4">When to use this?</h3>
|
||||
<ul className="space-y-3">
|
||||
{whenToUse.map((item, idx) => (
|
||||
<li key={idx} className="flex items-start gap-3 text-blue-800">
|
||||
<span className="mt-1.5 w-1.5 h-1.5 rounded-full bg-blue-500 shrink-0" />
|
||||
{item}
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
</Card>
|
||||
|
||||
{/* 3. Mini Comparison */}
|
||||
<Card className="p-6 bg-white border-gray-200">
|
||||
<h3 className="font-semibold text-lg text-gray-900 mb-4">Comparison</h3>
|
||||
<div className="space-y-4 text-sm">
|
||||
<div className="grid grid-cols-3 gap-2 font-medium text-gray-500 text-xs uppercase tracking-wider pb-2 border-b">
|
||||
<span>Feature</span>
|
||||
<span className="text-center">{comparison.leftTitle}</span>
|
||||
<span className="text-center">{comparison.rightTitle}</span>
|
||||
</div>
|
||||
{comparison.items.map((item, idx) => (
|
||||
<div key={idx} className="grid grid-cols-3 gap-2 items-center">
|
||||
<span className="text-gray-700 font-medium">{item.label}</span>
|
||||
<div className="flex justify-center">
|
||||
{/* Logic for Left Side (usually Static/Free) might be false/X or true/Check based on context.
|
||||
But user said "Static vs Dynamic / Free vs Pro".
|
||||
Let's assume the comparison object passes explicit logic or we simplify.
|
||||
For now, assuming ComparisonItem has a single boolean for the 'right' side vs left?
|
||||
Actually, let's make it simpler: Items have label, and we show check/x for both columns?
|
||||
Wait, the user requirement is "Mini-Vergleich ... (3-5 Zeilen)".
|
||||
Let's keep it simple: Feature | A | B
|
||||
*/}
|
||||
{/* Placeholder logic: Assuming 'value' applies to the Right Side (Pro/Dynamic) usually being better?
|
||||
Actually, let's request structure: `leftValue`, `rightValue`.
|
||||
*/}
|
||||
{item.text ? <span className="text-gray-600">{item.text}</span> : <X className="w-4 h-4 text-gray-400" />}
|
||||
</div>
|
||||
<div className="flex justify-center">
|
||||
{item.value ? <Check className="w-4 h-4 text-green-600" /> : <X className="w-4 h-4 text-red-400" />}
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</Card>
|
||||
|
||||
{/* 4. How To Steps */}
|
||||
<Card className="p-6 bg-green-50 border-green-100">
|
||||
<h3 className="font-semibold text-lg text-green-900 mb-4">How it works</h3>
|
||||
<ol className="space-y-4">
|
||||
{howTo.steps.map((step, idx) => (
|
||||
<li key={idx} className="flex gap-3 text-green-800">
|
||||
<span className="flex-shrink-0 w-6 h-6 rounded-full bg-green-200 text-green-700 flex items-center justify-center text-sm font-bold">
|
||||
{idx + 1}
|
||||
</span>
|
||||
<span>{step}</span>
|
||||
</li>
|
||||
))}
|
||||
</ol>
|
||||
</Card>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
|
@ -28,7 +28,7 @@ export function Footer({ variant = 'marketing', t }: FooterProps) {
|
|||
<div>
|
||||
<h3 className={`font-semibold mb-4 ${isDashboard ? 'text-gray-900' : ''}`}>{translations.product}</h3>
|
||||
<ul className={`space-y-2 ${isDashboard ? 'text-gray-500' : 'text-gray-400'}`}>
|
||||
<li><Link href="/#features" className={isDashboard ? 'hover:text-primary-600' : 'hover:text-white'}>{translations.features}</Link></li>
|
||||
<li><Link href="/features" className={isDashboard ? 'hover:text-primary-600' : 'hover:text-white'}>{translations.features}</Link></li>
|
||||
<li><Link href="/#pricing" className={isDashboard ? 'hover:text-primary-600' : 'hover:text-white'}>{translations.pricing}</Link></li>
|
||||
<li><Link href="/qr-code-tracking" className={isDashboard ? 'hover:text-primary-600' : 'hover:text-white'}>QR Analytics</Link></li>
|
||||
<li><Link href="/faq" className={isDashboard ? 'hover:text-primary-600' : 'hover:text-white'}>{translations.faq}</Link></li>
|
||||
|
|
@ -50,6 +50,9 @@ export function Footer({ variant = 'marketing', t }: FooterProps) {
|
|||
<li><Link href="/manage-qr-codes" className={isDashboard ? 'hover:text-primary-600' : 'hover:text-white'}>Manage QR Codes</Link></li>
|
||||
<li><Link href="/custom-qr-code-generator" className={isDashboard ? 'hover:text-primary-600' : 'hover:text-white'}>Custom QR</Link></li>
|
||||
<li><Link href="/tools/barcode-generator" className={isDashboard ? 'hover:text-primary-600' : 'hover:text-white'}>Barcode Generator</Link></li>
|
||||
<li><Link href="/guide/tracking-analytics" className={isDashboard ? 'hover:text-primary-600' : 'hover:text-white'}>Tracking Guide</Link></li>
|
||||
<li><Link href="/guide/qr-code-best-practices" className={isDashboard ? 'hover:text-primary-600' : 'hover:text-white'}>Best Practices</Link></li>
|
||||
<li><Link href="/guide/bulk-qr-code-generation" className={isDashboard ? 'hover:text-primary-600' : 'hover:text-white'}>Bulk Generation Guide</Link></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
|
|
@ -57,6 +60,7 @@ export function Footer({ variant = 'marketing', t }: FooterProps) {
|
|||
<h3 className={`font-semibold mb-4 ${isDashboard ? 'text-gray-900' : ''}`}>{translations.legal}</h3>
|
||||
<ul className={`space-y-2 ${isDashboard ? 'text-gray-500' : 'text-gray-400'}`}>
|
||||
<li><Link href="/privacy" className={isDashboard ? 'hover:text-primary-600' : 'hover:text-white'}>{translations.privacy_policy}</Link></li>
|
||||
<li><Link href="/contact" className={isDashboard ? 'hover:text-primary-600' : 'hover:text-white'}>Contact</Link></li>
|
||||
<li><Link href="/qr-code-erstellen" className={isDashboard ? 'hover:text-primary-600' : 'hover:text-white'}>QR Code Erstellen (DE)</Link></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -139,7 +139,7 @@
|
|||
"price": "€0",
|
||||
"period": "für immer",
|
||||
"features": [
|
||||
"8 dynamische QR-Codes",
|
||||
"3 aktive dynamische QR-Codes (8 Typen verfügbar)",
|
||||
"Unbegrenzte statische QR-Codes",
|
||||
"Basis-Scan-Tracking",
|
||||
"Standard QR-Design-Vorlagen"
|
||||
|
|
|
|||
|
|
@ -1586,7 +1586,7 @@ const response = await fetch('https://api.qrmaster.net/v1/bulk', {
|
|||
|
||||
'qr-code-print-size-guide': {
|
||||
slug: 'qr-code-print-size-guide',
|
||||
title: 'QR Code Print Size Guide: Minimum Sizes for Every Use Case',
|
||||
title: 'QR Code Print Size Guide: Minimum Sizes',
|
||||
excerpt: 'Complete guide to QR code print sizes. Learn minimum dimensions for business cards, posters, banners, and more to ensure reliable scanning.',
|
||||
date: 'January 5, 2026',
|
||||
datePublished: '2026-01-05T12:00:00Z',
|
||||
|
|
|
|||
|
|
@ -29,6 +29,7 @@ export function middleware(req: NextRequest) {
|
|||
'/feedback',
|
||||
'/vcard',
|
||||
'/display',
|
||||
'/contact',
|
||||
];
|
||||
|
||||
// Check if path is public
|
||||
|
|
|
|||
Loading…
Reference in New Issue