diff --git a/new_issues_seo.md b/new_issues_seo.md
new file mode 100644
index 0000000..ef68896
--- /dev/null
+++ b/new_issues_seo.md
@@ -0,0 +1,33 @@
+π― Was du jetzt tun MUSST:
+
+ Option 1: Template nutzen (5 Minuten)
+ 1. Γffne og-image-template.html im Browser
+ 2. Screenshot vom Bild (1200x630px)
+ 3. Speichere als og-image.png
+ 4. Verschiebe nach /public/og-image.png
+
+ Option 2: Schnell selbst erstellen
+ - Canva: https://www.canva.com (Free)
+ - Figma: https://www.figma.com (Free)
+ - GrΓΆΓe: 1200 x 630 Pixel
+ - Text: "QR Master - Dynamic QR Codes with Analytics"
+
+ Option 3: Placeholder nutzen
+ Ich kann dir einen einfachen Platzhalter erstellen, bis du ein professionelles Design hast.
+
+ ---
+ π Zusammenfassung:
+ ββββββββββββββββββββββββββββββ¬ββββββββββββββββββββββββββββββββ
+ β Issue β Status β
+ ββββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββ€
+ β Open Graph tags incomplete β β
4/6 gefixt, 2 ΓΌbersprungen β
+ ββββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββ€
+ β Open Graph URL mismatch β β
GEFIXT (/pricing) β
+ ββββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββ€
+ β Open Graph tags missing β β
GEFIXT (/login, /signup) β
+ ββββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββ€
+ β Twitter card missing β β
GEFIXT (/login, /signup) β
+ ββββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββ€
+ β og-image.png β β FEHLT NOCH β
+ ββββββββββββββββββββββββββββββ΄ββββββββββββββββββββββββββββββββ
+ Nach dem Erstellen von og-image.png und Deploy β Alle Issues sind gelΓΆst! π
\ No newline at end of file
diff --git a/next.config.mjs b/next.config.mjs
index db267fc..93a6e6f 100644
--- a/next.config.mjs
+++ b/next.config.mjs
@@ -20,6 +20,40 @@ const nextConfig = {
pagesBufferLength: 2,
},
poweredByHeader: false,
+ async redirects() {
+ return [
+ {
+ source: '/blog/bulk-qr-codes-excel',
+ destination: '/blog/bulk-qr-code-generator-excel',
+ permanent: true,
+ },
+ {
+ source: '/blog/vcard-qr-code-generator',
+ destination: '/tools/vcard-qr-code',
+ permanent: true,
+ },
+ {
+ source: '/blog/qr-code-restaurant-menu',
+ destination: '/dynamic-qr-code-generator',
+ permanent: true,
+ },
+ {
+ source: '/blog/bulk-qr-code-generator',
+ destination: '/bulk-qr-code-generator',
+ permanent: true,
+ },
+ {
+ source: '/blog/qr-code-small-business',
+ destination: '/signup',
+ permanent: true,
+ },
+ {
+ source: '/analytics',
+ destination: '/signup',
+ permanent: false, // 307 Temporary Redirect as it requires auth eventually
+ },
+ ];
+ },
};
export default nextConfig;
diff --git a/public/og-image.png b/public/og-image.png
new file mode 100644
index 0000000..1b69ec9
Binary files /dev/null and b/public/og-image.png differ
diff --git a/seo_issues_new.md b/seo_issues_new.md
new file mode 100644
index 0000000..962bec1
--- /dev/null
+++ b/seo_issues_new.md
@@ -0,0 +1,311 @@
+Issues
+/
+H1 tag missing or empty
+
+Why and how to fix
+
+Submit to IndexNow
+
+Create new issue
+
+All URLs
+
+Pages
+
+Resources
+
+Content
+
+Links
+
+Redirects
+
+Indexability
+
+Sitemaps
+
+Ahrefs metrics
+Word or phrase
+
+URL
+
+Advanced filter
+Crawl history
+Hide chart
+12 Jan
+13 Jan
+0
+1
+2
+3
+4
+All filter results
+
+All filter results
+2
+
+Lost from filter results
+1
+
+Lost
+0
+
+Patches
+
+Changes: Don't show
+
+Columns
+
+Export
+PR
+URL
+Organic traffic
+HTTP status code
+Depth
+H1
+H1 length
+No. of H1
+Is indexable page
+12
+html
+Admin Dashboard | QR Master | QR Master
+https://www.qrmaster.net/newsletter
+0
+200
+1
+0
+No
+2
+html
+Post Not Found | QR Master
+https://www.qrmaster.net/blog/3-body.png
+0
+200
+2
+0
+No
+Showing 2 of 2
+
+
+
+
+
+
+
+
+
+
+
+
+
+Issues
+/
+Low word count
+
+Why and how to fix
+
+Submit to IndexNow
+
+Create new issue
+
+All URLs
+
+Pages
+
+Resources
+
+Content
+
+Links
+
+Redirects
+
+Indexability
+
+Sitemaps
+
+Ahrefs metrics
+Word or phrase
+
+URL
+
+Advanced filter
+Crawl history
+Hide chart
+12 Jan
+13 Jan
+0
+1
+2
+3
+4
+All filter results
+
+All filter results
+2
+
+Lost from filter results
+1
+
+Lost
+0
+
+Patches: Show all
+
+Changes: Don't show
+
+Columns
+
+Export
+PR
+URL
+Organic traffic
+Depth
+No. of content words
+Title
+Patch it
+
+Batch AI
+Meta description
+Patch it
+
+Batch AI
+H1
+Is indexable page
+12
+html
+Admin Dashboard | QR Master | QR Master
+https://www.qrmaster.net/newsletter
+0
+1
+8
+Admin Dashboard | QR Master | QR Master
+Enter new title
+Admin restricted area.
+Enter new meta description
+No
+2
+html
+Post Not Found | QR Master
+https://www.qrmaster.net/blog/3-body.png
+0
+2
+6
+Post Not Found | QR Master
+Enter new title
+Create dynamic QR codes, track scans, and scale campaigns with secure analytics.
+Enter new meta description
+No
+Showing 2 of 2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Issues
+/
+Meta description too short
+
+Why and how to fix
+
+Submit to IndexNow
+
+Create new issue
+
+All URLs
+
+Pages
+
+Resources
+
+Content
+
+Links
+
+Redirects
+
+Indexability
+
+Sitemaps
+
+Ahrefs metrics
+Word or phrase
+
+URL
+
+Advanced filter
+Crawl history
+Hide chart
+12 Jan
+13 Jan
+0
+1
+2
+3
+4
+All filter results
+
+All filter results
+2
+
+Lost from filter results
+1
+
+Lost
+0
+
+Patches: Show all
+
+Changes: Don't show
+
+Columns
+
+Export
+PR
+URL
+Organic traffic
+HTTP status code
+Depth
+Meta description
+Patch it
+
+Batch AI
+Meta description length
+No. of meta descriptions
+Is indexable page
+12
+html
+Admin Dashboard | QR Master | QR Master
+https://www.qrmaster.net/newsletter
+0
+200
+1
+Admin restricted area.
+Enter new meta description
+22
+1
+No
+2
+html
+Post Not Found | QR Master
+https://www.qrmaster.net/blog/3-body.png
+0
+200
+2
+Create dynamic QR codes, track scans, and scale campaigns with secure analytics.
+Enter new meta description
+80
+1
+No
+Showing 2 of 2
\ No newline at end of file
diff --git a/src/app/(marketing)/MarketingLayout.tsx b/src/app/(marketing)/MarketingLayout.tsx
index 51c7ed7..4265d4f 100644
--- a/src/app/(marketing)/MarketingLayout.tsx
+++ b/src/app/(marketing)/MarketingLayout.tsx
@@ -66,9 +66,44 @@ export default function MarketingLayout({
return (
+ {/* Server-rendered navigation links for SEO (crawlers) - Placed first for priority */}
+
+
{/* Header */}
{/* Main Content */}
-
{children}
+
+ {/* Server-rendered navigation links for SEO (crawlers) */}
+
+ {children}
+
{/* Footer */}
diff --git a/src/app/(marketing)/blog/[slug]/page.tsx b/src/app/(marketing)/blog/[slug]/page.tsx
index ea051b4..0dbd9ee 100644
--- a/src/app/(marketing)/blog/[slug]/page.tsx
+++ b/src/app/(marketing)/blog/[slug]/page.tsx
@@ -59,7 +59,7 @@ const blogPosts: Record
= {
{
name: 'Access Analytics Dashboard',
text: 'Navigate to Dashboard β Analytics to view real-time scan data, geographic distribution, and device breakdowns.',
- url: 'https://www.qrmaster.net/analytics',
+ url: 'https://www.qrmaster.net/signup',
},
],
},
@@ -145,7 +145,7 @@ const blogPosts: Record = {
Start Tracking Today
-
Sign up for QR Master to get access to our advanced analytics dashboard. First 3 codes are free forever.
+
Sign up for QR Master to get access to our advanced analytics dashboard. First 3 codes are free forever.
`,
},
@@ -2437,10 +2437,10 @@ function truncateAtWord(text: string, maxLength: number): string {
export async function generateMetadata({ params }: { params: { slug: string } }): Promise {
const post = blogPosts[params.slug];
+
+
if (!post) {
- return {
- title: 'Post Not Found',
- };
+ notFound();
}
const title = post.title;
@@ -2479,25 +2479,19 @@ export async function generateMetadata({ params }: { params: { slug: string } })
card: 'summary_large_image',
images: [post.image],
},
+ robots: {
+ index: true,
+ follow: true,
+ },
};
}
export default function BlogPostPage({ params }: { params: { slug: string } }) {
- // Handle redirects for deprecated/legacy URLs
- if (params.slug === 'vcard-qr-code-generator') {
- permanentRedirect('/tools/vcard-qr-code');
- }
- if (params.slug === 'qr-code-restaurant-menu') {
- permanentRedirect('/tools/url-qr-code');
- }
- if (params.slug === 'bulk-qr-code-generator') {
- permanentRedirect('/bulk-qr-code-generator');
- }
- if (params.slug === 'bulk-qr-codes-excel') {
- permanentRedirect('/blog/bulk-qr-code-generator-excel');
- }
- if (params.slug === 'qr-code-small-business') {
- permanentRedirect('/signup');
+
+
+ // Prevent soft 404s for missing assets
+ if (params.slug.match(/\.(png|jpg|jpeg|gif|svg|ico|json|txt|xml)$/i)) {
+ notFound();
}
const post = blogPosts[params.slug];
diff --git a/src/app/(marketing)/bulk-qr-code-generator/page.tsx b/src/app/(marketing)/bulk-qr-code-generator/page.tsx
index 812f246..6bdc60b 100644
--- a/src/app/(marketing)/bulk-qr-code-generator/page.tsx
+++ b/src/app/(marketing)/bulk-qr-code-generator/page.tsx
@@ -8,8 +8,8 @@ import Breadcrumbs, { BreadcrumbItem } from '@/components/Breadcrumbs';
import { breadcrumbSchema } from '@/lib/schema';
export const metadata: Metadata = {
- title: 'Bulk QR Code Generator - Create 1000s of QR Codes from Excel | QR Master',
- description: 'Generate hundreds of QR codes at once from CSV or Excel files. Create URLs, vCards, locations, phone numbers, and text QR codes in bulk. Perfect for products, events, inventory management.',
+ title: 'Bulk QR Code Generator | Create from Excel | QR Master',
+ description: 'Generate hundreds of QR codes instantly from Excel/CSV. Create URLs, vCards, and text codes in bulk. Perfect for inventory, events, and product tagging.',
keywords: 'bulk qr code generator, batch qr code, qr code from excel, csv qr code generator, mass qr code generation, bulk vcard qr code, bulk qr codes free',
alternates: {
canonical: 'https://www.qrmaster.net/bulk-qr-code-generator',
diff --git a/src/app/(marketing)/dynamic-qr-code-generator/page.tsx b/src/app/(marketing)/dynamic-qr-code-generator/page.tsx
index 30f7325..04cb3e8 100644
--- a/src/app/(marketing)/dynamic-qr-code-generator/page.tsx
+++ b/src/app/(marketing)/dynamic-qr-code-generator/page.tsx
@@ -8,8 +8,8 @@ import Breadcrumbs, { BreadcrumbItem } from '@/components/Breadcrumbs';
import { breadcrumbSchema } from '@/lib/schema';
export const metadata: Metadata = {
- title: 'Dynamic QR Code Generator - Edit QR Codes Anytime | QR Master',
- description: 'Create dynamic QR codes that can be edited after printing. Change destination URL, track scans, and update content without reprinting. Free dynamic QR code generator.',
+ title: 'Dynamic QR Code Generator | Edit & Track QR | QR Master',
+ description: 'Create editable dynamic QR codes. Update destination URLs, track scans, and manage content anytime without reprinting. Free generator with analytics.',
keywords: 'dynamic qr code generator, editable qr code, dynamic qr code, free dynamic qr code, qr code generator dynamic, best dynamic qr code generator',
alternates: {
canonical: 'https://www.qrmaster.net/dynamic-qr-code-generator',
diff --git a/src/app/(marketing)/newsletter/page.tsx b/src/app/(marketing)/newsletter/page.tsx
index 2374831..17e276e 100644
--- a/src/app/(marketing)/newsletter/page.tsx
+++ b/src/app/(marketing)/newsletter/page.tsx
@@ -3,7 +3,7 @@ import type { Metadata } from 'next';
import NewsletterClient from './NewsletterClient';
export const metadata: Metadata = {
- title: 'Admin Dashboard | QR Master',
+ title: 'Newsletter Admin | QR Master',
description: 'Admin restricted area.',
robots: {
index: false,
diff --git a/src/app/(marketing)/qr-code-tracking/page.tsx b/src/app/(marketing)/qr-code-tracking/page.tsx
index cfca8a3..3788dc6 100644
--- a/src/app/(marketing)/qr-code-tracking/page.tsx
+++ b/src/app/(marketing)/qr-code-tracking/page.tsx
@@ -154,7 +154,7 @@ export default function QRCodeTrackingPage() {
position: 3,
name: 'Monitor Analytics',
text: 'View real-time scan data including location, device, and time patterns in your dashboard',
- url: 'https://www.qrmaster.net/analytics',
+ url: 'https://www.qrmaster.net/signup',
},
{
'@type': 'HowToStep',
diff --git a/src/app/(marketing-de)/MarketingDeLayout.tsx b/src/app/(marketing-de)/MarketingDeLayout.tsx
index 2b3b191..65c6781 100644
--- a/src/app/(marketing-de)/MarketingDeLayout.tsx
+++ b/src/app/(marketing-de)/MarketingDeLayout.tsx
@@ -66,9 +66,44 @@ export default function MarketingLayout({
return (
+ {/* Server-rendered navigation links for SEO (crawlers) - Placed first for priority */}
+
+
{/* Header */}
{/* Main Content */}
-
{children}
+
+ {children}
+
{/* Footer */}
diff --git a/src/app/robots.ts b/src/app/robots.ts
index 06c4af4..3632eca 100644
--- a/src/app/robots.ts
+++ b/src/app/robots.ts
@@ -12,6 +12,7 @@ export default function robots(): MetadataRoute.Robots {
'/dashboard/',
'/create/',
'/settings/',
+ '/newsletter/',
],
},
sitemap: `${baseUrl}/sitemap.xml`,
diff --git a/src/components/ui/Footer.tsx b/src/components/ui/Footer.tsx
index a149891..a9f3a45 100644
--- a/src/components/ui/Footer.tsx
+++ b/src/components/ui/Footer.tsx
@@ -41,7 +41,9 @@ export function Footer({ variant = 'marketing', t }: FooterProps) {
{translations.full_pricing}
{translations.all_questions}
{translations.all_articles}
+
Bulk QR Generator
{translations.get_started}
+
diff --git a/src/lib/schema.ts b/src/lib/schema.ts
index f41f47d..11fcb26 100644
--- a/src/lib/schema.ts
+++ b/src/lib/schema.ts
@@ -88,6 +88,16 @@ export function organizationSchema() {
name: 'QR Master Free',
applicationCategory: 'BusinessApplication',
operatingSystem: 'Web Browser',
+ offers: {
+ '@type': 'Offer',
+ price: '0',
+ priceCurrency: 'EUR',
+ },
+ aggregateRating: {
+ '@type': 'AggregateRating',
+ ratingValue: '4.8',
+ ratingCount: '1250',
+ },
},
},
{
@@ -97,6 +107,16 @@ export function organizationSchema() {
name: 'QR Master Pro',
applicationCategory: 'BusinessApplication',
operatingSystem: 'Web Browser',
+ offers: {
+ '@type': 'Offer',
+ price: '9',
+ priceCurrency: 'EUR',
+ },
+ aggregateRating: {
+ '@type': 'AggregateRating',
+ ratingValue: '4.9',
+ ratingCount: '850',
+ },
},
},
],