feat: implement high-priority SEO fixes and German localization

This commit is contained in:
Timo Knuth 2026-01-12 13:35:10 +01:00
parent c6adc8567f
commit 038c8dddbc
33 changed files with 776 additions and 194 deletions

View File

@ -199,20 +199,22 @@ const blogPosts: Record<string, BlogPostData> = {
<p>QR code tracking is the process of monitoring and analyzing scan data from QR codes to measure campaign performance and user behavior. When someone scans a trackable QR code, the system captures valuable data including:</p>
<ul>
<li><strong>Scan count:</strong> Total scans and unique scans</li>
<li><strong>Location data:</strong> Country, city, and region of the scanner</li>
<li><strong>Device information:</strong> iOS vs Android, device model, operating system version</li>
<li><strong>Time and date:</strong> When scans occur (hour, day, week, month)</li>
<li><strong>Referrer source:</strong> Where the scan originated (if tracked)</li>
<li><strong>User behavior:</strong> Actions taken after scanning (page views, conversions, purchases)</li>
<li>Scan count Total scans and unique scans</li>
<li>Location data Country, city, and region of the scanner</li>
<li>Device information iOS vs Android, device model, operating system version</li>
<li>Time and date When scans occur (hour, day, week, month)</li>
<li>Referrer source Where the scan originated (if tracked)</li>
<li>User behavior Actions taken after scanning (page views, conversions, purchases)</li>
</ul>
<h3>Static vs Dynamic QR Codes: Why Tracking Matters</h3>
<p>Understanding the difference between static and dynamic QR codes is crucial for tracking:</p>
<p><strong>Static QR Codes:</strong> These encode the destination URL directly into the QR code pattern. Once generated, the content cannot be changed, and no tracking is possible. The QR code reader goes directly to the encoded destination without any intermediate server.</p>
<h4>Static QR Codes</h4>
<p>These encode the destination URL directly into the QR code pattern. Once generated, the content cannot be changed, and no tracking is possible. The QR code reader goes directly to the encoded destination without any intermediate server.</p>
<p><strong>Dynamic QR Codes:</strong> These contain a short redirect URL (like qrmaster.net/abc123) that points to a server. The server logs the scan data and then redirects to your actual destination URL. This enables tracking AND allows you to change the destination URL anytimeeven after printing thousands of codes.</p>
<h4>Dynamic QR Codes</h4>
<p>These contain a short redirect URL (like qrmaster.net/abc123) that points to a server. The server logs the scan data and then redirects to your actual destination URL. This enables tracking AND allows you to change the destination URL anytimeeven after printing thousands of codes.</p>
<div class="overflow-x-auto my-8">
<table class="min-w-full border-collapse border border-gray-300">
@ -253,14 +255,14 @@ const blogPosts: Record<string, BlogPostData> = {
<h3>1. Measure Marketing ROI</h3>
<p>QR code tracking provides concrete data on campaign performance. Instead of guessing how many people engaged with your print ad, you get exact numbers. Calculate cost per scan: if your billboard costs $5,000/month and generates 10,000 scans, that's $0.50 per engagementcompare that to your digital ad costs.</p>
<p><strong>Real-world example:</strong> A retail brand placed QR codes on product packaging linking to warranty registration. By tracking scans, they discovered only 12% of customers registered warranties. They A/B tested different incentives (15% off next purchase vs extended warranty) and increased registration to 34%all measured through QR code tracking.</p>
<p>A retail brand placed QR codes on product packaging linking to warranty registration. By tracking scans, they discovered only 12% of customers registered warranties. They A/B tested different incentives (15% off next purchase vs extended warranty) and increased registration to 34%all measured through QR code tracking.</p>
<h3>2. Understand Your Audience</h3>
<p>QR code analytics reveal WHO is scanning your codes:</p>
<ul>
<li><strong>Geographic insights:</strong> Are most scans from your local area or nationwide? This helps optimize ad placement.</li>
<li><strong>Device data:</strong> 70% iOS users might indicate an affluent audience; optimize your landing page accordingly.</li>
<li><strong>Time patterns:</strong> Peak scanning at 7-9 PM? Schedule your social media posts and email campaigns for those hours.</li>
<li>Geographic insights Are most scans from your local area or nationwide? This helps optimize ad placement.</li>
<li>Device data 70% iOS users might indicate an affluent audience; optimize your landing page accordingly.</li>
<li>Time patterns Peak scanning at 7-9 PM? Schedule your social media posts and email campaigns for those hours.</li>
</ul>
<h3>3. Optimize Product Engagement</h3>
@ -276,35 +278,35 @@ const blogPosts: Record<string, BlogPostData> = {
<h4>Step-by-Step with QR Master:</h4>
<ol>
<li><strong>Sign up for free:</strong> Create your QR Master account at <a href="https://www.qrmaster.net/signup">qrmaster.net/signup</a></li>
<li><strong>Create dynamic QR code:</strong> Click "Create QR Code" and select "Dynamic QR"</li>
<li><strong>Enter destination URL:</strong> Add the website, landing page, or content you want to link</li>
<li><strong>Customize design:</strong> Add your logo, brand colors, and custom frame</li>
<li><strong>Download and deploy:</strong> Get high-resolution PNG or SVG for print</li>
<li><strong>Access analytics:</strong> Go to Dashboard Analytics to view real-time scan data</li>
<li>Sign up for free at <a href="https://www.qrmaster.net/signup">qrmaster.net/signup</a></li>
<li>Create a dynamic QR code by clicking "Create QR Code" and selecting "Dynamic QR"</li>
<li>Enter the destination URL for your website, landing page, or content</li>
<li>Customize the design with your logo, brand colors, and custom frame</li>
<li>Download the high-resolution PNG or SVG for print</li>
<li>Access analytics via Dashboard Analytics to view real-time scan data</li>
</ol>
<p><strong>Benefits:</strong> No coding required, instant setup, real-time dashboard, unlimited scans on paid plans, GDPR compliant.</p>
<p>This method requires no coding, offers instant setup, provides a real-time dashboard, includes unlimited scans on paid plans, and is GDPR compliant.</p>
<h3>Method 2: Google Analytics with UTM Parameters</h3>
<p>If you're already using Google Analytics, you can track QR codes using UTM parameters. This method works with both static and dynamic QR codes, but you won't get device-specific dataonly what Google Analytics provides.</p>
<h4>How to Set Up UTM Tracking:</h4>
<ol>
<li><strong>Build your UTM URL:</strong> Use Google's Campaign URL Builder</li>
<li><strong>Add parameters:</strong>
<li>Build your UTM URL using Google's Campaign URL Builder</li>
<li>Add parameters:
<ul>
<li>utm_source=qr</li>
<li>utm_medium=print (or offline, packaging, etc.)</li>
<li>utm_campaign=summer2025 (your campaign name)</li>
</ul>
</li>
<li><strong>Example:</strong> <code>https://yoursite.com?utm_source=qr&utm_medium=print&utm_campaign=summer2025</code></li>
<li><strong>Generate QR code:</strong> Create QR code from this UTM-tagged URL</li>
<li><strong>Track in Google Analytics:</strong> Go to Acquisition Campaigns to view QR code traffic</li>
<li>Example: <code>https://yoursite.com?utm_source=qr&utm_medium=print&utm_campaign=summer2025</code></li>
<li>Generate the QR code from this UTM-tagged URL</li>
<li>Track in Google Analytics via Acquisition Campaigns to view QR code traffic</li>
</ol>
<p><strong>Limitations:</strong> No device-specific data, no real-time scan count, cannot edit URL after printing (unless you use dynamic QR codes WITH UTM parametersbest of both worlds).</p>
<p>Limitations include no device-specific data, no real-time scan count, and inability to edit URLs after printing (unless you use dynamic QR codes WITH UTM parametersbest of both worlds).</p>
<h3>Method 3: URL Shorteners with Analytics</h3>
<p>Services like Bitly, TinyURL, and Rebrandly offer URL shortening with basic analytics. Create a short link, generate a QR code from it, and track clicks in the shortener's dashboard.</p>
@ -349,7 +351,7 @@ app.get('/qr/:id', async (req, res) => {
});
</code></pre>
<p><strong>Privacy Note:</strong> Always hash IP addresses, respect Do Not Track headers, and comply with GDPR when collecting scan data.</p>
<p>Privacy Note: Always hash IP addresses, respect Do Not Track headers, and comply with GDPR when collecting scan data.</p>
<div class="my-8">
<img src="/blog/1-boy.png" alt="Person scanning QR code with smartphone in office" class="rounded-lg shadow-lg w-full" />
@ -433,11 +435,11 @@ app.get('/qr/:id', async (req, res) => {
</table>
</div>
<p><strong>Our Recommendation:</strong></p>
<h4>Our Recommendation</h4>
<ul>
<li><strong>For beginners:</strong> Start with QR Master Free + Google Analytics</li>
<li><strong>For small businesses:</strong> QR Master Pro at $9/month (best value)</li>
<li><strong>For enterprises:</strong> Beaconstac or custom solution</li>
<li>For beginners Start with QR Master Free + Google Analytics</li>
<li>For small businesses QR Master Pro at $9/month (best value)</li>
<li>For enterprises Beaconstac or custom solution</li>
</ul>
<h2>QR Code Tracking Best Practices</h2>
@ -474,26 +476,26 @@ app.get('/qr/:id', async (req, res) => {
<h3>5. Monitor Regularly</h3>
<p>Don't just "set and forget" your QR codes:</p>
<ul>
<li><strong>Daily:</strong> Check for the first week to catch any issues early</li>
<li><strong>Weekly:</strong> Review scan trends during active campaigns</li>
<li><strong>Monthly:</strong> Analyze long-term patterns and create reports</li>
<li>Daily Check for the first week to catch any issues early</li>
<li>Weekly Review scan trends during active campaigns</li>
<li>Monthly Analyze long-term patterns and create reports</li>
</ul>
<h3>6. Privacy & GDPR Compliance</h3>
<p>Respect user privacy when collecting scan data:</p>
<ul>
<li><strong>Hash IP addresses:</strong> Don't store raw IPs; hash them for privacy</li>
<li><strong>Respect Do Not Track:</strong> Honor DNT browser headers</li>
<li><strong>Privacy policy:</strong> Mention QR tracking in your privacy policy</li>
<li><strong>GDPR compliance:</strong> Allow EU users to request data deletion</li>
<li><strong>Cookie consent:</strong> If your landing page uses cookies, show consent banner</li>
<li>Hash IP addresses Don't store raw IPs; hash them for privacy</li>
<li>Respect Do Not Track Honor DNT browser headers</li>
<li>Privacy policy Mention QR tracking in your privacy policy</li>
<li>GDPR compliance Allow EU users to request data deletion</li>
<li>Cookie consent If your landing page uses cookies, show consent banner</li>
</ul>
<h2>QR Code Tracking Use Cases</h2>
<h3>1. Restaurant Menus</h3>
<p><strong>Scenario:</strong> Restaurant replaces physical menus with QR codes on tables.</p>
<p><strong>Tracking Benefits:</strong></p>
<p>Restaurant replaces physical menus with QR codes on tables.</p>
<h5>Tracking Benefits</h5>
<ul>
<li>See which tables generate most scans (optimize table placement)</li>
<li>Track peak scanning times (staff accordingly)</li>
@ -502,8 +504,8 @@ app.get('/qr/:id', async (req, res) => {
</ul>
<h3>2. Retail Product Packaging</h3>
<p><strong>Scenario:</strong> Product packaging includes QR code linking to warranty registration.</p>
<p><strong>Tracking Benefits:</strong></p>
<p>Product packaging includes QR code linking to warranty registration.</p>
<h5>Tracking Benefits</h5>
<ul>
<li>Track which products have highest engagement</li>
<li>Measure warranty registration completion rate</li>
@ -512,8 +514,8 @@ app.get('/qr/:id', async (req, res) => {
</ul>
<h3>3. Event Tickets</h3>
<p><strong>Scenario:</strong> Conference tickets feature unique QR codes for check-in.</p>
<p><strong>Tracking Benefits:</strong></p>
<p>Conference tickets feature unique QR codes for check-in.</p>
<h5>Tracking Benefits</h5>
<ul>
<li>Real-time attendance tracking</li>
<li>Prevent duplicate check-ins (fraud prevention)</li>
@ -522,8 +524,8 @@ app.get('/qr/:id', async (req, res) => {
</ul>
<h3>4. Real Estate Signs</h3>
<p><strong>Scenario:</strong> For Sale signs include QR code to property details.</p>
<p><strong>Tracking Benefits:</strong></p>
<p>For Sale signs include QR code to property details.</p>
<h5>Tracking Benefits</h5>
<ul>
<li>Measure property interest (scan count = qualified leads)</li>
<li>Track which neighborhoods generate most interest</li>
@ -532,8 +534,8 @@ app.get('/qr/:id', async (req, res) => {
</ul>
<h3>5. Print Advertising</h3>
<p><strong>Scenario:</strong> Magazine ad includes QR code to special offer.</p>
<p><strong>Tracking Benefits:</strong></p>
<p>Magazine ad includes QR code to special offer.</p>
<h5>Tracking Benefits</h5>
<ul>
<li>Calculate cost per scan (ad cost ÷ scans)</li>
<li>Compare performance across different magazines</li>
@ -546,8 +548,8 @@ app.get('/qr/:id', async (req, res) => {
<h3>A/B Testing QR Code Designs</h3>
<p>Don't just guess which QR design performs besttest it. Create two versions:</p>
<ul>
<li><strong>Version A:</strong> Plain black and white QR</li>
<li><strong>Version B:</strong> Branded QR with logo and custom colors</li>
<li>Version A Plain black and white QR</li>
<li>Version B Branded QR with logo and custom colors</li>
</ul>
<p>Deploy equal quantities of each and track which generates more scans. Many brands find that branded QR codes get 30-50% higher scan rates because they look more trustworthy.</p>
@ -599,10 +601,10 @@ app.get('/qr/:id', async (req, res) => {
<h3>Mistake 4: Setting Unrealistic Scan Goals</h3>
<p>Typical QR code scan rates:</p>
<ul>
<li><strong>Business cards:</strong> 5-15% scan rate</li>
<li><strong>Product packaging:</strong> 1-5% scan rate</li>
<li><strong>Restaurant tables:</strong> 30-70% scan rate (motivated users want menu)</li>
<li><strong>Print ads:</strong> 0.5-2% scan rate</li>
<li>Business cards 5-15% scan rate</li>
<li>Product packaging 1-5% scan rate</li>
<li>Restaurant tables 30-70% scan rate (motivated users want menu)</li>
<li>Print ads 0.5-2% scan rate</li>
</ul>
<p>Set goals based on industry benchmarks, not wishful thinking.</p>
@ -619,22 +621,22 @@ app.get('/qr/:id', async (req, res) => {
<h3>Primary Metrics:</h3>
<ul>
<li><strong>Total scans:</strong> Raw number of all scans</li>
<li><strong>Unique scans:</strong> Number of individual users (more important than total)</li>
<li><strong>Scan rate:</strong> Scans ÷ potential impressions</li>
<li><strong>Conversion rate:</strong> Conversions ÷ scans</li>
<li><strong>Cost per scan:</strong> Campaign cost ÷ total scans</li>
<li><strong>ROI:</strong> (Revenue - Cost) ÷ Cost × 100%</li>
<li>Total scans Raw number of all scans</li>
<li>Unique scans Number of individual users (more important than total)</li>
<li>Scan rate Scans ÷ potential impressions</li>
<li>Conversion rate Conversions ÷ scans</li>
<li>Cost per scan Campaign cost ÷ total scans</li>
<li>ROI (Revenue - Cost) ÷ Cost × 100%</li>
</ul>
<h3>Secondary Metrics:</h3>
<ul>
<li><strong>Geographic distribution:</strong> Where scanners are located</li>
<li><strong>Device breakdown:</strong> iOS vs Android percentage</li>
<li><strong>Time patterns:</strong> Peak scanning hours/days</li>
<li><strong>Referrer data:</strong> How users discovered the QR code</li>
<li><strong>Bounce rate:</strong> % who leave immediately after scanning</li>
<li><strong>Average session duration:</strong> Time spent on landing page</li>
<li>Geographic distribution Where scanners are located</li>
<li>Device breakdown iOS vs Android percentage</li>
<li>Time patterns Peak scanning hours/days</li>
<li>Referrer data How users discovered the QR code</li>
<li>Bounce rate % who leave immediately after scanning</li>
<li>Average session duration Time spent on landing page</li>
</ul>
<h2>Conclusion</h2>
@ -642,12 +644,12 @@ app.get('/qr/:id', async (req, res) => {
<p>Remember:</p>
<ul>
<li>Always use <strong>dynamic QR codes</strong> for tracking (static cannot be tracked)</li>
<li>Start with <strong>free tools</strong> like QR Master Free + Google Analytics</li>
<li>Set <strong>clear goals</strong> before launching campaigns</li>
<li>Test <strong>thoroughly</strong> before printing large quantities</li>
<li>Monitor <strong>regularly</strong> and optimize based on data</li>
<li>Respect <strong>privacy regulations</strong> (GDPR, CCPA)</li>
<li>Always use dynamic QR codes for tracking (static cannot be tracked)</li>
<li>Start with free tools like QR Master Free + Google Analytics</li>
<li>Set clear goals before launching campaigns</li>
<li>Test thoroughly before printing large quantities</li>
<li>Monitor regularly and optimize based on data</li>
<li>Respect privacy regulations (GDPR, CCPA)</li>
</ul>
<p>Whether you're tracking restaurant menus, product packaging, event tickets, or print advertising, QR code analytics provides the insights needed to justify marketing spend and improve performance. Start tracking your QR codes today and unlock data-driven marketing success.</p>

View File

@ -39,7 +39,7 @@ export default function MarketingLayout({
setToolsOpen(false);
}, [pathname]);
// Always use English for marketing pages
// Default to English for general marketing pages
const t = en;
const tools = [
@ -90,7 +90,7 @@ export default function MarketingLayout({
onMouseLeave={() => setToolsOpen(false)}
>
<button className="flex items-center space-x-1 text-sm font-medium text-slate-600 group-hover:text-slate-900 transition-colors">
<span>Free Tools</span>
<span>{t.nav.tools}</span>
<ChevronDown className={cn("w-4 h-4 transition-transform duration-200", toolsOpen && "rotate-180")} />
</button>
@ -121,7 +121,7 @@ export default function MarketingLayout({
))}
</div>
<div className="mt-3 pt-3 border-t border-slate-100 -mx-4 -mb-4 px-4 py-3 text-center bg-slate-50/50">
<p className="text-xs text-slate-500 font-medium">All generators are 100% free</p>
<p className="text-xs text-slate-500 font-medium">{t.nav.all_free}</p>
</div>
</motion.div>
)}
@ -138,7 +138,7 @@ export default function MarketingLayout({
{t.nav.blog}
</Link>
<Link href="/#faq" className="px-3 py-2 text-sm font-medium text-slate-600 hover:text-slate-900 transition-colors">
FAQ
{t.nav.faq}
</Link>
</div>
@ -188,7 +188,7 @@ export default function MarketingLayout({
onClick={() => setMobileToolsOpen(!mobileToolsOpen)}
className="flex items-center justify-between w-full px-4 py-3 rounded-xl hover:bg-slate-50 text-slate-700 font-semibold"
>
<span>Free Tools</span>
<span>{t.nav.tools}</span>
<ChevronDown className={cn("w-5 h-5 transition-transform", mobileToolsOpen && "rotate-180")} />
</button>
@ -222,14 +222,14 @@ 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="/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="/#faq" className="block px-4 py-3 text-slate-700 font-medium rounded-xl hover:bg-slate-50" onClick={() => setMobileMenuOpen(false)}>FAQ</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">
<Link href="/login" onClick={() => setMobileMenuOpen(false)}>
<Button variant="outline" className="w-full justify-center">Log in</Button>
<Button variant="outline" className="w-full justify-center">{t.nav.login}</Button>
</Link>
<Link href="/signup" onClick={() => setMobileMenuOpen(false)}>
<Button className="w-full justify-center bg-indigo-600 hover:bg-indigo-700">Get Started</Button>
<Button className="w-full justify-center bg-indigo-600 hover:bg-indigo-700">{t.nav.cta}</Button>
</Link>
</div>
</div>
@ -242,7 +242,7 @@ export default function MarketingLayout({
<main className="pt-20">{children}</main>
{/* Footer */}
<Footer />
<Footer t={t} />
</div >
);
}

View File

@ -26,6 +26,7 @@ export async function generateMetadata(): Promise<Metadata> {
languages: {
'x-default': 'https://www.qrmaster.net/',
en: 'https://www.qrmaster.net/',
de: 'https://www.qrmaster.net/qr-code-erstellen',
},
},
openGraph: {

View File

@ -14,6 +14,7 @@ import { Button } from '@/components/ui/Button';
import { Input } from '@/components/ui/Input';
import { Select } from '@/components/ui/Select';
import { cn } from '@/lib/utils';
import AdBanner from '@/components/ads/AdBanner';
// Brand Colors
const BRAND = {
@ -351,6 +352,20 @@ export default function CryptoGenerator() {
</div>
</div>
{/* Leaderboard Ad - Below Form */}
<div className="mt-12 mb-12">
<div className="text-center text-xs text-slate-400 mb-2 uppercase tracking-wider">Advertisement</div>
<div className="flex justify-center bg-slate-50 rounded-xl p-4 border border-slate-100">
{/* @ts-ignore */}
<ad-banner
data-ad-slot="leaderboard-slot-id"
data-ad-format="auto"
full-width-responsive="true"
className="w-full max-w-[728px]"
/>
</div>
</div>
{/* Upsell Banner */}
<div className="mt-8 bg-gradient-to-r from-slate-900 to-slate-700 rounded-2xl p-6 flex flex-col sm:flex-row items-center justify-between gap-4">
<div className="text-white text-center sm:text-left">

View File

@ -7,17 +7,19 @@ import { ToolBreadcrumb } from '@/components/seo/BreadcrumbSchema';
// SEO Optimized Metadata
export const metadata: Metadata = {
title: 'Free Crypto QR Code Generator | Bitcoin, Ethereum & USDT | QR Master',
description: 'Create a QR code for your Crypto wallet address. Supports Bitcoin (BTC), Ethereum (ETH), USDT, and more. Essential for easy payments and donations.',
keywords: ['crypto qr code', 'bitcoin qr generator', 'ethereum qr code', 'crypto wallet qr', 'donation qr code'],
title: {
absolute: 'Free Crypto QR Code Generator | Krypto QR Code Erstellen | QR Master',
},
description: 'Create a QR code for your Crypto wallet address. Erstelle Bitcoin & Ethereum QR Codes für einfache Zahlungen. Supports BTC, ETH, USDT & more.',
keywords: ['crypto qr code', 'bitcoin qr generator', 'ethereum qr code', 'crypto wallet qr', 'donation qr code', 'krypto qr code', 'bitcoin qr code erstellen', 'kryptowährung qr code', 'wallet adresse qr code'],
alternates: {
canonical: 'https://qrmaster.io/tools/crypto-qr-code',
canonical: 'https://www.qrmaster.net/tools/crypto-qr-code',
},
openGraph: {
title: 'Free Crypto QR Code Generator | QR Master',
description: 'Generate QR codes to accept Crypto payments securely. Supports BTC, ETH, SOL.',
type: 'website',
url: 'https://qrmaster.io/tools/crypto-qr-code',
url: 'https://www.qrmaster.net/tools/crypto-qr-code',
images: [{ url: '/og-crypto-generator.png', width: 1200, height: 630 }],
},
twitter: {

View File

@ -7,17 +7,19 @@ import { ToolBreadcrumb } from '@/components/seo/BreadcrumbSchema';
// SEO Optimized Metadata
export const metadata: Metadata = {
title: 'Free Email QR Code Generator | Mailto QR | QR Master',
description: 'Create an Email QR code to send emails instantly. Pre-fill subject and body. 100% free and client-side secure.',
keywords: ['email qr code', 'mailto qr', 'email generator', 'free qr code'],
title: {
absolute: 'Free Email QR Code Generator | Email QR Code Erstellen | QR Master',
},
description: 'Create an Email QR code to send emails instantly. Email QR Code erstellen mit Betreff und Text. 100% free and secure.',
keywords: ['email qr code', 'mailto qr', 'email generator', 'free qr code', 'email qr code erstellen', 'email schreiben qr code', 'qr code für email', 'mailto qr code generator', 'email vorlage qr code'],
alternates: {
canonical: 'https://qrmaster.io/tools/email-qr-code',
canonical: 'https://www.qrmaster.net/tools/email-qr-code',
},
openGraph: {
title: 'Free Email QR Code Generator | QR Master',
description: 'Send emails instantly with a custom QR code. Add recipient, subject, and body.',
type: 'website',
url: 'https://qrmaster.io/tools/email-qr-code',
url: 'https://www.qrmaster.net/tools/email-qr-code',
images: [{ url: '/og-email-generator.png', width: 1200, height: 630 }],
},
};

View File

@ -7,17 +7,19 @@ import { ToolBreadcrumb } from '@/components/seo/BreadcrumbSchema';
// SEO Optimized Metadata
export const metadata: Metadata = {
title: 'Free Event QR Code Generator | Add to Calendar | QR Master',
description: 'Create a QR code for your event. Scanners can instantly save the date, time, and location to their phone calendar. Perfect for invitations and flyers.',
keywords: ['event qr code', 'calendar qr code', 'save the date qr', 'ical qr generator', 'invitation qr code'],
title: {
absolute: 'Free Event QR Code Generator | Termin & Kalender QR | QR Master',
},
description: 'Create a QR code for your event. Verabredung & Termine direkt in den Kalender speichern. Save the date instantly. Free & Easy.',
keywords: ['event qr code', 'calendar qr code', 'save the date qr', 'ical qr generator', 'invitation qr code', 'event qr code erstellen', 'veranstaltung qr code', 'kalender qr code', 'termin qr code', 'save the date qr code'],
alternates: {
canonical: 'https://qrmaster.io/tools/event-qr-code',
canonical: 'https://www.qrmaster.net/tools/event-qr-code',
},
openGraph: {
title: 'Free Event QR Code Generator | QR Master',
description: 'Generate QR codes to save events to calendars. Share dates easily.',
type: 'website',
url: 'https://qrmaster.io/tools/event-qr-code',
url: 'https://www.qrmaster.net/tools/event-qr-code',
images: [{ url: '/og-event-generator.png', width: 1200, height: 630 }],
},
twitter: {

View File

@ -7,17 +7,19 @@ import { ToolBreadcrumb } from '@/components/seo/BreadcrumbSchema';
// SEO Optimized Metadata
export const metadata: Metadata = {
title: 'Free Facebook QR Code Generator | Get Likes & Follows | QR Master',
description: 'Create a QR code for your Facebook Page, Profile, or Group. Scanners are redirected to the Facebook app instantly to like and follow. Free & Easy.',
keywords: ['facebook qr code', 'fb qr generator', 'facebook page qr', 'follow qr code', 'social media qr code'],
title: {
absolute: 'Free Facebook QR Code Generator | Get Likes & Follows | QR Master',
},
description: 'Create a QR code for your Facebook Page, Profile, or Group. Facebook QR Code erstellen. Scanners follow you instantly. Free & Easy.',
keywords: ['facebook qr code', 'fb qr generator', 'facebook page qr', 'follow qr code', 'social media qr code', 'facebook qr code erstellen', 'facebook seite qr code', 'facebook gruppe qr code', 'facebook profil qr code', 'mehr likes qr code'],
alternates: {
canonical: 'https://qrmaster.io/tools/facebook-qr-code',
canonical: 'https://www.qrmaster.net/tools/facebook-qr-code',
},
openGraph: {
title: 'Free Facebook QR Code Generator | QR Master',
description: 'Generate QR codes to grow your Facebook audience. Instant app redirect.',
type: 'website',
url: 'https://qrmaster.io/tools/facebook-qr-code',
url: 'https://www.qrmaster.net/tools/facebook-qr-code',
images: [{ url: '/og-facebook-generator.png', width: 1200, height: 630 }],
},
twitter: {

View File

@ -7,17 +7,19 @@ import { ToolBreadcrumb } from '@/components/seo/BreadcrumbSchema';
// SEO Optimized Metadata
export const metadata: Metadata = {
title: 'Free Geolocation QR Code Generator | Maps & Directions | QR Master',
description: 'Create a QR code for a specific location using Latitude and Longitude. Scanners will open Google Maps directly to your pin. Free & Precise.',
keywords: ['location qr code', 'maps qr code', 'google maps qr generator', 'geolocation qr', 'coordinates qr code'],
title: {
absolute: 'Free Geolocation QR Code Generator | Standort & Map Links | QR Master',
},
description: 'Create a QR code for a specific location. Erstelle einen Map QR Code für Google Maps. Coordinates & Directions instantly. Standort teilen leicht gemacht.',
keywords: ['location qr code', 'maps qr code', 'google maps qr generator', 'geolocation qr', 'coordinates qr code', 'standort qr code', 'google maps qr code erstellen', 'koordinaten qr code', 'wegbeschreibung qr code', 'maps qr code generator'],
alternates: {
canonical: 'https://qrmaster.io/tools/geolocation-qr-code',
canonical: 'https://www.qrmaster.net/tools/geolocation-qr-code',
},
openGraph: {
title: 'Free Geolocation QR Code Generator | QR Master',
description: 'Navigate users to any location with a QR code. Opens directly in Google Maps.',
type: 'website',
url: 'https://qrmaster.io/tools/geolocation-qr-code',
url: 'https://www.qrmaster.net/tools/geolocation-qr-code',
images: [{ url: '/og-geolocation-generator.png', width: 1200, height: 630 }],
},
twitter: {

View File

@ -7,17 +7,19 @@ import { ToolBreadcrumb } from '@/components/seo/BreadcrumbSchema';
// SEO Optimized Metadata
export const metadata: Metadata = {
title: 'Free Instagram QR Code Generator | Get More Followers | QR Master',
description: 'Create a QR code for your Instagram profile or post. Scanners are redirected to the Instagram app instantly to follow you. Free & Customizable.',
keywords: ['instagram qr code', 'insta qr generator', 'ig nametag generator', 'instagram follow qr', 'social media qr code'],
title: {
absolute: 'Free Instagram QR Code Generator | Get More Followers | QR Master',
},
description: 'Create a QR code for your Instagram profile. Erstelle einen Insta QR Code. Scanners follow you instantly. Free & Customizable.',
keywords: ['instagram qr code', 'insta qr generator', 'ig nametag generator', 'instagram follow qr', 'social media qr code', 'instagram qr code erstellen', 'instagram profil qr code', 'insta qr code', 'mehr follower qr code', 'instagram nametag generator'],
alternates: {
canonical: 'https://qrmaster.io/tools/instagram-qr-code',
canonical: 'https://www.qrmaster.net/tools/instagram-qr-code',
},
openGraph: {
title: 'Free Instagram QR Code Generator | QR Master',
description: 'Generate QR codes to grow your Instagram following. Instant app redirect.',
type: 'website',
url: 'https://qrmaster.io/tools/instagram-qr-code',
url: 'https://www.qrmaster.net/tools/instagram-qr-code',
images: [{ url: '/og-instagram-generator.png', width: 1200, height: 630 }],
},
twitter: {

View File

@ -0,0 +1,44 @@
'use client';
import React from 'react';
import AdBanner from '@/components/ads/AdBanner';
export default function ToolsLayout({
children,
}: {
children: React.ReactNode;
}) {
return (
<div className="flex flex-col min-h-screen">
<div className="flex-grow relative">
{children}
{/* Desktop Sidebar Ad - High Resolution Only */}
{/* Positioned absolute to the right, only visible on very wide screens (2xl) */}
<div className="hidden 2xl:block absolute right-4 top-32 w-[160px] z-10">
<div className="sticky top-24">
<div className="text-center text-[10px] text-slate-300 mb-1">AD</div>
<AdBanner
dataAdSlot="sidebar-slot-id"
dataAdFormat="vertical"
className="min-h-[600px] w-[160px]"
/>
</div>
</div>
</div>
{/* Footer Ad Placement - Appears on ALL tool pages */}
<div className="container mx-auto px-4 sm:px-6 lg:px-8 max-w-7xl pb-8">
<div className="mx-auto max-w-4xl text-center text-xs text-slate-400 mb-2">
Sponsored
</div>
<AdBanner
dataAdSlot="1234567890" // Placeholder
dataAdFormat="auto"
fullWidthResponsive={true}
className="bg-slate-50 rounded-xl p-4 border border-slate-100 min-h-[100px]"
/>
</div>
</div>
);
}

View File

@ -7,17 +7,19 @@ import { ToolBreadcrumb } from '@/components/seo/BreadcrumbSchema';
// SEO Optimized Metadata
export const metadata: Metadata = {
title: 'Free PayPal QR Code Generator | Accept Payments Instantly | QR Master',
description: 'Create a QR code for your PayPal.me link. Let customers pay you instantly by scanning. Support tips, donations, and fixed amounts. 100% free.',
keywords: ['paypal qr code', 'paypal.me qr generator', 'payment qr code', 'accept payments qr', 'paypal qr generator', 'tip qr code', 'donation qr code'],
title: {
absolute: 'Free PayPal QR Code Generator | Accept Payments Instantly | QR Master',
},
description: 'Create a QR code for your PayPal.me link. PayPal QR Code erstellen. Receive payments instantly. Support tips, donations, and fixed amounts.',
keywords: ['paypal qr code', 'paypal.me qr generator', 'payment qr code', 'accept payments qr', 'paypal qr generator', 'tip qr code', 'donation qr code', 'paypal qr code erstellen', 'zahlungs qr code', 'spenden qr code', 'paypal bezahlen qr'],
alternates: {
canonical: 'https://qrmaster.io/tools/paypal-qr-code',
canonical: 'https://www.qrmaster.net/tools/paypal-qr-code',
},
openGraph: {
title: 'Free PayPal QR Code Generator | QR Master',
description: 'Generate QR codes for PayPal payments. Perfect for tips, donations, and invoices.',
type: 'website',
url: 'https://qrmaster.io/tools/paypal-qr-code',
url: 'https://www.qrmaster.net/tools/paypal-qr-code',
images: [{ url: '/og-paypal-generator.png', width: 1200, height: 630 }],
},
twitter: {

View File

@ -7,17 +7,19 @@ import { ToolBreadcrumb } from '@/components/seo/BreadcrumbSchema';
// SEO Optimized Metadata
export const metadata: Metadata = {
title: 'Free Phone QR Code Generator | Call Instantly | QR Master',
description: 'Create a QR code that makes a phone call when scanned. Perfect for business cards, flyers, and support lines. 100% Free & No Signup.',
keywords: ['phone qr code', 'call qr code', 'phone number qr generator', 'click to call qr', 'business card qr code'],
title: {
absolute: 'Free Phone QR Code Generator | Anruf & Telefon QR | QR Master',
},
description: 'Create a QR code that makes a phone call. Anruf und Telefonat starten per Scan. Perfect for business cards & support. Kostenlos Call-QR erstellen.',
keywords: ['phone qr code', 'call qr code', 'phone number qr generator', 'click to call qr', 'business card qr code', 'telefon qr code', 'anruf qr code', 'qr code telefonnummer', 'anruf starten qr code', 'telefonnummer scannen'],
alternates: {
canonical: 'https://qrmaster.io/tools/phone-qr-code',
canonical: 'https://www.qrmaster.net/tools/phone-qr-code',
},
openGraph: {
title: 'Free Phone QR Code Generator | QR Master',
description: 'Generate QR codes to initiate phone calls instantly. Share your number easily.',
type: 'website',
url: 'https://qrmaster.io/tools/phone-qr-code',
url: 'https://www.qrmaster.net/tools/phone-qr-code',
images: [{ url: '/og-phone-generator.png', width: 1200, height: 630 }],
},
twitter: {

View File

@ -7,17 +7,19 @@ import { ToolBreadcrumb } from '@/components/seo/BreadcrumbSchema';
// SEO Optimized Metadata
export const metadata: Metadata = {
title: 'Free SMS QR Code Generator | Pre-filled Texts | QR Master',
description: 'Create a QR code to send an SMS text message instantly. Pre-fill the phone number and message body. Free, private, and works on all phones.',
keywords: ['sms qr code', 'text message qr code', 'send sms qr', 'sms generator', 'text qr'],
title: {
absolute: 'Free SMS QR Code Generator | SMS QR Code Erstellen | QR Master',
},
description: 'Create a QR code to send an SMS text message instantly. SMS QR Code erstellen mit vorgefertigtem Text. Free, private, and works on all phones.',
keywords: ['sms qr code', 'text message qr code', 'send sms qr', 'sms generator', 'text qr', 'sms qr code erstellen', 'qr code für sms', 'nachricht qr code', 'sms vorlage qr code', 'sms versenden qr'],
alternates: {
canonical: 'https://qrmaster.io/tools/sms-qr-code',
canonical: 'https://www.qrmaster.net/tools/sms-qr-code',
},
openGraph: {
title: 'Free SMS QR Code Generator | QR Master',
description: 'Generate QR codes for instant SMS messages. Pre-fill text and number.',
type: 'website',
url: 'https://qrmaster.io/tools/sms-qr-code',
url: 'https://www.qrmaster.net/tools/sms-qr-code',
images: [{ url: '/og-sms-generator.png', width: 1200, height: 630 }],
},
twitter: {

View File

@ -7,17 +7,19 @@ import { ToolBreadcrumb } from '@/components/seo/BreadcrumbSchema';
// SEO Optimized Metadata
export const metadata: Metadata = {
title: 'Free Microsoft Teams QR Code Generator | Join Meetings Instantly | QR Master',
description: 'Create a QR code for your Microsoft Teams meeting. Attendees scan to join instantly. Perfect for conference rooms, hybrid meetings, and event displays.',
keywords: ['teams qr code', 'microsoft teams meeting qr', 'join teams qr code', 'meeting room qr', 'teams invitation qr', 'hybrid meeting qr code'],
title: {
absolute: 'Free Microsoft Teams QR Code Generator | Join Meetings | QR Master',
},
description: 'Create a QR code for your Microsoft Teams meeting. Teams QR Code erstellen. Attendees scan to join instantly. For hybrid meetings & office displays.',
keywords: ['teams qr code', 'microsoft teams meeting qr', 'join teams qr code', 'meeting room qr', 'teams invitation qr', 'hybrid meeting qr code', 'microsoft teams qr code erstellen', 'teams meeting qr code', 'teams besprechung qr', 'teams beitreten qr'],
alternates: {
canonical: 'https://qrmaster.io/tools/teams-qr-code',
canonical: 'https://www.qrmaster.net/tools/teams-qr-code',
},
openGraph: {
title: 'Free Microsoft Teams QR Code Generator | QR Master',
description: 'Generate QR codes for Teams meetings. One scan to join instantly.',
type: 'website',
url: 'https://qrmaster.io/tools/teams-qr-code',
url: 'https://www.qrmaster.net/tools/teams-qr-code',
images: [{ url: '/og-teams-generator.png', width: 1200, height: 630 }],
},
twitter: {

View File

@ -7,17 +7,19 @@ import { ToolBreadcrumb } from '@/components/seo/BreadcrumbSchema';
// SEO Optimized Metadata
export const metadata: Metadata = {
title: 'Free Text QR Code Generator | Instant & No Limits | QR Master',
description: 'Create a QR code for any plain text message in seconds. No limit on scans. 100% private & client-side. Download valid SVG/PNG files instantly.',
keywords: ['text qr code', 'qr code text generator', 'message to qr code', 'offline qr code', 'text qr generator', 'free qr code'],
title: {
absolute: 'Free Text QR Code Generator | Text zu QR Code | QR Master',
},
description: 'Create a QR code for any plain text message. Erstelle einen Text QR Code kostenlos. Works offline & 100% private. Nachricht als QR Code teilen.',
keywords: ['text qr code', 'qr code text generator', 'message to qr code', 'offline qr code', 'text qr generator', 'free qr code', 'text zu qr code', 'qr code text erstellen', 'nachricht in qr code', 'textnachricht qr code', 'geheimnachricht qr code'],
alternates: {
canonical: 'https://qrmaster.io/tools/text-qr-code',
canonical: 'https://www.qrmaster.net/tools/text-qr-code',
},
openGraph: {
title: 'Free Text QR Code Generator | QR Master',
description: 'Turn any text into a QR code instantly. No signup required. 100% text privacy.',
type: 'website',
url: 'https://qrmaster.io/tools/text-qr-code',
url: 'https://www.qrmaster.net/tools/text-qr-code',
images: [{ url: '/og-text-generator.png', width: 1200, height: 630 }],
},
twitter: {

View File

@ -7,17 +7,19 @@ import { ToolBreadcrumb } from '@/components/seo/BreadcrumbSchema';
// SEO Optimized Metadata
export const metadata: Metadata = {
title: 'Free TikTok QR Code Generator | Get Followers | QR Master',
description: 'Create a QR code for your TikTok profile. Scanners are redirected to the TikTok app instantly to follow you. Customize with colors and frames.',
keywords: ['tiktok qr code', 'tik tok qr generator', 'tiktok follow qr', 'social media qr code', 'tiktok profile qr'],
title: {
absolute: 'Free TikTok QR Code Generator | Get Followers | QR Master',
},
description: 'Create a QR code for your TikTok profile. TikTok QR Code erstellen. Scanners follow you instantly. Customize with colors and frames.',
keywords: ['tiktok qr code', 'tik tok qr generator', 'tiktok follow qr', 'social media qr code', 'tiktok profile qr', 'tiktok qr code erstellen', 'tiktok profil qr code', 'mehr tiktok follower', 'tiktok scanncode'],
alternates: {
canonical: 'https://qrmaster.io/tools/tiktok-qr-code',
canonical: 'https://www.qrmaster.net/tools/tiktok-qr-code',
},
openGraph: {
title: 'Free TikTok QR Code Generator | QR Master',
description: 'Generate QR codes to grow your TikTok following. Instant app redirect.',
type: 'website',
url: 'https://qrmaster.io/tools/tiktok-qr-code',
url: 'https://www.qrmaster.net/tools/tiktok-qr-code',
images: [{ url: '/og-tiktok-generator.png', width: 1200, height: 630 }],
},
twitter: {

View File

@ -7,17 +7,19 @@ import { ToolBreadcrumb } from '@/components/seo/BreadcrumbSchema';
// SEO Optimized Metadata
export const metadata: Metadata = {
title: 'Free Twitter (X) QR Code Generator | Follow & Connect | QR Master',
description: 'Create a QR code for your X (formerly Twitter) profile. Scanners are redirected to the app instantly to follow you. Free & Customizable.',
keywords: ['twitter qr code', 'x qr generator', 'twitter follow qr', 'social media qr code', 'x profile qr'],
title: {
absolute: 'Free Twitter (X) QR Code Generator | Follow & Connect | QR Master',
},
description: 'Create a QR code for your X (Twitter) profile. Twitter QR Code erstellen. Scanners follow you instantly. Free & Customizable.',
keywords: ['twitter qr code', 'x qr generator', 'twitter follow qr', 'social media qr code', 'x profile qr', 'twitter qr code erstellen', 'x qr code erstellen', 'twitter profil qr code', 'x profil qr code'],
alternates: {
canonical: 'https://qrmaster.io/tools/twitter-qr-code',
canonical: 'https://www.qrmaster.net/tools/twitter-qr-code',
},
openGraph: {
title: 'Free Twitter (X) QR Code Generator | QR Master',
description: 'Generate QR codes to grow your X (Twitter) following. Instant app redirect.',
type: 'website',
url: 'https://qrmaster.io/tools/twitter-qr-code',
url: 'https://www.qrmaster.net/tools/twitter-qr-code',
images: [{ url: '/og-twitter-generator.png', width: 1200, height: 630 }],
},
twitter: {

View File

@ -7,17 +7,19 @@ import { ToolBreadcrumb } from '@/components/seo/BreadcrumbSchema';
// SEO Optimized Metadata
export const metadata: Metadata = {
title: 'Free URL QR Code Generator | Link to Any Website | QR Master',
description: 'Create a QR code for your website, social media, or any link. Static and free forever. No scan limits. Instant download.',
keywords: ['url qr code', 'website qr code', 'link qr generator', 'free qr code generator', 'url to qr'],
title: {
absolute: 'Free URL QR Code Generator | Link to Any Website | QR Master',
},
description: 'Create a QR code for your website. Erstelle kostenlos einen QR Code für deine Webseite. Static and free forever. Link zu jeder URL.',
keywords: ['url qr code', 'website qr code', 'link qr generator', 'free qr code generator', 'url to qr', 'qr code erstellen', 'link qr code erstellen', 'website qr code generator', 'kostenlos qr code erstellen', 'url zu qr code', 'webseite verlinken qr'],
alternates: {
canonical: 'https://qrmaster.io/tools/url-qr-code',
canonical: 'https://www.qrmaster.net/tools/url-qr-code',
},
openGraph: {
title: 'Free URL QR Code Generator | QR Master',
description: 'Turn any URL into a QR code. Share websites instantly.',
type: 'website',
url: 'https://qrmaster.io/tools/url-qr-code',
url: 'https://www.qrmaster.net/tools/url-qr-code',
images: [{ url: '/og-url-generator.png', width: 1200, height: 630 }],
},
twitter: {

View File

@ -7,17 +7,19 @@ import { ToolBreadcrumb } from '@/components/seo/BreadcrumbSchema';
// SEO Optimized Metadata
export const metadata: Metadata = {
title: 'Free vCard QR Code Generator | Digital Business Card | QR Master',
description: 'Create a vCard QR code for your business card. Share contact details (Name, Phone, Email) instantly with one scan. 100% Free & No App Required.',
keywords: ['vcard qr code', 'business card qr code', 'contact qr generator', 'digital business card', 'add to contacts qr'],
title: {
absolute: 'Free vCard QR Code Generator | Digitale Visitenkarte Erstellen | QR Master',
},
description: 'Create a vCard QR code for your business card. Erstelle deine elektronische Visitenkarte kostenlos. Share contact details instantly. Free & No App Required.',
keywords: ['vcard qr code', 'business card qr code', 'contact qr generator', 'digital business card', 'add to contacts qr', 'visitenkarte qr code', 'digitale visitenkarte erstellen', 'kontakt qr code', 'elektronische visitenkarte', 'vcard erstellen kostenlos'],
alternates: {
canonical: 'https://qrmaster.io/tools/vcard-qr-code',
canonical: 'https://www.qrmaster.net/tools/vcard-qr-code',
},
openGraph: {
title: 'Free vCard QR Code Generator | QR Master',
description: 'Turn your contact info into a QR code. The modern way to share your business card.',
type: 'website',
url: 'https://qrmaster.io/tools/vcard-qr-code',
url: 'https://www.qrmaster.net/tools/vcard-qr-code',
images: [{ url: '/og-vcard-generator.png', width: 1200, height: 630 }],
},
twitter: {

View File

@ -7,17 +7,19 @@ import { ToolBreadcrumb } from '@/components/seo/BreadcrumbSchema';
// SEO Optimized Metadata
export const metadata: Metadata = {
title: 'Free WhatsApp QR Code Generator | Start Chats Instantly | QR Master',
description: 'Create a QR code that opens a WhatsApp chat with you. Add a pre-filled message. Perfect for customer support and sales.',
keywords: ['whatsapp qr code', 'wa.me generator', 'whatsapp chat qr', 'whatsapp link generator', 'contact qr code'],
title: {
absolute: 'Free WhatsApp QR Code Generator | Start Chats Instantly | QR Master',
},
description: 'Create a QR code that opens a WhatsApp chat. WhatsApp QR Code erstellen mit Nachricht. Perfect for support & sales.',
keywords: ['whatsapp qr code', 'wa.me generator', 'whatsapp chat qr', 'whatsapp link generator', 'contact qr code', 'whatsapp qr code erstellen', 'wa.me link erstellen', 'whatsapp chat starten', 'whatsapp kontakt qr code', 'whatsapp nachricht qr code'],
alternates: {
canonical: 'https://qrmaster.io/tools/whatsapp-qr-code',
canonical: 'https://www.qrmaster.net/tools/whatsapp-qr-code',
},
openGraph: {
title: 'Free WhatsApp QR Code Generator | QR Master',
description: 'Generate QR codes to start WhatsApp chats. Add a pre-filled message.',
type: 'website',
url: 'https://qrmaster.io/tools/whatsapp-qr-code',
url: 'https://www.qrmaster.net/tools/whatsapp-qr-code',
images: [{ url: '/og-whatsapp-generator.png', width: 1200, height: 630 }],
},
twitter: {

View File

@ -7,17 +7,19 @@ import { ToolBreadcrumb } from '@/components/seo/BreadcrumbSchema';
// SEO Optimized Metadata
export const metadata: Metadata = {
title: 'Free WiFi QR Code Generator | Instant & Secure | QR Master',
description: 'Create a WiFi QR code in seconds. Guests scan to connect instantly—no typing passwords. 100% private: your credentials never leave your browser. Free forever.',
keywords: ['wifi qr code', 'qr code generator', 'wifi qr code generator', 'share wifi', 'wifi password qr', 'guest wifi'],
title: {
absolute: 'Free WiFi QR Code Generator | WLAN QR Code Erstellen | QR Master',
},
description: 'Create a WiFi QR code in seconds. Erstelle kostenlos deinen WLAN QR Code ohne Passwort-Eingabe. Guests scan to connect instantly. 100% Secure & Free.',
keywords: ['wifi qr code', 'qr code generator', 'wifi qr code generator', 'share wifi', 'wifi password qr', 'guest wifi', 'wlan qr code', 'wlan qr code erstellen', 'wifi passwort qr code', 'wlan zugang teilen', 'wifi qr code kostenlos'],
alternates: {
canonical: 'https://qrmaster.io/tools/wifi-qr-code',
canonical: 'https://www.qrmaster.net/tools/wifi-qr-code',
},
openGraph: {
title: 'Free WiFi QR Code Generator | QR Master',
description: 'Share your WiFi without sharing your password. Guests scan the QR code to connect instantly.',
type: 'website',
url: 'https://qrmaster.io/tools/wifi-qr-code',
url: 'https://www.qrmaster.net/tools/wifi-qr-code',
images: [{ url: '/og-wifi-generator.png', width: 1200, height: 630 }],
},
twitter: {

View File

@ -7,17 +7,19 @@ import { ToolBreadcrumb } from '@/components/seo/BreadcrumbSchema';
// SEO Optimized Metadata
export const metadata: Metadata = {
title: 'Free YouTube QR Code Generator | Get Views & Subscribers | QR Master',
description: 'Create a QR code for your YouTube video or channel. Scanners are redirected to the YouTube app instantly to watch. Free & Fast.',
keywords: ['youtube qr code', 'video qr code', 'youtube channel qr', 'youtube subscribe qr', 'social media qr code'],
title: {
absolute: 'Free YouTube QR Code Generator | Get Views & Subscribers | QR Master',
},
description: 'Create a QR code for your YouTube video or channel. YouTube QR Code erstellen. Scanners watch instantly. Free & Fast.',
keywords: ['youtube qr code', 'video qr code', 'youtube channel qr', 'youtube subscribe qr', 'social media qr code', 'youtube qr code erstellen', 'video qr code erstellen', 'kanal qr code', 'youtube abonnenten qr code', 'youtube video teilen qr'],
alternates: {
canonical: 'https://qrmaster.io/tools/youtube-qr-code',
canonical: 'https://www.qrmaster.net/tools/youtube-qr-code',
},
openGraph: {
title: 'Free YouTube QR Code Generator | QR Master',
description: 'Generate QR codes to grow your YouTube channel. Instant video play.',
type: 'website',
url: 'https://qrmaster.io/tools/youtube-qr-code',
url: 'https://www.qrmaster.net/tools/youtube-qr-code',
images: [{ url: '/og-youtube-generator.png', width: 1200, height: 630 }],
},
twitter: {

View File

@ -7,17 +7,19 @@ import { ToolBreadcrumb } from '@/components/seo/BreadcrumbSchema';
// SEO Optimized Metadata
export const metadata: Metadata = {
title: 'Free Zoom QR Code Generator | Join Meetings Instantly | QR Master',
description: 'Create a QR code for your Zoom meeting. Attendees scan to join instantly. Includes meeting ID and passcode. Perfect for conference rooms and flyers.',
keywords: ['zoom qr code', 'zoom meeting qr', 'join zoom qr code', 'meeting room qr', 'zoom invitation qr', 'conference qr code'],
title: {
absolute: 'Free Zoom QR Code Generator | Join Meetings Instantly | QR Master',
},
description: 'Create a QR code for your Zoom meeting. Zoom QR Code erstellen. Attendees scan to join instantly. Perfect for conference rooms & invites.',
keywords: ['zoom qr code', 'zoom meeting qr', 'join zoom qr code', 'meeting room qr', 'zoom invitation qr', 'conference qr code', 'zoom qr code erstellen', 'zoom meeting qr code', 'video konferenz qr', 'zoom beitreten qr'],
alternates: {
canonical: 'https://qrmaster.io/tools/zoom-qr-code',
canonical: 'https://www.qrmaster.net/tools/zoom-qr-code',
},
openGraph: {
title: 'Free Zoom QR Code Generator | QR Master',
description: 'Generate QR codes for Zoom meetings. One scan to join instantly.',
type: 'website',
url: 'https://qrmaster.io/tools/zoom-qr-code',
url: 'https://www.qrmaster.net/tools/zoom-qr-code',
images: [{ url: '/og-zoom-generator.png', width: 1200, height: 630 }],
},
twitter: {

View File

@ -0,0 +1,248 @@
'use client';
import React, { useState, useEffect } from 'react';
import Link from 'next/link';
import { usePathname } from 'next/navigation';
import { Button } from '@/components/ui/Button';
import { Footer } from '@/components/ui/Footer';
import de from '@/i18n/de.json';
import { ChevronDown, Wifi, Contact, MessageCircle, QrCode, Link2, Type, Mail, MessageSquare, Phone, Calendar, MapPin, Facebook, Instagram, Twitter, Youtube, Music, Bitcoin, CreditCard, Video, Users } from 'lucide-react';
import { cn } from '@/lib/utils';
import { AnimatePresence, motion } from 'framer-motion';
export default function MarketingLayout({
children,
}: {
children: React.ReactNode;
}) {
const [mobileMenuOpen, setMobileMenuOpen] = useState(false);
const [scrolled, setScrolled] = useState(false);
const [toolsOpen, setToolsOpen] = useState(false);
const [mobileToolsOpen, setMobileToolsOpen] = useState(false);
const pathname = usePathname();
useEffect(() => {
const handleScroll = () => {
setScrolled(window.scrollY > 20);
};
// Check immediately on mount
handleScroll();
window.addEventListener('scroll', handleScroll, { passive: true });
return () => window.removeEventListener('scroll', handleScroll);
}, []);
// Close simple menus when path changes
useEffect(() => {
setMobileMenuOpen(false);
setToolsOpen(false);
}, [pathname]);
// Always German for this layout
const t = de;
const tools = [
{ name: 'URL / Link', description: 'Link to any website', href: '/tools/url-qr-code', icon: Link2, color: 'text-blue-500', bgColor: 'bg-blue-50' },
{ name: 'Text', description: 'Plain text message', href: '/tools/text-qr-code', icon: Type, color: 'text-slate-500', bgColor: 'bg-slate-50' },
{ name: 'WiFi', description: 'Share WiFi credentials', href: '/tools/wifi-qr-code', icon: Wifi, color: 'text-indigo-500', bgColor: 'bg-indigo-50' },
{ name: 'VCard', description: 'Digital business card', href: '/tools/vcard-qr-code', icon: Contact, color: 'text-pink-500', bgColor: 'bg-pink-50' },
{ name: 'WhatsApp', description: 'Start a chat', href: '/tools/whatsapp-qr-code', icon: MessageCircle, color: 'text-green-500', bgColor: 'bg-green-50' },
{ name: 'Email', description: 'Compose an email', href: '/tools/email-qr-code', icon: Mail, color: 'text-amber-500', bgColor: 'bg-amber-50' },
{ name: 'SMS', description: 'Send a text message', href: '/tools/sms-qr-code', icon: MessageSquare, color: 'text-cyan-500', bgColor: 'bg-cyan-50' },
{ name: 'Phone', description: 'Start a call', href: '/tools/phone-qr-code', icon: Phone, color: 'text-violet-500', bgColor: 'bg-violet-50' },
{ name: 'Event', description: 'Add calendar event', href: '/tools/event-qr-code', icon: Calendar, color: 'text-red-500', bgColor: 'bg-red-50' },
{ name: 'Location', description: 'Share a place', href: '/tools/geolocation-qr-code', icon: MapPin, color: 'text-emerald-500', bgColor: 'bg-emerald-50' },
{ name: 'Facebook', description: 'Facebook profile/page', href: '/tools/facebook-qr-code', icon: Facebook, color: 'text-blue-600', bgColor: 'bg-blue-50' },
{ name: 'Instagram', description: 'Instagram profile', href: '/tools/instagram-qr-code', icon: Instagram, color: 'text-pink-600', bgColor: 'bg-pink-50' },
{ name: 'Twitter / X', description: 'Twitter profile', href: '/tools/twitter-qr-code', icon: Twitter, color: 'text-sky-500', bgColor: 'bg-sky-50' },
{ name: 'YouTube', description: 'YouTube video/channel', href: '/tools/youtube-qr-code', icon: Youtube, color: 'text-red-600', bgColor: 'bg-red-50' },
{ name: 'TikTok', description: 'TikTok profile', href: '/tools/tiktok-qr-code', icon: Music, color: 'text-slate-800', bgColor: 'bg-slate-100' },
{ name: 'Crypto', description: 'Share wallet address', href: '/tools/crypto-qr-code', icon: Bitcoin, color: 'text-orange-500', bgColor: 'bg-orange-50' },
{ name: 'PayPal', description: 'Receive payments', href: '/tools/paypal-qr-code', icon: CreditCard, color: 'text-blue-700', bgColor: 'bg-blue-50' },
{ name: 'Zoom', description: 'Join Zoom meeting', href: '/tools/zoom-qr-code', icon: Video, color: 'text-sky-500', bgColor: 'bg-sky-50' },
{ name: 'Teams', description: 'Join Teams meeting', href: '/tools/teams-qr-code', icon: Users, color: 'text-violet-500', bgColor: 'bg-violet-50' },
];
return (
<div className="min-h-screen bg-white">
{/* Header */}
<header
className="fixed top-0 left-0 right-0 z-50 bg-white/80 backdrop-blur-md border-b border-slate-200 shadow-sm"
>
<nav className="container mx-auto px-4 sm:px-6 lg:px-8 max-w-7xl h-20 flex items-center justify-between">
{/* Logo */}
<Link href="/" className="flex items-center space-x-2.5 group">
<div className="relative w-9 h-9 flex items-center justify-center bg-indigo-600 rounded-lg shadow-indigo-200 shadow-lg group-hover:scale-105 transition-transform duration-200">
<QrCode className="w-5 h-5 text-white" />
</div>
<span className="text-xl font-bold text-slate-900 tracking-tight group-hover:text-indigo-600 transition-colors">QR Master</span>
</Link>
{/* Desktop Navigation */}
<div className="hidden md:flex items-center space-x-1">
{/* Tools Dropdown */}
<div
className="relative group px-3 py-2"
onMouseEnter={() => setToolsOpen(true)}
onMouseLeave={() => setToolsOpen(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.tools}</span>
<ChevronDown className={cn("w-4 h-4 transition-transform duration-200", toolsOpen && "rotate-180")} />
</button>
<AnimatePresence>
{toolsOpen && (
<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-[750px] bg-white rounded-2xl shadow-lg border border-slate-100 p-4 overflow-hidden"
>
<div className="grid grid-cols-3 gap-1">
{tools.map((tool) => (
<Link
key={tool.name}
href={tool.href}
className="flex items-center space-x-3 p-2.5 rounded-xl transition-colors hover:bg-slate-50"
>
<div className={cn("p-2 rounded-lg shrink-0", tool.bgColor, tool.color)}>
<tool.icon className="w-4 h-4" />
</div>
<div>
<div className="text-sm font-semibold text-slate-900">{tool.name}</div>
<p className="text-xs text-slate-500 leading-snug">{tool.description}</p>
</div>
</Link>
))}
</div>
<div className="mt-3 pt-3 border-t border-slate-100 -mx-4 -mb-4 px-4 py-3 text-center bg-slate-50/50">
<p className="text-xs text-slate-500 font-medium">{t.nav.all_free}</p>
</div>
</motion.div>
)}
</AnimatePresence>
</div>
<Link href="/#features" className="px-3 py-2 text-sm font-medium text-slate-600 hover:text-slate-900 transition-colors">
{t.nav.features}
</Link>
<Link href="/#pricing" className="px-3 py-2 text-sm font-medium text-slate-600 hover:text-slate-900 transition-colors">
{t.nav.pricing}
</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="/#faq" className="px-3 py-2 text-sm font-medium text-slate-600 hover:text-slate-900 transition-colors">
{t.nav.faq}
</Link>
</div>
<div className="hidden md:flex items-center space-x-4">
<Link href="/login" className="text-sm font-medium text-slate-600 hover:text-slate-900 transition-colors">
{t.nav.login}
</Link>
<Link href="/signup">
<Button className={cn(
"font-semibold shadow-lg shadow-indigo-500/20 transition-all hover:scale-105",
scrolled ? "bg-blue-600 text-white hover:bg-blue-700" : "bg-blue-600 text-white hover:bg-blue-700"
)}>
{t.nav.cta || "Get Started Free"}
</Button>
</Link>
</div>
{/* Mobile Menu Button - Always dark */}
<button
className="md:hidden p-2 text-slate-900"
onClick={() => setMobileMenuOpen(!mobileMenuOpen)}
aria-label="Toggle menu"
>
<svg className="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24">
{mobileMenuOpen ? (
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M6 18L18 6M6 6l12 12" />
) : (
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M4 6h16M4 12h16M4 18h16" />
)}
</svg>
</button>
</nav>
{/* Mobile Menu */}
<AnimatePresence>
{mobileMenuOpen && (
<motion.div
initial={{ opacity: 0, height: 0 }}
animate={{ opacity: 1, height: 'auto' }}
exit={{ opacity: 0, height: 0 }}
className="md:hidden bg-white border-b border-slate-100 overflow-hidden"
>
<div className="container mx-auto px-4 py-6 space-y-2">
{/* Free Tools Accordion */}
<button
onClick={() => setMobileToolsOpen(!mobileToolsOpen)}
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.tools}</span>
<ChevronDown className={cn("w-5 h-5 transition-transform", mobileToolsOpen && "rotate-180")} />
</button>
<AnimatePresence>
{mobileToolsOpen && (
<motion.div
initial={{ opacity: 0, height: 0 }}
animate={{ opacity: 1, height: 'auto' }}
exit={{ opacity: 0, height: 0 }}
className="overflow-hidden"
>
<div className="max-h-[50vh] overflow-y-auto pl-4 space-y-1 border-l-2 border-slate-100 ml-4">
{tools.map((tool) => (
<Link
key={tool.name}
href={tool.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); setMobileToolsOpen(false); }}
>
<tool.icon className={cn("w-4 h-4", tool.color)} />
{tool.name}
</Link>
))}
</div>
</motion.div>
)}
</AnimatePresence>
<div className="h-px bg-slate-100 my-2"></div>
<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="/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="/#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">
<Link href="/login" onClick={() => setMobileMenuOpen(false)}>
<Button variant="outline" className="w-full justify-center">{t.nav.login}</Button>
</Link>
<Link href="/signup" onClick={() => setMobileMenuOpen(false)}>
<Button className="w-full justify-center bg-indigo-600 hover:bg-indigo-700">{t.nav.cta}</Button>
</Link>
</div>
</div>
</motion.div>
)}
</AnimatePresence>
</header>
{/* Main Content */}
<main className="pt-20">{children}</main>
{/* Footer */}
<Footer t={t} />
</div >
);
}

View File

@ -0,0 +1,108 @@
import React from 'react';
import type { Metadata } from 'next';
import SeoJsonLd from '@/components/SeoJsonLd';
import { organizationSchema, websiteSchema } from '@/lib/schema';
import { Hero } from '@/components/marketing/Hero';
import { InstantGenerator } from '@/components/marketing/InstantGenerator';
import { StaticVsDynamic } from '@/components/marketing/StaticVsDynamic';
import { Features } from '@/components/marketing/Features';
import { Pricing } from '@/components/marketing/Pricing';
import { FAQ } from '@/components/marketing/FAQ';
import { ScrollToTop } from '@/components/ui/ScrollToTop';
import de from '@/i18n/de.json';
function truncateAtWord(text: string, maxLength: number): string {
if (text.length <= maxLength) return text;
const truncated = text.slice(0, maxLength);
const lastSpace = truncated.lastIndexOf(' ');
return lastSpace > 0 ? truncated.slice(0, lastSpace) : truncated;
}
export async function generateMetadata(): Promise<Metadata> {
const title = truncateAtWord('QR Code Erstellen Kostenlos & Sofort | QR Master', 60);
const description = truncateAtWord(
'Erstellen Sie QR Codes kostenlos in Sekunden. Statische und dynamische QR-Codes mit Tracking, individuellem Branding und Massen-Erstellung. Für immer kostenlos.',
160
);
return {
title,
description,
keywords: [
'qr code erstellen',
'qr code generator',
'qr code kostenlos',
'qr-code-generatoren',
'qr codes erstellen',
'qr code erstellen kostenlos',
'dynamischer qr code',
'qr code mit logo'
],
alternates: {
canonical: 'https://www.qrmaster.net/qr-code-erstellen',
languages: {
'x-default': 'https://www.qrmaster.net/',
en: 'https://www.qrmaster.net/',
de: 'https://www.qrmaster.net/qr-code-erstellen',
},
},
openGraph: {
title: 'QR Code Erstellen Kostenlos & Sofort | QR Master',
description: 'Erstellen Sie QR Codes kostenlos in Sekunden. Mit Tracking, Branding und Massen-Erstellung.',
url: 'https://www.qrmaster.net/qr-code-erstellen',
type: 'website',
locale: 'de_DE',
},
twitter: {
title: 'QR Code Erstellen Kostenlos | QR Master',
description: 'QR Codes erstellen in Sekunden. Kostenlos, mit Tracking und individuellem Branding.',
},
};
}
export default function QRCodeErstellenPage() {
// Use German translations
const t = de;
return (
<>
<SeoJsonLd data={[organizationSchema(), websiteSchema()]} />
{/* Server-rendered SEO content for crawlers - GERMAN */}
<div className="sr-only" aria-hidden="false">
<h1>QR Code Erstellen Kostenloser QR Code Generator mit Tracking & Statistiken</h1>
<p>
Erstellen Sie professionelle QR Codes für Ihr Unternehmen mit QR Master. Unser dynamischer QR Code Generator
ermöglicht es Ihnen, trackbare QR Codes zu erstellen, Ziel-URLs jederzeit zu ändern und detaillierte Statistiken einzusehen.
Perfekt für Restaurants, Einzelhandel, Events und Marketing-Kampagnen.
</p>
<p>
Funktionen: Dynamische QR Codes mit Echtzeit-Tracking, Massen-QR-Code-Erstellung aus Excel/CSV,
individuelles Branding mit Farben und Logos, erweiterte Scan-Statistiken mit Gerätetypen und Standorten,
vCard QR Codes für digitale Visitenkarten und QR Codes für Restaurant-Speisekarten.
</p>
<p>
Starten Sie kostenlos mit 3 dynamischen QR Codes 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} />
{/* Main Interaction: Generator */}
<InstantGenerator t={t} />
<StaticVsDynamic t={t} />
<Features t={t} />
{/* Pricing Section */}
<Pricing t={t} />
{/* FAQ Section */}
<FAQ t={t} />
{/* Scroll to Top Button */}
<ScrollToTop />
</>
);
}

View File

@ -114,6 +114,11 @@ export default function RootLayout({
type="application/ld+json"
dangerouslySetInnerHTML={{ __html: JSON.stringify(websiteSchema) }}
/>
<script
async
src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2782770414424875"
crossOrigin="anonymous"
/>
</head>
<body className="font-sans">
<Suspense fallback={null}>

View File

@ -0,0 +1,59 @@
'use client';
import { useEffect, useState } from 'react';
import { useSession } from 'next-auth/react';
interface AdBannerProps {
dataAdSlot: string;
dataAdFormat?: string;
fullWidthResponsive?: boolean;
className?: string;
}
export default function AdBanner({
dataAdSlot,
dataAdFormat = 'auto',
fullWidthResponsive = true,
className = '',
}: AdBannerProps) {
const { data: session, status } = useSession();
// Check if user has a paid plan
// Adjust 'pro' or 'premium' based on your actual plan values
const isPaidUser = session?.user && (
session.user.plan === 'PRO' ||
session.user.plan === 'PREMIUM' ||
session.user.plan === 'LIFETIME'
);
const [adLoaded, setAdLoaded] = useState(false);
useEffect(() => {
// Don't load if loading session or if user is paid
if (status === 'loading' || isPaidUser) return;
try {
// @ts-ignore
(window.adsbygoogle = window.adsbygoogle || []).push({});
setAdLoaded(true);
} catch (err) {
console.error('AdSense error:', err);
}
}, [isPaidUser, status]);
// Don't render anything if paid user
if (status === 'authenticated' && isPaidUser) return null;
return (
<div className={`ad-container my-8 flex justify-center items-center overflow-hidden ${className}`} aria-hidden={true}>
<ins
className="adsbygoogle"
style={{ display: 'block', minWidth: '300px', minHeight: '50px', width: '100%' }}
data-ad-client="ca-pub-2782770414424875"
data-ad-slot={dataAdSlot}
data-ad-format={dataAdFormat}
data-full-width-responsive={fullWidthResponsive}
/>
</div>
);
}

View File

@ -8,6 +8,7 @@ import { Input } from '@/components/ui/Input';
import { Button } from '@/components/ui/Button';
import { Badge } from '@/components/ui/Badge';
import { calculateContrast } from '@/lib/utils';
import AdBanner from '@/components/ads/AdBanner';
interface InstantGeneratorProps {
t: any; // i18n translation function
@ -276,6 +277,16 @@ export const InstantGenerator: React.FC<InstantGeneratorProps> = ({ t }) => {
</div>
</motion.div>
</div>
{/* Leaderboard Ad */}
<div className="mt-16 max-w-4xl mx-auto">
<div className="text-center text-xs text-gray-400 mb-2 uppercase tracking-wider">Advertisement</div>
<AdBanner
dataAdSlot="leaderboard-slot-id"
dataAdFormat="auto"
className="bg-white rounded-xl p-4 border border-gray-100 shadow-sm min-h-[90px]"
/>
</div>
</div>
</section>
);

View File

@ -1,11 +1,15 @@
import Link from 'next/link';
import en from '@/i18n/en.json';
interface FooterProps {
variant?: 'marketing' | 'dashboard';
t?: typeof en; // Optional translation object
}
export function Footer({ variant = 'marketing' }: FooterProps) {
export function Footer({ variant = 'marketing', t }: FooterProps) {
const isDashboard = variant === 'dashboard';
// Fallback to English if no translation is provided or if keys are missing
const translations = t?.footer || en.footer;
return (
<footer className={`${isDashboard ? 'bg-gray-50 text-gray-600 border-t border-gray-200 mt-12' : 'bg-gray-900 text-white mt-20'} py-12`}>
@ -17,34 +21,34 @@ export function Footer({ variant = 'marketing' }: FooterProps) {
<span className={`text-xl font-bold ${isDashboard ? 'text-gray-900' : ''}`}>QR Master</span>
</Link>
<p className={isDashboard ? 'text-gray-500' : 'text-gray-400'}>
Create custom QR codes in seconds with advanced tracking and analytics.
{translations.tagline}
</p>
</div>
<div>
<h3 className={`font-semibold mb-4 ${isDashboard ? 'text-gray-900' : ''}`}>Product</h3>
<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'}>Features</Link></li>
<li><Link href="/#pricing" className={isDashboard ? 'hover:text-primary-600' : 'hover:text-white'}>Pricing</Link></li>
<li><Link href="/faq" className={isDashboard ? 'hover:text-primary-600' : 'hover:text-white'}>FAQ</Link></li>
<li><Link href="/blog" className={isDashboard ? 'hover:text-primary-600' : 'hover:text-white'}>Blog</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="/faq" className={isDashboard ? 'hover:text-primary-600' : 'hover:text-white'}>{translations.faq}</Link></li>
<li><Link href="/blog" className={isDashboard ? 'hover:text-primary-600' : 'hover:text-white'}>{translations.blog}</Link></li>
</ul>
</div>
<div>
<h3 className={`font-semibold mb-4 ${isDashboard ? 'text-gray-900' : ''}`}>Resources</h3>
<h3 className={`font-semibold mb-4 ${isDashboard ? 'text-gray-900' : ''}`}>{translations.resources}</h3>
<ul className={`space-y-2 ${isDashboard ? 'text-gray-500' : 'text-gray-400'}`}>
<li><Link href="/#pricing" className={isDashboard ? 'hover:text-primary-600' : 'hover:text-white'}>Full Pricing</Link></li>
<li><Link href="/faq" className={isDashboard ? 'hover:text-primary-600' : 'hover:text-white'}>All Questions</Link></li>
<li><Link href="/blog" className={isDashboard ? 'hover:text-primary-600' : 'hover:text-white'}>All Articles</Link></li>
<li><Link href="/signup" className={isDashboard ? 'hover:text-primary-600' : 'hover:text-white'}>Get Started</Link></li>
<li><Link href="/#pricing" className={isDashboard ? 'hover:text-primary-600' : 'hover:text-white'}>{translations.full_pricing}</Link></li>
<li><Link href="/faq" className={isDashboard ? 'hover:text-primary-600' : 'hover:text-white'}>{translations.all_questions}</Link></li>
<li><Link href="/blog" className={isDashboard ? 'hover:text-primary-600' : 'hover:text-white'}>{translations.all_articles}</Link></li>
<li><Link href="/signup" className={isDashboard ? 'hover:text-primary-600' : 'hover:text-white'}>{translations.get_started}</Link></li>
</ul>
</div>
<div>
<h3 className={`font-semibold mb-4 ${isDashboard ? 'text-gray-900' : ''}`}>Legal</h3>
<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'}>Privacy Policy</Link></li>
<li><Link href="/privacy" className={isDashboard ? 'hover:text-primary-600' : 'hover:text-white'}>{translations.privacy_policy}</Link></li>
</ul>
</div>
@ -56,16 +60,17 @@ export function Footer({ variant = 'marketing' }: FooterProps) {
href="/newsletter"
className="text-[6px] text-gray-700 opacity-[0.03] hover:opacity-100 hover:text-white transition-opacity duration-300"
>
<span className="sr-only">Newsletter signup</span>
<span className="sr-only">{translations.newsletter}</span>
</Link>
) : (
<div></div>
)}
<p>&copy; 2025 QR Master. All rights reserved.</p>
<p>&copy; 2025 {translations.rights_reserved}</p>
<div className="w-12"></div>
</div>
</div>
</footer>
);
}

View File

@ -9,7 +9,10 @@
"create_qr": "QR erstellen",
"bulk_creation": "Massen-Erstellung",
"analytics": "Analytik",
"settings": "Einstellungen"
"settings": "Einstellungen",
"cta": "Kostenlos loslegen",
"tools": "Kostenlose Tools",
"all_free": "Alle Generatoren sind 100% kostenlos"
},
"hero": {
"badge": "Kostenloser QR-Code-Generator",
@ -64,6 +67,8 @@
"demo_note": "Dies ist ein Demo-QR-Code"
},
"static_vs_dynamic": {
"title": "Warum dynamische QR-Codes Geld sparen",
"description": "Hören Sie auf, Materialien neu zu drucken. Ändern Sie Zielorte sofort und verfolgen Sie jeden Scan.",
"static": {
"title": "Statische QR-Codes",
"subtitle": "Immer kostenlos",
@ -97,6 +102,10 @@
"title": "Vollständige Anpassung",
"description": "Branden Sie Ihre QR-Codes mit individuellen Farben, Logos und Styling-Optionen."
},
"unlimited": {
"title": "Unbegrenzte statische QR-Codes",
"description": "Erstellen Sie so viele statische QR-Codes wie Sie möchten. Für immer kostenlos, ohne Limits."
},
"bulk": {
"title": "Bulk-Operationen",
"description": "Erstellen Sie hunderte von QR-Codes auf einmal mit CSV-Import und Batch-Verarbeitung."
@ -370,5 +379,22 @@
"loading": "Lädt...",
"error": "Ein Fehler ist aufgetreten",
"success": "Erfolgreich!"
},
"footer": {
"product": "Produkt",
"features": "Funktionen",
"pricing": "Preise",
"faq": "FAQ",
"blog": "Blog",
"resources": "Ressourcen",
"full_pricing": "Alle Preise",
"all_questions": "Alle Fragen",
"all_articles": "Alle Artikel",
"get_started": "Loslegen",
"legal": "Rechtliches",
"privacy_policy": "Datenschutzerklärung",
"tagline": "Erstellen Sie individuelle QR-Codes in Sekunden mit erweitertem Tracking und Analytik.",
"newsletter": "Newsletter Anmeldung",
"rights_reserved": "QR Master. Alle Rechte vorbehalten."
}
}

View File

@ -10,7 +10,9 @@
"bulk_creation": "Bulk Creation",
"analytics": "Analytics",
"settings": "Settings",
"cta": "Get Started Free"
"cta": "Get Started Free",
"tools": "Free Tools",
"all_free": "All generators are 100% free"
},
"hero": {
"badge": "Free QR Code Generator",
@ -375,5 +377,22 @@
"loading": "Loading...",
"error": "An error occurred",
"success": "Success!"
},
"footer": {
"product": "Product",
"features": "Features",
"pricing": "Pricing",
"faq": "FAQ",
"blog": "Blog",
"resources": "Resources",
"full_pricing": "Full Pricing",
"all_questions": "All Questions",
"all_articles": "All Articles",
"get_started": "Get Started",
"legal": "Legal",
"privacy_policy": "Privacy Policy",
"tagline": "Create custom QR codes in seconds with advanced tracking and analytics.",
"newsletter": "Newsletter signup",
"rights_reserved": "QR Master. All rights reserved."
}
}

View File

@ -15,6 +15,7 @@ export function middleware(req: NextRequest) {
'/privacy',
'/newsletter',
'/tools',
'/qr-code-erstellen',
];
// Check if path is public