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 */}
`, }, @@ -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/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', + }, }, }, ],