diff --git a/ahrefs-findings.md b/ahrefs-findings.md new file mode 100644 index 0000000..e0af43f --- /dev/null +++ b/ahrefs-findings.md @@ -0,0 +1,2717 @@ +hier sind die findings von Ahrefs für QRMaster.net +guck dir hier das an, ich paste alles rein und du erstellst ein ausführliches md file im root. mit allen problemen und verbesserungen, wenn du schon was verbessert hast musst du es nicht einfügen + +Overview +How to use + +Print to PDF +Crawled URLs distribution + +33 + +Internal +24 + +Resources +9 +Crawl status of links found + +131 + +Crawled +127 + +Uncrawled +4 +Health Score +63 +Fair +Health Score reflects the proportion of internal URLs on your site that don't have errors +12 Jan +0 +50 +100 +Issues distribution +123 + +Errors +18 + +Warnings +52 + +Notices +53 +Error distribution +35 + +URLs without errors +22 + +URLs with errors +13 +Top Issues + +Export all issues +Issue +Crawled +Change +Added +New +Removed +Missing +Page has no outgoing links +9 +— +— +— +— +— + + +Duplicate pages without canonical +4 +— +— +— +— +— + + +Image file size too large +4 +— +— +— +— +— + + +Hreflang and HTML lang mismatch +1 +— +— +— +— +— + + +H1 tag missing or empty +9 +— +— +— +— +— + + +Low word count +9 +— +— +— +— +— + + +Meta description too short +8 +— +— +— +— +— + + +Page has links to redirect +7 +— +— +— +— +— + + +3XX redirect +6 +— +— +— +— +— + + +Slow page +5 +— +— +— +— +— + + + +View all issues +HTTP status codes distribution + +Success (2xx) +29 + +Redirect (3xx) +6 +AI content level distribution +Disabled +NO DATA +HTTP status codes by depth level + +0 +1 +2 +0 +4 +8 +12 +16 + +Success (2xx) + +Redirect (3xx) +Bulk export +Internal URLs All crawled internal URLs. Includes non-200 pages and resources. 35 +Export CSV + +View +Uncrawled links Links to URLs that our crawler didn't crawl. This could be due to your project settings or website restrictions like robots.txt. 317 +Export CSV + +View +Anchor texts Anchor texts of all hyperlinks found during the crawl. 131 +Export CSV + +View +Image references without alt texts All image references without alt texts found during the crawl. 0 +Export CSV + +View +Links to URLs blocked by robots.txt Links to all URLs that our crawler could not access because of instructions in robots.txt. 312 +Export CSV + +View +Links to 4xx (Client error) URLs Links to URLs returning client error codes, which means that there was a problem with the request. 0 +Export CSV + +View + + + + + + + +Issues +/ +Noindex page + +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 +1 result + +Patches: Show all + +Changes: Don't show + +Columns + +Export +PR +URL +Organic traffic +HTTP status code +Is indexable page +Is noindex +Patch it +Is nofollow +Patch it +Meta robots +Robots information in HTTP headers +No. of all inlinks +First found at +2 +html +Post Not Found | QR Master +https://www.qrmaster.net/blog/bulk-qr-codes-excel +0 +200 +No +Yes +Change noindex +No +Change nofollow +follow +index +noindex +1 +https://www.qrmaster.net/blog/qr-code-print-size-guide + + + + + +1 result + +Patches: Show all + +Changes: Don't show + +Columns + +Export +PR +URL +Organic traffic +HTTP status code +Is indexable page +Is noindex +Patch it +Is nofollow +Patch it +Meta robots +Robots information in HTTP headers +No. of all inlinks +First found at +2 +html +Post Not Found | QR Master +https://www.qrmaster.net/blog/bulk-qr-codes-excel +0 +200 +No +Yes +Change noindex +No +Change nofollow +follow +index +noindex +1 +https://www.qrmaster.net/blog/qr-code-print-size-guide + + + + +9 results + +Patches + +Changes: Don't show + +Columns + +Export +PR +URL +Organic traffic +HTTP status code +Content type +Depth +No. of internal outlinks +No. of external outlinks +40 +html +QR Master – Smart QR Generator & Analytics +https://www.qrmaster.net/signup +0 +200 +text/html; charset=utf-8 +1 +0 +0 +37 +html +QR Master: Dynamic QR Generator | QR Master +https://www.qrmaster.net/ +0 +200 +text/html; charset=utf-8 +0 +0 +0 +32 +html +QR Master – Smart QR Generator & Analytics +https://www.qrmaster.net/login +0 +200 +text/html; charset=utf-8 +1 +0 +0 +32 +html +QR Insights: Latest QR Strategies | QR Master +https://www.qrmaster.net/blog +0 +200 +text/html; charset=utf-8 +0 +0 +0 +32 +html +QR Master – Smart QR Generator & Analytics +https://www.qrmaster.net/newsletter +0 +200 +text/html; charset=utf-8 +1 +0 +0 +32 +html +Privacy Policy | QR Master | QR Master +https://www.qrmaster.net/privacy +0 +200 +text/html; charset=utf-8 +1 +0 +0 +32 +html +QR Master FAQ: Dynamic & Bulk QR | QR Master +https://www.qrmaster.net/faq +0 +200 +text/html; charset=utf-8 +0 +0 +0 +28 +html +QR Master – Smart QR Generator & Analytics +https://www.qrmaster.net/pricing +0 +200 +text/html; charset=utf-8 +0 +0 +0 +22 +html +QR Code Erstellen – Kostenlos & Sofort | QR Master | QR Master +https://www.qrmaster.net/qr-code-erstellen +0 +200 +text/html; charset=utf-8 +1 +0 +0 + + + + + + + + +Issues +/ +Page has links to redirect + +Why and how to fix + +Submit to IndexNow + +Create new issue + +Pages with links to redirect +7 + +Redirected links +9 + +All URLs + +Pages + +Resources + +Content + +Links + +Redirects + +Indexability + +Sitemaps + +Ahrefs metrics +Word or phrase + +URL + +Advanced filter +7 results + +Patches + +Changes: Don't show + +Columns + +Export +PR +URL +Organic traffic +HTTP status code +Content type +Depth +Internal outlinks to 3xx +No. of internal outlinks to 3xx +External outlinks to 3xx +No. of external outlinks to 3xx +31 +html +Free vCard QR Code Generator: Digital Business Cards Made | QR Master +https://www.qrmaster.net/blog/vcard-qr-code-generator +0 +200 +text/html; charset=utf-8 +1 +https://www.qrmaster.net/create +307 +1 +0 +31 +html +How to Create a QR Code for Restaurant Menu: Complete 2025 | QR Master +https://www.qrmaster.net/blog/qr-code-restaurant-menu +0 +200 +text/html; charset=utf-8 +1 +https://www.qrmaster.net/dynamic-qr-code-generator +307 +https://www.qrmaster.net/qr-code-tracking +307 +2 +0 +31 +html +Dynamic vs Static QR Codes: Which Should You Use? Complete | QR Master +https://www.qrmaster.net/blog/dynamic-vs-static-qr-codes +0 +200 +text/html; charset=utf-8 +1 +https://www.qrmaster.net/dynamic-qr-code-generator +307 +1 +0 +31 +html +How to Generate Bulk QR Codes from Excel: Complete Tutorial | QR Master +https://www.qrmaster.net/blog/bulk-qr-code-generator-excel +0 +200 +text/html; charset=utf-8 +1 +https://www.qrmaster.net/bulk-qr-code-generator +307 +1 +0 +31 +html +QR Code Print Size Guide: Minimum Sizes for Every Use Case | QR Master +https://www.qrmaster.net/blog/qr-code-print-size-guide +0 +200 +text/html; charset=utf-8 +1 +https://www.qrmaster.net/create +307 +1 +0 +31 +html +Best QR Code Generator for Small Business: 2025 Complete | QR Master +https://www.qrmaster.net/blog/qr-code-small-business +0 +200 +text/html; charset=utf-8 +1 +https://www.qrmaster.net/analytics +307 +https://www.qrmaster.net/create +307 +2 +0 +31 +html +QR Code Tracking: Complete Guide 2025 (Free Tools & Best | QR Master +https://www.qrmaster.net/blog/qr-code-tracking-guide-2025 +0 +200 +text/html; charset=utf-8 +1 +https://www.qrmaster.net/dynamic-qr-code-generator +307 +1 +0 + + + + + +ich copy paste jetzt von oben nach unten rein + + + + + + +Issues +/ +Page has no outgoing links + +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 +1 result + +Patches + +Changes: Don't show + +Columns + +Export +PR +URL +Organic traffic +HTTP status code +Content type +Depth +No. of internal outlinks +No. of external outlinks +2 +html +Post Not Found | QR Master +https://www.qrmaster.net/blog/bulk-qr-codes-excel +0 +200 +text/html; charset=utf-8 +2 +0 +0 + + + + + + +Issues +/ +Page has only one dofollow incoming internal link + +Why and how to fix + +Submit to IndexNow + +Create new issue + +Pages with only one dofollow inlink +1 + +Links to those pages +1 + +All URLs + +Pages + +Resources + +Content + +Links + +Redirects + +Indexability + +Sitemaps + +Ahrefs metrics +Word or phrase + +URL + +Advanced filter +1 result + +Patches + +Changes: Don't show + +Columns + +Export +PR +URL +Organic traffic +HTTP status code +Content type +Depth +No. of inlinks dofollow +No. of inlinks nofollow +No. of href inlinks +2 +html +Post Not Found | QR Master +https://www.qrmaster.net/blog/bulk-qr-codes-excel +0 +200 +text/html; charset=utf-8 +2 +1 +0 +1 + + + + + + + +Issues +/ +3XX redirect + +Why and how to fix + +Submit to IndexNow + +Create new issue + +3XX redirects +6 + +Links to 3XX redirect +9 + +All URLs + +Pages + +Resources + +Content + +Links + +Redirects + +Indexability + +Sitemaps + +Ahrefs metrics +Word or phrase + +URL + +Advanced filter +6 results + +Patches: Show all + +Changes: Don't show + +Columns + +Export +PR +URL +Organic traffic +HTTP status code +Redirect URL +Patch it +Redirect chain URLs +Is redirect loop +No. of all inlinks +No. of redirect inlinks +First found at +5 +txt +307 Temporary redirect +https://www.qrmaster.net/dynamic-qr-code-generator +0 +307 +https://www.qrmaster.net/signup +200 +Enter new redirect URL +https://www.qrmaster.net/signup +200 +No +3 +0 +https://www.qrmaster.net/blog/dynamic-vs-static-qr-codes +5 +txt +307 Temporary redirect +https://www.qrmaster.net/create +0 +307 +https://www.qrmaster.net/signup +200 +Enter new redirect URL +https://www.qrmaster.net/signup +200 +No +3 +0 +https://www.qrmaster.net/blog/vcard-qr-code-generator +2 +txt +307 Temporary redirect +https://www.qrmaster.net/qr-code-tracking +0 +307 +https://www.qrmaster.net/signup +200 +Enter new redirect URL +https://www.qrmaster.net/signup +200 +No +1 +0 +https://www.qrmaster.net/blog/qr-code-restaurant-menu +2 +txt +307 Temporary redirect +https://www.qrmaster.net/bulk-qr-code-generator +0 +307 +https://www.qrmaster.net/signup +200 +Enter new redirect URL +https://www.qrmaster.net/signup +200 +No +1 +0 +https://www.qrmaster.net/blog/bulk-qr-code-generator-excel +2 +txt +307 Temporary redirect +https://www.qrmaster.net/analytics +0 +307 +https://www.qrmaster.net/signup +200 +Enter new redirect URL +https://www.qrmaster.net/signup +200 +No +1 +0 +https://www.qrmaster.net/blog/qr-code-small-business +0 +308 Permanent redirect +http://www.qrmaster.net/ +0 +308 +https://www.qrmaster.net/ +200 +Enter new redirect URL +https://www.qrmaster.net/ +200 +No +0 +0 + + + + + + + +Issues +/ +HTTP to HTTPS redirect + +Why and how to fix + +Submit to IndexNow + +Create new issue + +HTTP to HTTPS redirects +1 + +Links to HTTP redirect +0 + +All URLs + +Pages + +Resources + +Content + +Links + +Redirects + +Indexability + +Sitemaps + +Ahrefs metrics +Word or phrase + +URL + +Advanced filter +1 result + +Patches + +Changes: Don't show + +Columns + +Export +PR +URL +Organic traffic +HTTP status code +Redirect chain URLs +Is redirect loop +No. of all inlinks +No. of redirect inlinks +First found at +0 +308 Permanent redirect +http://www.qrmaster.net/ +0 +308 +https://www.qrmaster.net/ +200 +No +0 +0 + + + + + + + +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 +9 results + +Patches + +Changes: Don't show + +Columns + +Export +PR +URL +Organic traffic +HTTP status code +Depth +H1 +H1 length +No. of H1 +Is indexable page +40 +html +QR Master – Smart QR Generator & Analytics +https://www.qrmaster.net/signup +0 +200 +1 +0 +Yes +37 +html +QR Master: Dynamic QR Generator | QR Master +https://www.qrmaster.net/ +0 +200 +0 +0 +Yes +32 +html +QR Master – Smart QR Generator & Analytics +https://www.qrmaster.net/login +0 +200 +1 +0 +Yes +32 +html +QR Insights: Latest QR Strategies | QR Master +https://www.qrmaster.net/blog +0 +200 +0 +0 +Yes +32 +html +QR Master – Smart QR Generator & Analytics +https://www.qrmaster.net/newsletter +0 +200 +1 +0 +Yes +32 +html +Privacy Policy | QR Master | QR Master +https://www.qrmaster.net/privacy +0 +200 +1 +0 +Yes +32 +html +QR Master FAQ: Dynamic & Bulk QR | QR Master +https://www.qrmaster.net/faq +0 +200 +0 +0 +Yes +28 +html +QR Master – Smart QR Generator & Analytics +https://www.qrmaster.net/pricing +0 +200 +0 +0 +Yes +22 +html +QR Code Erstellen – Kostenlos & Sofort | QR Master | QR Master +https://www.qrmaster.net/qr-code-erstellen +0 +200 +1 +0 +Yes + + + + + + + + + +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 +9 results + +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 +40 +html +QR Master – Smart QR Generator & Analytics +https://www.qrmaster.net/signup +0 +1 +8 +QR Master – Smart QR Generator & Analytics +Enter new title +Create dynamic QR codes, track scans, and scale campaigns with secure analytics. +Enter new meta description +Yes +37 +html +QR Master: Dynamic QR Generator | QR Master +https://www.qrmaster.net/ +0 +0 +8 +QR Master: Dynamic QR Generator | QR Master +Enter new title +Dynamic QR, branding, bulk generation & analytics for all campaigns. +Enter new meta description +Yes +32 +html +QR Master – Smart QR Generator & Analytics +https://www.qrmaster.net/login +0 +1 +8 +QR Master – Smart QR Generator & Analytics +Enter new title +Create dynamic QR codes, track scans, and scale campaigns with secure analytics. +Enter new meta description +Yes +32 +html +QR Insights: Latest QR Strategies | QR Master +https://www.qrmaster.net/blog +0 +0 +8 +QR Insights: Latest QR Strategies | QR Master +Enter new title +Expert guides on QR analytics, dynamic codes & smart marketing uses. +Enter new meta description +Yes +32 +html +QR Master – Smart QR Generator & Analytics +https://www.qrmaster.net/newsletter +0 +1 +8 +QR Master – Smart QR Generator & Analytics +Enter new title +Create dynamic QR codes, track scans, and scale campaigns with secure analytics. +Enter new meta description +Yes +32 +html +Privacy Policy | QR Master | QR Master +https://www.qrmaster.net/privacy +0 +1 +8 +Privacy Policy | QR Master | QR Master +Enter new title +Privacy Policy and data protection information for QR Master +Enter new meta description +Yes +32 +html +QR Master FAQ: Dynamic & Bulk QR | QR Master +https://www.qrmaster.net/faq +0 +0 +10 +QR Master FAQ: Dynamic & Bulk QR | QR Master +Enter new title +All answers: dynamic QR, security, analytics, bulk, events & print. +Enter new meta description +Yes +28 +html +QR Master – Smart QR Generator & Analytics +https://www.qrmaster.net/pricing +0 +0 +8 +QR Master – Smart QR Generator & Analytics +Enter new title +Create dynamic QR codes, track scans, and scale campaigns with secure analytics. +Enter new meta description +Yes +22 +html +QR Code Erstellen – Kostenlos & Sofort | QR Master | QR Master +https://www.qrmaster.net/qr-code-erstellen +0 +1 +13 +QR Code Erstellen – Kostenlos & Sofort | QR Master | QR Master +Enter new title +Erstellen Sie QR Codes kostenlos in Sekunden. Statische und dynamische QR-Codes mit Tracking, individuellem Branding und Massen-Erstellung. Für immer kostenlos. +Enter new meta description +Yes + + + + + + + + +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 +8 results + +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 +40 +html +QR Master – Smart QR Generator & Analytics +https://www.qrmaster.net/signup +0 +200 +1 +Create dynamic QR codes, track scans, and scale campaigns with secure analytics. +Enter new meta description +80 +1 +Yes +37 +html +QR Master: Dynamic QR Generator | QR Master +https://www.qrmaster.net/ +0 +200 +0 +Dynamic QR, branding, bulk generation & analytics for all campaigns. +Enter new meta description +68 +1 +Yes +32 +html +QR Master – Smart QR Generator & Analytics +https://www.qrmaster.net/login +0 +200 +1 +Create dynamic QR codes, track scans, and scale campaigns with secure analytics. +Enter new meta description +80 +1 +Yes +32 +html +QR Insights: Latest QR Strategies | QR Master +https://www.qrmaster.net/blog +0 +200 +0 +Expert guides on QR analytics, dynamic codes & smart marketing uses. +Enter new meta description +68 +1 +Yes +32 +html +QR Master – Smart QR Generator & Analytics +https://www.qrmaster.net/newsletter +0 +200 +1 +Create dynamic QR codes, track scans, and scale campaigns with secure analytics. +Enter new meta description +80 +1 +Yes +32 +html +Privacy Policy | QR Master | QR Master +https://www.qrmaster.net/privacy +0 +200 +1 +Privacy Policy and data protection information for QR Master +Enter new meta description +60 +1 +Yes +32 +html +QR Master FAQ: Dynamic & Bulk QR | QR Master +https://www.qrmaster.net/faq +0 +200 +0 +All answers: dynamic QR, security, analytics, bulk, events & print. +Enter new meta description +67 +1 +Yes +28 +html +QR Master – Smart QR Generator & Analytics +https://www.qrmaster.net/pricing +0 +200 +0 +Create dynamic QR codes, track scans, and scale campaigns with secure analytics. +Enter new meta description +80 +1 +Yes + + + + + + + +Issues +/ +Title too long + +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 +2 results + +Patches: Show all + +Changes: Don't show + +Columns + +Export +PR +URL +Organic traffic +HTTP status code +Depth +Title +Patch it + +Batch AI +Title length +No. of titles +Is indexable page +31 +html +QR Code Analytics: Track, Measure & Optimize - QR Analytics | QR Master +https://www.qrmaster.net/blog/qr-code-analytics +0 +200 +0 +QR Code Analytics: Track, Measure & Optimize - QR Analytics | QR Master +Enter new title +71 +1 +Yes +31 +html +How to Generate Bulk QR Codes from Excel: Complete Tutorial | QR Master +https://www.qrmaster.net/blog/bulk-qr-code-generator-excel +0 +200 +1 +How to Generate Bulk QR Codes from Excel: Complete Tutorial | QR Master +Enter new title +71 +1 +Yes + + + + + + +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 +1 result + +Patches + +Changes: Don't show + +Columns + +Export +PR +URL +Organic traffic +HTTP status code +Depth +H1 +H1 length +No. of H1 +Is indexable page +2 +html +Post Not Found | QR Master +https://www.qrmaster.net/blog/bulk-qr-codes-excel +0 +200 +2 +0 +No + + + + + + + +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 +1 result + +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 +2 +html +Post Not Found | QR Master +https://www.qrmaster.net/blog/bulk-qr-codes-excel +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 + + + + + + + +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 +1 result + +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 +2 +html +Post Not Found | QR Master +https://www.qrmaster.net/blog/bulk-qr-codes-excel +0 +200 +2 +Create dynamic QR codes, track scans, and scale campaigns with secure analytics. +Enter new meta description +80 +1 +No + + + + + + + + +Issues +/ +Open Graph tags incomplete + +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 +4 results + +Patches + +Changes: Don't show + +Columns + +Export +PR +URL +Organic traffic +Is valid Open graph +Open graph attributes +Open graph values +Depth +Is indexable page +No. of all inlinks +37 +html +QR Master: Dynamic QR Generator | QR Master +https://www.qrmaster.net/ +0 +No +og:type +og:url +og:description +og:title +website +https://www.qrmaster.net +Dynamic QR, branding, bulk generation & analytics for all campaigns. +QR Master: Dynamic QR Generator +0 +Yes +11 +32 +html +QR Insights: Latest QR Strategies | QR Master +https://www.qrmaster.net/blog +0 +No +og:type +og:url +og:description +og:title +website +https://www.qrmaster.net/blog +Expert guides on QR analytics, dynamic codes & smart marketing uses. +QR Insights: Latest QR Strategies +0 +Yes +8 +32 +html +QR Master FAQ: Dynamic & Bulk QR | QR Master +https://www.qrmaster.net/faq +0 +No +og:type +og:url +og:description +og:title +website +https://www.qrmaster.net/faq +All answers: dynamic QR, security, analytics, bulk, events & print. +QR Master FAQ: Dynamic & Bulk QR +0 +Yes +8 +22 +html +QR Code Erstellen – Kostenlos & Sofort | QR Master | QR Master +https://www.qrmaster.net/qr-code-erstellen +0 +No +og:type +og:locale +og:url +og:description +og:title +website +de_DE +https://www.qrmaster.net/qr-code-erstellen +Erstellen Sie QR Codes kostenlos in Sekunden. Mit Tracking, Branding und Massen-Erstellung. +QR Code Erstellen – Kostenlos & Sofort | QR Master +1 +Yes +1 + + + + + + + + +Issues +/ +Duplicate pages without canonical + +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 +4 results + +Patches: Show all + +Changes: Don't show + +Columns + +Export +PR +URL +Organic traffic +Depth +Is indexable page +Canonical URL +Patch it +No. of canonical inlinks +Content hash +No. of pages having the same content +Title +Patch it + +Batch AI +Meta description +Patch it + +Batch AI +H1 +32 +html +QR Master – Smart QR Generator & Analytics +https://www.qrmaster.net/login +0 +1 +Yes +Enter new canonical URL +0 +18030291202740686079 +4 +QR Master – Smart QR Generator & Analytics +Enter new title +Create dynamic QR codes, track scans, and scale campaigns with secure analytics. +Enter new meta description +32 +html +QR Master – Smart QR Generator & Analytics +https://www.qrmaster.net/newsletter +0 +1 +Yes +Enter new canonical URL +0 +18030291202740686079 +4 +QR Master – Smart QR Generator & Analytics +Enter new title +Create dynamic QR codes, track scans, and scale campaigns with secure analytics. +Enter new meta description +40 +html +QR Master – Smart QR Generator & Analytics +https://www.qrmaster.net/signup +0 +1 +Yes +Enter new canonical URL +0 +18030291202740686079 +4 +QR Master – Smart QR Generator & Analytics +Enter new title +Create dynamic QR codes, track scans, and scale campaigns with secure analytics. +Enter new meta description +28 +html +QR Master – Smart QR Generator & Analytics +https://www.qrmaster.net/pricing +0 +0 +Yes +Enter new canonical URL +0 +18030291202740686079 +4 +QR Master – Smart QR Generator & Analytics +Enter new title +Create dynamic QR codes, track scans, and scale campaigns with secure analytics. +Enter new meta description + + + + + + + + +Issues +/ +Hreflang and HTML lang mismatch + +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 +1 result + +Patches + +Changes: Don't show + +Columns + +Export +PR +URL +Organic traffic +Is indexable page +HTML lang +Self-hreflang +Is valid HTML lang +Is valid self-hreflang +No. of all inlinks +22 +html +QR Code Erstellen – Kostenlos & Sofort | QR Master | QR Master +https://www.qrmaster.net/qr-code-erstellen +0 +Yes +en +de +Yes +Yes +1 + + + + + + + + +Issues +/ +Slow page + +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 +5 results + +Patches + +Changes: Don't show + +Columns + +Export +PR +URL +Organic traffic +HTTP status code +Size (bytes) +Time to first byte (ms) +Loading time (ms) +Depth +Is indexable page +No. of all inlinks +First found at +32 +html +QR Master – Smart QR Generator & Analytics +https://www.qrmaster.net/login +0 +200 +4,076 +12,438 +12,439 +1 +Yes +8 +https://www.qrmaster.net/blog/qr-code-analytics +31 +html +How to Create a QR Code for Restaurant Menu: Complete 2025 | QR Master +https://www.qrmaster.net/blog/qr-code-restaurant-menu +0 +200 +14,070 +21,827 +21,847 +1 +Yes +7 +https://www.qrmaster.net/blog/qr-code-analytics +31 +html +How to Generate Bulk QR Codes from Excel: Complete Tutorial | QR Master +https://www.qrmaster.net/blog/bulk-qr-code-generator-excel +0 +200 +23,409 +18,659 +18,659 +1 +Yes +7 +https://www.qrmaster.net/blog/qr-code-analytics +31 +html +QR Code Print Size Guide: Minimum Sizes for Every Use Case | QR Master +https://www.qrmaster.net/blog/qr-code-print-size-guide +0 +200 +12,592 +16,812 +16,855 +1 +Yes +7 +https://www.qrmaster.net/blog/qr-code-analytics +22 +html +QR Code Erstellen – Kostenlos & Sofort | QR Master | QR Master +https://www.qrmaster.net/qr-code-erstellen +0 +200 +11,295 +17,382 +17,429 +1 +Yes +1 +https://www.qrmaster.net/ + + + + + + + +Issues +/ +Image file size too large + +Why and how to fix + +Submit to IndexNow + +Create new issue + +Pages with large images +4 + +Links to large images +4 + +All URLs + +Pages + +Resources + +Content + +Links + +Redirects + +Indexability + +Sitemaps + +Ahrefs metrics +Word or phrase + +URL + +Advanced filter +4 results + +Patches + +Changes: Don't show + +Columns + +Export +PR +URL +HTTP status code +Content type +Size (bytes) +Loading time (ms) +No. of IMG inlinks +2 +png +4-body.png +https://www.qrmaster.net/blog/4-body.png +200 +image/png +6,033,306 +196 +1 +2 +png +3-body.png +https://www.qrmaster.net/blog/3-body.png +200 +image/png +5,718,679 +141 +1 +2 +png +1-boy.png +https://www.qrmaster.net/blog/1-boy.png +200 +image/png +4,432,231 +167 +1 +2 +png +2-body.png +https://www.qrmaster.net/blog/2-body.png +200 +image/png +4,295,439 +174 +1 + + + + + + + + + + +Issues +/ +Indexable page not in sitemap + +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 +12 results + +Patches + +Changes: Don't show + +Columns + +Export +PR +URL +Organic traffic +HTTP status code +Content type +Is indexable page +No. of all inlinks +Is in sitemap +First found at +40 +html +QR Master – Smart QR Generator & Analytics +https://www.qrmaster.net/signup +0 +200 +text/html; charset=utf-8 +Yes +13 +No +https://www.qrmaster.net/blog/qr-code-analytics +32 +html +QR Master – Smart QR Generator & Analytics +https://www.qrmaster.net/login +0 +200 +text/html; charset=utf-8 +Yes +8 +No +https://www.qrmaster.net/blog/qr-code-analytics +32 +html +QR Master – Smart QR Generator & Analytics +https://www.qrmaster.net/newsletter +0 +200 +text/html; charset=utf-8 +Yes +8 +No +https://www.qrmaster.net/blog/qr-code-analytics +32 +html +Privacy Policy | QR Master | QR Master +https://www.qrmaster.net/privacy +0 +200 +text/html; charset=utf-8 +Yes +8 +No +https://www.qrmaster.net/blog/qr-code-analytics +31 +html +Free vCard QR Code Generator: Digital Business Cards Made | QR Master +https://www.qrmaster.net/blog/vcard-qr-code-generator +0 +200 +text/html; charset=utf-8 +Yes +7 +No +https://www.qrmaster.net/blog/qr-code-analytics +31 +html +How to Create a QR Code for Restaurant Menu: Complete 2025 | QR Master +https://www.qrmaster.net/blog/qr-code-restaurant-menu +0 +200 +text/html; charset=utf-8 +Yes +7 +No +https://www.qrmaster.net/blog/qr-code-analytics +31 +html +Dynamic vs Static QR Codes: Which Should You Use? Complete | QR Master +https://www.qrmaster.net/blog/dynamic-vs-static-qr-codes +0 +200 +text/html; charset=utf-8 +Yes +7 +No +https://www.qrmaster.net/blog/qr-code-analytics +31 +html +How to Generate Bulk QR Codes from Excel: Complete Tutorial | QR Master +https://www.qrmaster.net/blog/bulk-qr-code-generator-excel +0 +200 +text/html; charset=utf-8 +Yes +7 +No +https://www.qrmaster.net/blog/qr-code-analytics +31 +html +QR Code Print Size Guide: Minimum Sizes for Every Use Case | QR Master +https://www.qrmaster.net/blog/qr-code-print-size-guide +0 +200 +text/html; charset=utf-8 +Yes +7 +No +https://www.qrmaster.net/blog/qr-code-analytics +31 +html +Best QR Code Generator for Small Business: 2025 Complete | QR Master +https://www.qrmaster.net/blog/qr-code-small-business +0 +200 +text/html; charset=utf-8 +Yes +7 +No +https://www.qrmaster.net/blog/qr-code-analytics +31 +html +QR Code Tracking: Complete Guide 2025 (Free Tools & Best | QR Master +https://www.qrmaster.net/blog/qr-code-tracking-guide-2025 +0 +200 +text/html; charset=utf-8 +Yes +7 +No +https://www.qrmaster.net/blog/qr-code-analytics +22 +html +QR Code Erstellen – Kostenlos & Sofort | QR Master | QR Master +https://www.qrmaster.net/qr-code-erstellen +0 +200 +text/html; charset=utf-8 +Yes +1 +No +https://www.qrmaster.net/ + + + + + + + + + +Issues +/ +Structured data has schema.org validation error + +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 +18 results + +Patches + +Changes: Don't show + +Columns + +Export +PR +URL +Organic traffic +Schema items +Structured data issues +Is indexable page +40 +html +QR Master – Smart QR Generator & Analytics +https://www.qrmaster.net/signup +0 +Organization +WebSite +Schema.org validation error +View issues +Yes +37 +html +QR Master: Dynamic QR Generator | QR Master +https://www.qrmaster.net/ +0 +Organization +WebSite +Schema.org validation error +View issues +Yes +32 +html +QR Master – Smart QR Generator & Analytics +https://www.qrmaster.net/login +0 +Organization +WebSite +Schema.org validation error +View issues +Yes +32 +html +QR Insights: Latest QR Strategies | QR Master +https://www.qrmaster.net/blog +0 +Organization +WebSite +Schema.org validation error +View issues +Yes +32 +html +QR Master – Smart QR Generator & Analytics +https://www.qrmaster.net/newsletter +0 +Organization +WebSite +Schema.org validation error +View issues +Yes +32 +html +Privacy Policy | QR Master | QR Master +https://www.qrmaster.net/privacy +0 +Organization +WebSite +Schema.org validation error +View issues +Yes +32 +html +QR Master FAQ: Dynamic & Bulk QR | QR Master +https://www.qrmaster.net/faq +0 +Organization +WebSite +Schema.org validation error +View issues +Yes +31 +html +Free vCard QR Code Generator: Digital Business Cards Made | QR Master +https://www.qrmaster.net/blog/vcard-qr-code-generator +0 +BlogPosting +BreadcrumbList +HowTo +Organization +WebSite +Schema.org validation error +View issues +Yes +31 +html +How to Create a QR Code for Restaurant Menu: Complete 2025 | QR Master +https://www.qrmaster.net/blog/qr-code-restaurant-menu +0 +BlogPosting +BreadcrumbList +HowTo +Organization +WebSite +Schema.org validation error +View issues +Yes +31 +html +QR Code Analytics: Track, Measure & Optimize - QR Analytics | QR Master +https://www.qrmaster.net/blog/qr-code-analytics +0 +BlogPosting +BreadcrumbList +HowTo +Organization +WebSite +Schema.org validation error +View issues +Yes +31 +html +Dynamic vs Static QR Codes: Which Should You Use? Complete | QR Master +https://www.qrmaster.net/blog/dynamic-vs-static-qr-codes +0 +BlogPosting +BreadcrumbList +Organization +WebSite +Schema.org validation error +View issues +Yes +31 +html +How to Generate Bulk QR Codes from Excel: Complete Tutorial | QR Master +https://www.qrmaster.net/blog/bulk-qr-code-generator-excel +0 +BlogPosting +BreadcrumbList +HowTo +Organization +WebSite +Schema.org validation error +View issues +Yes +31 +html +QR Code Print Size Guide: Minimum Sizes for Every Use Case | QR Master +https://www.qrmaster.net/blog/qr-code-print-size-guide +0 +BlogPosting +BreadcrumbList +Organization +WebSite +Schema.org validation error +View issues +Yes +31 +html +Best QR Code Generator for Small Business: 2025 Complete | QR Master +https://www.qrmaster.net/blog/qr-code-small-business +0 +BlogPosting +BreadcrumbList +Organization +WebSite +Schema.org validation error +View issues +Yes +31 +html +QR Code Tracking: Complete Guide 2025 (Free Tools & Best | QR Master +https://www.qrmaster.net/blog/qr-code-tracking-guide-2025 +0 +BlogPosting +BreadcrumbList +HowTo +Organization +WebSite +Schema.org validation error +View issues +Yes +28 +html +QR Master – Smart QR Generator & Analytics +https://www.qrmaster.net/pricing +0 +Organization +WebSite +Schema.org validation error +View issues +Yes +22 +html +QR Code Erstellen – Kostenlos & Sofort | QR Master | QR Master +https://www.qrmaster.net/qr-code-erstellen +0 +Organization +WebSite +Schema.org validation error +View issues +Yes +2 +html +Post Not Found | QR Master +https://www.qrmaster.net/blog/bulk-qr-codes-excel +0 +Organization +WebSite +Schema.org validation error +View issues +No diff --git a/public/blog/1-boy.webp b/public/blog/1-boy.webp new file mode 100644 index 0000000..4d80da5 Binary files /dev/null and b/public/blog/1-boy.webp differ diff --git a/public/blog/2-body.webp b/public/blog/2-body.webp new file mode 100644 index 0000000..634fc4d Binary files /dev/null and b/public/blog/2-body.webp differ diff --git a/seo_tasks.md b/seo_tasks.md new file mode 100644 index 0000000..0b5261d --- /dev/null +++ b/seo_tasks.md @@ -0,0 +1,68 @@ +# SEO Remaining Tasks + +This document contains a list of all SEO issues identified in the Ahrefs and Seobility reports that still need to be addressed in the codebase. + +## 1. Content & Metadata Issues + +- [ ] **Fix Missing H1 Tags on Core Pages** + - Affected Pages: `/`, `/pricing`, `/login`, `/signup`, `/faq`, `/privacy`, `/newsletter`, `/create`. + - **Issue:** These pages are Client Side Rendered (CSR) or lack a server-side `

` tag in the initial HTML payload. + - **Action:** Add an `

` (visible or `sr-only`) to the Server Component or ensure the Client Component renders it immediately. + +- [ ] **Fix Low Word Count / Thin Content** + - Affected Pages: `/`, `/pricing`, `/login`, `/signup`, `/faq`, `/privacy`. + - **Issue:** Crawlers see 0 words on these pages because the content is rendered via JavaScript (`use client`). + - **Action:** Implement Server Side Rendering (SSR) for the main content or add `sr-only` semantic fallbacks for crawlers. + +- [ ] **Expand Meta Descriptions** + - Affected Pages: `/`, `/pricing`, `/login`, `/signup`, `/newsletter`, `/privacy`, `/faq`, `/qr-code-erstellen`, Blog entries. + - **Issue:** Meta descriptions are too short (< 80 characters) or duplicates. + - **Action:** Update `generateMetadata` in `page.tsx` files to have descriptions between 110-160 characters. + +- [ ] **Fix Page Titles** + - Affected Pages: `/qr-code-erstellen`, Blog posts. + - **Issue:** Titles are too long (> 60-70 characters) or have keyword stuffing/repetition. + - **Action:** Shorten titles to be concise and click-worthy, avoiding simple concatenation of keywords. + +- [ ] **Fix Duplicate Content & Titles** + - Affected Pages: `/pricing`, `/newsletter`, `/login`, `/signup`. + - **Issue:** These pages likely share the same metadata or layout without unique content in the crawler's eyes. + - **Action:** Ensure each page has unique `title` and `description` in `generateMetadata`. + +## 2. Technical SEO + +- [ ] **Fix 307 Redirects to 301** + - **Issue:** Blog posts and legacy URLs are redirecting with status `307` (Temporary) instead of `301` (Permanent). + - **Affected Paths:** + - `/blog/vcard-qr-code-generator` -> `/create` + - `/blog/qr-code-restaurant-menu` -> `/dynamic-qr-code-generator` + - `/blog/bulk-qr-code-generator` -> `/bulk-qr-code-generator` + - **Action:** Locate these redirects (likely in `next.config.js` or `middleware.ts` or component logic) and change status to 301. + +- [ ] **Fix Indexing of Protected/Private Pages** + - **Issue:** Ahrefs is flagging `/pricing` as "Indexable" but likely encountering issues. Verify if `/pricing` should be indexed. + - **Action:** Ensure public pages like Pricing are NOT in `(app)` group which has `noindex` in layout, or override the `robots` meta in `pricing/page.tsx`. + +- [ ] **Fix "No Outgoing Links"** + - **Issue:** Crawlers see pages as dead ends because links are injected via JS. + - **Action:** Ensure standard `` or `Link` tags are present in the initial HTML. + +## 3. Link Profile + +- [ ] **Improve Internal Link Texts** + - **Issue:** "Click here" or full URL used as anchor text. + - **Action:** Use descriptive keywords for links (e.g., "See our pricing" instead of "Click here"). + +- [ ] **Fix Alternate Links (hreflang)** + - **Issue:** Mismatch in `hreflang` or missing self-referencing canonicals. + - **Action:** Verify `alternates` configuration in `layout.tsx` or `page.tsx` matches the actual URL structure. + +## 4. Performance & Images + +- [ ] **Optimize Large Images** + - **Files:** `/blog/1-boy.png`, `/blog/2-body.png` (~4MB each). + - **Action:** Convert to WebP/AVIF and resize to < 500KB. + +- [ ] **Improve Page Speed** + - **Issue:** Response time for `/qr-code-erstellen` is slow. + - **Action:** Check for expensive server-side operations or optimize database queries. diff --git a/seobility-findings.md b/seobility-findings.md new file mode 100644 index 0000000..d71f25b --- /dev/null +++ b/seobility-findings.md @@ -0,0 +1,943 @@ +guck dir hier das an, ich paste alles rein und du erstellst ein ausführliches md file im root. mit allen problemen und verbesserungen, wenn du schon was verbessert hast musst du es nicht einfügen + + + + + +QR Master +— +screenshot +Crawling-Status +Fertig +Crawling gestartet +12.01.26 16:19 +Crawling beendet +12.01.26 16:20 +Crawling-Dauer +57 Sek. +Anzahl an Crawlings:2 +Regelmäßiges Crawling:Nein +60 % +Onpage Score +-1% +64% +0% +Technik & Meta +60% +-1% +Struktur +56% +-1% +Inhalt +Gefundene Probleme +111 ++14 +Gecrawlte Seiten +25 ++1 +Indexierte Seiten +17 ++1 +Externe Links +2 +- +Probleme & Tipps +Alle Probleme, die auf Deiner Website gefunden wurden, sortiert nach absteigender Priorität + +Suche ... + +Alle + +Tech. & Meta + +Struktur + +Inhalt +9 Seiten haben nur sehr wenige interne Links. +Struktur +8 Seiten sind mit verbesserungswürdigen Linktexten intern verlinkt. +Struktur +13 Seiten haben einen verbesserungswürdigen Seitentitel. +Tech. & Meta +Auf 9 Seiten werden Keywords aus dem Seitentitel nicht im Text wiederverwendet. +Inhalt +Es gibt 4 identische HTML-Seiten auf dieser Website. +Inhalt +9 Seiten enthalten weniger als 500 Wörter Text. +Inhalt +9 Seiten ohne auswertbarem Textinhalt gefunden. +Inhalt +6 interne Weiterleitungen gefunden. +Struktur +4 Seiten haben keinen individuellen Seitentitel. +Tech. & Meta +1 Seiten weisen Probleme mit Alternate Links auf. +Struktur +9 Seiten weisen Probleme mit H1-Überschriften auf. +Tech. & Meta +17 Seiten, die Probleme mit Überschriften oder ihrer Struktur haben. +Tech. & Meta +4 Seiten haben keine individuelle Meta-Description. +Tech. & Meta +3 Seiten weisen Probleme mit Strong- oder Bold-Tags auf. +Tech. & Meta +2 Seiten weisen Probleme mit der Meta-Description auf. +Tech. & Meta +3 Probleme mit eingebundenen Dateien gefunden. +Tech. & Meta +1 Seiten haben eine mittlere Antwortzeit zwischen 0,5 und 1 Sekunde. + + + + +ich copy paste jetzt von oben nach unten rein + + + +Seiten mit wenigen internen Links +Wichtig +Seiten mit wenigen internen Links im Vergleich zur durchschnittlichen Anzahl interner Links pro Seite. + +Gefundene Probleme +9 ++1 +Betroffene Seiten +9 +/25 ++1 +Eingeschränkte Funktion - Jetzt Upgrade durchführen und alle Analysen freischalten! + +Verlauf: Seiten mit wenigen internen Links +Erfahre mehr über den Report +"Seiten mit wenigen internen Links" + +Alle + +URL + +Anzahl der Links +https://www.qrmaster.net/ +0 +https://www.qrmaster.net/qr-code-erstellen +0 +https://www.qrmaster.net/blog +0 +https://www.qrmaster.net/pricing +0 +https://www.qrmaster.net/faq +0 +https://www.qrmaster.net/login +0 +https://www.qrmaster.net/signup +0 +https://www.qrmaster.net/privacy +0 +https://www.qrmaster.net/newsletter +0 + + + + + +Verbesserungswürdige interne Linktexte +Wichtig +Der Linktext eines Links ist aus SEO-Sicht ein sehr wichtiges Element, da er Suchmaschinen mitteilt, worum es auf der verlinkten Seite geht. + +Gefundene Probleme +8 +- +Betroffene Seiten +8 +/25 +- +Eingeschränkte Funktion - Jetzt Upgrade durchführen und alle Analysen freischalten! + +Verlauf: Verbesserungswürdige interne Linktexte +Erfahre mehr über den Report +"Verbesserungswürdige interne Linktexte" + +Alle + +URL + +Probleme + +Details +https://www.qrmaster.net/blog/qr-code-analytics +Linktext zur Seite ist zu lang +Details +https://www.qrmaster.net/blog/qr-code-tracking-guide-2025 +Linktext zur Seite ist zu lang +Details +https://www.qrmaster.net/blog/dynamic-vs-static-qr-codes +Linktext zur Seite ist zu lang +Details +Upgrade + +Details +Upgrade + +Details +Upgrade + +Details +Upgrade + +Details +Upgrade + +Details + + + + + +Probleme mit Seitentiteln +Wichtig +Der Meta Title einer Seite ist eines der wichtigsten Elemente für die Onpage-Suchmaschinenoptimierung und sollte möglichst gut optimiert sein. + +Gefundene Probleme +13 ++1 +Betroffene Seiten +13/25 ++1 +Eingeschränkte Funktion - Jetzt Upgrade durchführen und alle Analysen freischalten! + +Verlauf: Probleme mit Seitentiteln +Erfahre mehr über den Report +"Probleme mit Seitentiteln" + +Alle + +URL + +Seitentitel + +https://www.qrmaster.net/ +QR Master: Dynamic QR Generator \| QR Master +Wortwiederholung +433/580 Pixel + +https://www.qrmaster.net/qr-code-erstellen +QR Code Erstellen – Kostenlos & Sofort \| QR Master \| QR Master +Zu lang +Wortwiederholung +586/580 Pixel + +https://www.qrmaster.net/blog +QR Insights: Latest QR Strategies \| QR Master +Wortwiederholung +418/580 Pixel + +https://www.qrmaster.net/faq +QR Master FAQ: Dynamic & Bulk QR \| QR Master +Wortwiederholung +447/580 Pixel + +https://www.qrmaster.net/blog/qr-code-analytics +QR Code Analytics: Track, Measure & Optimize - QR Analytics \| QR Master +Zu lang +Wortwiederholung +673/580 Pixel + +https://www.qrmaster.net/privacy +Privacy Policy \| QR Master \| QR Master +Wortwiederholung +352/580 Pixel + +https://www.qrmaster.net/blog/qr-code-tracking-guide-2025 +QR Code Tracking: Complete Guide 2025 \(Free Tools & Best \| QR Master +Zu lang +659/580 Pixel + +https://www.qrmaster.net/blog/dynamic-vs-static-qr-codes +Dynamic vs Static QR Codes: Which Should You Use? Complete \| QR Master +Zu lang +694/580 Pixel + +https://www.qrmaster.net/blog/bulk-qr-code-generator-excel +How to Generate Bulk QR Codes from Excel: Complete Tutorial \| QR Master +Zu lang +681/580 Pixel + +https://www.qrmaster.net/blog/qr-code-restaurant-menu +How to Create a QR Code for Restaurant Menu: Complete 2025 \| QR Master +Zu lang +687/580 Pixel + +https://www.qrmaster.net/blog/vcard-qr-code-generator +Free vCard QR Code Generator: Digital Business Cards Made \| QR Master +Zu lang +671/580 Pixel + +https://www.qrmaster.net/blog/qr-code-small-business +Best QR Code Generator for Small Business: 2025 Complete \| QR Master +Zu lang +661/580 Pixel + +https://www.qrmaster.net/blog/qr-code-print-size-guide +QR Code Print Size Guide: Minimum Sizes for Every Use Case \| QR Master +Zu lang +679/580 Pixel + + + + + + + +Keywords aus Seitentitel nicht im Text +Wichtig +Keywords aus dem Seitentitel sollten sich auch im Inhalt bzw. Text der Seite wiederfinden, um eine Konsistenz zwischen Titel und Inhalt zu gewährleisten. + +Gefundene Probleme +9 ++1 +Betroffene Seiten +9 +/25 ++1 +Eingeschränkte Funktion - Jetzt Upgrade durchführen und alle Analysen freischalten! + +Verlauf: Keywords aus Seitentitel nicht im Text +Erfahre mehr über den Report +"Keywords aus Seitentitel nicht im Text" + +Alle + +URL + +Wörter aus dem Seitentitel, die nicht im Text vorkommen +https://www.qrmaster.net/ +QR Master: Dynamic QR Generator | QR Master + +https://www.qrmaster.net/qr-code-erstellen +QR Code Erstellen – Kostenlos & Sofort | QR Master | QR Master + +https://www.qrmaster.net/blog +QR Insights: Latest QR Strategies | QR Master + +Upgrade your plan +Upgrade +Upgrade +Upgrade your plan +Upgrade your plan +Upgrade +Upgrade +Upgrade your plan +Upgrade your plan +Upgrade your plan +Upgrade +Upgrade + + + + + + + +dentische HTML Seiten +Wichtig +Identische HTML-Seiten sind URLs, bei denen der gesamte HTML-Code mit dem Code einer oder mehrerer anderer Seiten identisch ist. + +Gefundene Probleme +4 +- +Betroffene Seiten +4 +/25 +- +Eingeschränkte Funktion - Jetzt Upgrade durchführen und alle Analysen freischalten! + +Verlauf: Identische HTML Seiten +Erfahre mehr über den Report +"Identische HTML Seiten" + +Alle + +Identische HTML Seiten + +https://www.qrmaster.net/pricing + +https://www.qrmaster.net/login + +https://www.qrmaster.net/signup + +https://www.qrmaster.net/newsletter + + + + + + +Seiten mit wenig Text +Wichtig +Ein guter Text oder Artikel sollte mindestens 500 Wörter umfassen. Seiten mit wenig Inhalt haben manchmal Schwierigkeiten, ein gutes Ranking zu erreichen. + +Gefundene Probleme +9 ++1 +Betroffene Seiten +9 +/25 ++1 +Eingeschränkte Funktion - Jetzt Upgrade durchführen und alle Analysen freischalten! + +Verlauf: Seiten mit wenig Text +Erfahre mehr über den Report +"Seiten mit wenig Text" + +Alle + +URL + +Wortanzahl + +Details +https://www.qrmaster.net/ +0 +Details +https://www.qrmaster.net/qr-code-erstellen +0 +Details +https://www.qrmaster.net/blog +0 +Details +https://www.qrmaster.net/pricing +0 +Details +https://www.qrmaster.net/faq +0 +Details +https://www.qrmaster.net/login +0 +Details +https://www.qrmaster.net/signup +0 +Details +https://www.qrmaster.net/privacy +0 +Details +https://www.qrmaster.net/newsletter +0 +Details + + + + + + +Seiten ohne Fließtext +Wichtig +Wenn Suchmaschinen-Bots auf einer Seite keinen auswertbaren Textinhalt finden, haben sie wenig Anhaltspunkte, um das Thema der Seite zu erfassen und sie zu indexieren. + +Gefundene Probleme +9 ++1 +Betroffene Seiten +9 +/25 ++1 +Eingeschränkte Funktion - Jetzt Upgrade durchführen und alle Analysen freischalten! + +Verlauf: Seiten ohne Fließtext +Erfahre mehr über den Report +"Seiten ohne Fließtext" + +Alle + +URL +https://www.qrmaster.net/ +https://www.qrmaster.net/qr-code-erstellen +https://www.qrmaster.net/blog +https://www.qrmaster.net/pricing +https://www.qrmaster.net/faq +https://www.qrmaster.net/login +https://www.qrmaster.net/signup +https://www.qrmaster.net/privacy +https://www.qrmaster.net/newsletter + + + + + + + +Weiterleitungen +Intern verlinkte URLs, die per serverseitigem Redirect (Statuscode 301) auf eine andere URL weiterleiten, solltest Du vermeiden und stattdessen direkt auf die Zielseite verlinken. + +Gefundene Weiterleitungen +6 +- +Gecrawlt +25 +Eingeschränkte Funktion - Jetzt Upgrade durchführen und alle Analysen freischalten! + +Verlauf: Weiterleitungen +Erfahre mehr über den Report +"Weiterleitungen" + +Alle + +Weiterleitung + +Seiten mit Link auf die Weiterleitung + +https://www.qrmaster.net + +https://www.qrmaster.net/ +Verlinkt über Canonical Link, Alternate Link oder ähnlichem + +https://www.qrmaster.net/dynamic-qr-code-generator + +https://www.qrmaster.net/signup + +https://www.qrmaster.net/blog/qr-code-tracking-guide-2025 + +https://www.qrmaster.net/blog/dynamic-vs-static-qr-codes + +https://www.qrmaster.net/blog/qr-code-restaurant-menu + +https://www.qrmaster.net/bulk-qr-code-generator + +https://www.qrmaster.net/signup + +https://www.qrmaster.net/blog/bulk-qr-code-generator-excel + +https://www.qrmaster.net/qr-code-tracking + +https://www.qrmaster.net/signup + +https://www.qrmaster.net/blog/qr-code-restaurant-menu + +https://www.qrmaster.net/create + +https://www.qrmaster.net/signup + +https://www.qrmaster.net/blog/vcard-qr-code-generator + +https://www.qrmaster.net/blog/qr-code-small-business + +https://www.qrmaster.net/blog/qr-code-print-size-guide + +https://www.qrmaster.net/analytics + +https://www.qrmaster.net/signup + +https://www.qrmaster.net/blog/qr-code-small-business + + + + + + + +Doppelte Seitentitel +Wichtig +Der Seitentitel einer Seite ist eines der wichtigsten Elemente der Onpage-Optimierung. Aus diesem Grund sollte jede Seite einen individuellen Seitentitel haben. + +Gefundene Probleme +4 +- +Betroffene Seiten +4/25 +- +Eingeschränkte Funktion - Jetzt Upgrade durchführen und alle Analysen freischalten! + +Verlauf: Doppelte Seitentitel +Erfahre mehr über den Report +"Doppelte Seitentitel" + +Alle + +Seitentitel + +Betroffene URLs +QR Master – Smart QR Generator & Analytics + +https://www.qrmaster.net/pricing + +https://www.qrmaster.net/login + +https://www.qrmaster.net/signup + + + + + + + +Alternate Link Fehler +Wichtig +Bei Websites mit mehreren Sprachen oder regionalen Unterschieden können Suchmaschinen anhand von Alternate Links erkennen, welche URLs für welche Sprachen und Regionen vorgesehen sind. + +Mehr anzeigen (+) +Gefundene Probleme +1 ++1 +Betroffene Seiten +1 +/25 ++1 +Eingeschränkte Funktion - Jetzt Upgrade durchführen und alle Analysen freischalten! + +Verlauf: Alternate Link Fehler +Erfahre mehr über den Report +"Alternate Link Fehler" + +Alle + +URL + +Probleme + +Details +https://www.qrmaster.net/qr-code-erstellen +Der Alternate Link auf die Seite selbst ist fehlerhaft. +Details + + + + + +Probleme mit H1 Überschriften +Wenig wichtig +Überschriften strukturieren den Fließtext einer Seite. Die H1 gibt außerdem wichtige Informationen über den Inhalt der Seite und sollte daher optimiert werden. + +Gefundene Probleme +9 ++1 +Betroffene Seiten +9 +/25 ++1 +Eingeschränkte Funktion - Jetzt Upgrade durchführen und alle Analysen freischalten! + +Verlauf: Probleme mit H1 Überschriften +Erfahre mehr über den Report +"Probleme mit H1 Überschriften" + +Alle + +URL + +H1 Überschrift + +Details +https://www.qrmaster.net/ +Fehlt +Details +https://www.qrmaster.net/qr-code-erstellen +Fehlt +Details +https://www.qrmaster.net/blog +Fehlt +Details +https://www.qrmaster.net/pricing +Fehlt +Details +https://www.qrmaster.net/faq +Fehlt +Details +https://www.qrmaster.net/login +Fehlt +Details +https://www.qrmaster.net/signup +Fehlt +Details +https://www.qrmaster.net/privacy +Fehlt +Details +https://www.qrmaster.net/newsletter +Fehlt +Details + + + + + + + + +Probleme mit Überschriften +Wenig wichtig +Überschriften sind wichtig, um den Inhalt einer Seite zu strukturieren, und sollten daher korrekt verwendet werden. + +Gefundene Probleme +17 ++1 +Betroffene Seiten +17 +/25 ++1 +Eingeschränkte Funktion - Jetzt Upgrade durchführen und alle Analysen freischalten! + +Verlauf: Probleme mit Überschriften +Erfahre mehr über den Report +"Probleme mit Überschriften" + +Alle + +URL + +Probleme + +Details +https://www.qrmaster.net/blog/qr-code-tracking-guide-2025 +Doppelte Überschrift +Zu viele +Details +https://www.qrmaster.net/blog/vcard-qr-code-generator +Doppelte Überschrift +Zu viele +Details +https://www.qrmaster.net/blog/qr-code-analytics +Zu viele +Details +https://www.qrmaster.net/blog/dynamic-vs-static-qr-codes +Zu viele +Details +https://www.qrmaster.net/blog/bulk-qr-code-generator-excel +Zu viele +Details +https://www.qrmaster.net/blog/qr-code-restaurant-menu +Zu viele +Details +https://www.qrmaster.net/blog/qr-code-small-business +Zu viele +Details +https://www.qrmaster.net/blog/qr-code-print-size-guide +Zu viele +Details +https://www.qrmaster.net/ +Keine +Details +https://www.qrmaster.net/qr-code-erstellen +Keine +Details +https://www.qrmaster.net/blog +Keine +Details +https://www.qrmaster.net/pricing +Keine +Details +https://www.qrmaster.net/faq +Keine +Details +https://www.qrmaster.net/login +Keine +Details +https://www.qrmaster.net/signup +Keine +Details +https://www.qrmaster.net/privacy +Keine +Details +https://www.qrmaster.net/newsletter +Keine +Details + + + + + + + +Doppelte Meta-Descriptions +Wenig wichtig +Die Meta-Description sollte für jede Seite individuell erstellt werden. Sie ist zwar nicht direkt relevant für das Ranking in Suchmaschinen, aber sehr wichtig für die CTR (Click-Through-Rate) Deiner Seite. + +Mehr anzeigen (+) +Gefundene Probleme +4 +- +Betroffene Seiten +4 +/25 +- +Eingeschränkte Funktion - Jetzt Upgrade durchführen und alle Analysen freischalten! + +Verlauf: Doppelte Meta-Descriptions +Erfahre mehr über den Report +"Doppelte Meta-Descriptions" + +Alle + +Meta-Description + +Betroffene URLs +Create dynamic QR codes, track scans, and scale campaigns with secure analytics. + +https://www.qrmaster.net/pricing + +https://www.qrmaster.net/login + +https://www.qrmaster.net/signup + +https://www.qrmaster.net/newsletter + + + + + + + +Probleme mit Strong- und Bold-Tags +Wenig wichtig +Strong- und Bold-Tags werden verwendet, um einzelne Wörter oder Aussagen in einem Text optisch und/oder inhaltlich hervorzuheben. + +Gefundene Probleme +3 +-1 +Betroffene Seiten +3 +/25 +-1 +Eingeschränkte Funktion - Jetzt Upgrade durchführen und alle Analysen freischalten! + +Verlauf: Probleme mit Strong- und Bold-Tags +Erfahre mehr über den Report +"Probleme mit Strong- und Bold-Tags" + +Alle + +URL + +Probleme + +Details +https://www.qrmaster.net/blog/dynamic-vs-static-qr-codes +Viele Tags +Duplikat +Details +https://www.qrmaster.net/blog/bulk-qr-code-generator-excel +Viele Tags +Duplikat +Details +https://www.qrmaster.net/blog/vcard-qr-code-generator +Viele Tags +Details + + + + + +Probleme mit Meta-Descriptions +Wenig wichtig +Eine fehlende oder schlecht optimierte Meta-Description führt zu einem schlechten Erstkontakt mit potenziellen Besuchern in den Suchergebnissen und sollte daher vermieden werden. + +Gefundene Probleme +2 ++1 +Betroffene Seiten +2/25 ++1 +Eingeschränkte Funktion - Jetzt Upgrade durchführen und alle Analysen freischalten! + +Verlauf: Probleme mit Meta-Descriptions +Erfahre mehr über den Report +"Probleme mit Meta-Descriptions" + +Alle + +URL + +Meta Description + +https://www.qrmaster.net/qr-code-erstellen +Erstellen Sie QR Codes kostenlos in Sekunden. Statische und dynamische QR-Codes mit Tracking, individuellem Branding und Massen-Erstellung. Für immer kostenlos. +Zu lang +1042/1000 Pixel + +https://www.qrmaster.net/blog/dynamic-vs-static-qr-codes +Understand the difference between static and dynamic QR codes. Learn when to use each type, pros/cons, and how dynamic QR codes save money. Expert guide 2025. +Zu lang +1037/1000 Pixel + + + + + + + +Probleme mit eingebundenen Dateien +Wenig wichtig +Probleme mit eingebundenen Dateien können sich negativ auf die User Experience und die Ladegeschwindigkeit auswirken. + +Gefundene Probleme +3 ++1 +Betroffene Seiten +3 +/25 ++1 +Eingeschränkte Funktion - Jetzt Upgrade durchführen und alle Analysen freischalten! + +Verlauf: Probleme mit eingebundenen Dateien +Erfahre mehr über den Report +"Probleme mit eingebundenen Dateien" + +Alle + +URL + +Statuscode + +Ladezeit + +Dateigröße + +Content Type + +Grund +https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2782770414424875 +200 +0,0619s +191,8 kB +text/javascript; charset=ISO-8859-1 +Fehlende Komprimierung (gzip, Brotli) +https://www.qrmaster.net/blog/1-boy.png +200 +0,4301s +4.243,4 kB +image/png +Große Dateigröße +https://www.qrmaster.net/blog/2-body.png +200 +0,4703s +4.107,4 kB +image/png +Große Dateigröße + + + + + +Mittlere Antwortzeiten +Wenig wichtig +Antwortzeiten zwischen 0,5 bis 1 Sekunde werden als "mittel" eingestuft. Die Antwortzeit wird von Google als Qualitätsfaktor angesehen und sollte so schnell wie möglich sein. + +Gefundene Probleme +1 +-1 +Betroffene Seiten +1 +/25 +-1 +Eingeschränkte Funktion - Jetzt Upgrade durchführen und alle Analysen freischalten! + +Verlauf: Mittlere Antwortzeiten +Erfahre mehr über den Report +"Mittlere Antwortzeiten" + +Alle + +URL + +Antwortzeit + +% durchschn. Antwortzeit +https://www.qrmaster.net/qr-code-erstellen +0,51510s +191% diff --git a/src/app/(app)/AppLayout.tsx b/src/app/(app)/AppLayout.tsx new file mode 100644 index 0000000..e6b9249 --- /dev/null +++ b/src/app/(app)/AppLayout.tsx @@ -0,0 +1,254 @@ +'use client'; + +import React, { useState, useEffect } from 'react'; +import Link from 'next/link'; +import { usePathname, useRouter } from 'next/navigation'; +import { Button } from '@/components/ui/Button'; +import { Dropdown, DropdownItem } from '@/components/ui/Dropdown'; +import { Footer } from '@/components/ui/Footer'; +import { useTranslation } from '@/hooks/useTranslation'; + +interface User { + id: string; + name: string | null; + email: string; + plan: string | null; +} + +export default function AppLayout({ + children, +}: { + children: React.ReactNode; +}) { + const pathname = usePathname(); + const router = useRouter(); + const { t } = useTranslation(); + const [sidebarOpen, setSidebarOpen] = useState(false); + const [user, setUser] = useState(null); + + // Fetch user data on mount + useEffect(() => { + const fetchUser = async () => { + try { + const response = await fetch('/api/user'); + if (response.ok) { + const userData = await response.json(); + setUser(userData); + } + } catch (error) { + console.error('Error fetching user:', error); + } + }; + + fetchUser(); + }, []); + + const handleSignOut = async () => { + // Track logout event before clearing data + try { + const { trackEvent, resetUser } = await import('@/components/PostHogProvider'); + trackEvent('user_logout'); + resetUser(); // Reset PostHog user session + } catch (error) { + console.error('PostHog tracking error:', error); + } + + // Clear all cookies + document.cookie.split(";").forEach(c => { + document.cookie = c.replace(/^ +/, "").replace(/=.*/, "=;expires=" + new Date().toUTCString() + ";path=/"); + }); + // Clear localStorage + localStorage.clear(); + // Redirect to home + router.push('/'); + }; + + // Get user initials for avatar (e.g., "Timo Schmidt" -> "TS") + const getUserInitials = () => { + if (!user) return 'U'; + + if (user.name) { + const names = user.name.trim().split(' '); + if (names.length >= 2) { + return (names[0][0] + names[names.length - 1][0]).toUpperCase(); + } + return user.name.substring(0, 2).toUpperCase(); + } + + // Fallback to email + return user.email.substring(0, 1).toUpperCase(); + }; + + // Get display name (first name or full name) + const getDisplayName = () => { + if (!user) return 'User'; + + if (user.name) { + return user.name; + } + + // Fallback to email without domain + return user.email.split('@')[0]; + }; + + const navigation = [ + { + name: t('nav.dashboard'), + href: '/dashboard', + icon: ( + + + + ), + }, + { + name: t('nav.create_qr'), + href: '/create', + icon: ( + + + + ), + }, + { + name: t('nav.bulk_creation'), + href: '/bulk-creation', + icon: ( + + + + ), + }, + { + name: t('nav.analytics'), + href: '/analytics', + icon: ( + + + + ), + }, + { + name: t('nav.pricing'), + href: '/pricing', + icon: ( + + + + ), + }, + { + name: t('nav.settings'), + href: '/settings', + icon: ( + + + + + ), + }, + ]; + + return ( +
+ {/* Mobile sidebar backdrop */} + {sidebarOpen && ( +
setSidebarOpen(false)} + /> + )} + + {/* Sidebar */} + + + {/* Main content */} +
+ {/* Top bar */} +
+
+ + +
+ {/* User Menu */} + +
+ + {getUserInitials()} + +
+ + {getDisplayName()} + + + + + + } + > + + Sign Out + +
+
+
+
+ + {/* Page content */} +
+ {children} +
+ + {/* Footer */} +
+
+
+ ); +} \ No newline at end of file diff --git a/src/app/(app)/layout.tsx b/src/app/(app)/layout.tsx index e6b9249..68cf8d0 100644 --- a/src/app/(app)/layout.tsx +++ b/src/app/(app)/layout.tsx @@ -1,254 +1,27 @@ -'use client'; +import type { Metadata } from 'next'; +import '@/styles/globals.css'; +import { Providers } from '@/components/Providers'; +import AppLayout from './AppLayout'; -import React, { useState, useEffect } from 'react'; -import Link from 'next/link'; -import { usePathname, useRouter } from 'next/navigation'; -import { Button } from '@/components/ui/Button'; -import { Dropdown, DropdownItem } from '@/components/ui/Dropdown'; -import { Footer } from '@/components/ui/Footer'; -import { useTranslation } from '@/hooks/useTranslation'; +export const metadata: Metadata = { + title: 'Dashboard | QR Master', + robots: { index: false, follow: false }, // Dashboard pages shouldn't be indexed generally +}; -interface User { - id: string; - name: string | null; - email: string; - plan: string | null; -} - -export default function AppLayout({ - children, +export default function RootAppLayout({ + children, }: { - children: React.ReactNode; + children: React.ReactNode; }) { - const pathname = usePathname(); - const router = useRouter(); - const { t } = useTranslation(); - const [sidebarOpen, setSidebarOpen] = useState(false); - const [user, setUser] = useState(null); - - // Fetch user data on mount - useEffect(() => { - const fetchUser = async () => { - try { - const response = await fetch('/api/user'); - if (response.ok) { - const userData = await response.json(); - setUser(userData); - } - } catch (error) { - console.error('Error fetching user:', error); - } - }; - - fetchUser(); - }, []); - - const handleSignOut = async () => { - // Track logout event before clearing data - try { - const { trackEvent, resetUser } = await import('@/components/PostHogProvider'); - trackEvent('user_logout'); - resetUser(); // Reset PostHog user session - } catch (error) { - console.error('PostHog tracking error:', error); - } - - // Clear all cookies - document.cookie.split(";").forEach(c => { - document.cookie = c.replace(/^ +/, "").replace(/=.*/, "=;expires=" + new Date().toUTCString() + ";path=/"); - }); - // Clear localStorage - localStorage.clear(); - // Redirect to home - router.push('/'); - }; - - // Get user initials for avatar (e.g., "Timo Schmidt" -> "TS") - const getUserInitials = () => { - if (!user) return 'U'; - - if (user.name) { - const names = user.name.trim().split(' '); - if (names.length >= 2) { - return (names[0][0] + names[names.length - 1][0]).toUpperCase(); - } - return user.name.substring(0, 2).toUpperCase(); - } - - // Fallback to email - return user.email.substring(0, 1).toUpperCase(); - }; - - // Get display name (first name or full name) - const getDisplayName = () => { - if (!user) return 'User'; - - if (user.name) { - return user.name; - } - - // Fallback to email without domain - return user.email.split('@')[0]; - }; - - const navigation = [ - { - name: t('nav.dashboard'), - href: '/dashboard', - icon: ( - - - - ), - }, - { - name: t('nav.create_qr'), - href: '/create', - icon: ( - - - - ), - }, - { - name: t('nav.bulk_creation'), - href: '/bulk-creation', - icon: ( - - - - ), - }, - { - name: t('nav.analytics'), - href: '/analytics', - icon: ( - - - - ), - }, - { - name: t('nav.pricing'), - href: '/pricing', - icon: ( - - - - ), - }, - { - name: t('nav.settings'), - href: '/settings', - icon: ( - - - - - ), - }, - ]; - - return ( -
- {/* Mobile sidebar backdrop */} - {sidebarOpen && ( -
setSidebarOpen(false)} - /> - )} - - {/* Sidebar */} - - - {/* Main content */} -
- {/* Top bar */} -
-
- - -
- {/* User Menu */} - -
- - {getUserInitials()} - -
- - {getDisplayName()} - - - - - - } - > - - Sign Out - -
-
-
-
- - {/* Page content */} -
- {children} -
- - {/* Footer */} -
-
-
- ); -} \ No newline at end of file + return ( + + + + + {children} + + + + + ); +} diff --git a/src/app/(app)/pricing/page.tsx b/src/app/(app)/pricing/page.tsx index 037a3bc..b2f0e77 100644 --- a/src/app/(app)/pricing/page.tsx +++ b/src/app/(app)/pricing/page.tsx @@ -8,6 +8,9 @@ import { showToast } from '@/components/ui/Toast'; import { useRouter } from 'next/navigation'; import { BillingToggle } from '@/components/ui/BillingToggle'; +// Note: Metadata is defined in a separate metadata.ts file for client components +// or the parent layout should be updated to allow indexing for this specific page. + export default function PricingPage() { const router = useRouter(); const [loading, setLoading] = useState(null); diff --git a/src/app/(auth)/layout.tsx b/src/app/(auth)/layout.tsx index 63fde07..cdddd80 100644 --- a/src/app/(auth)/layout.tsx +++ b/src/app/(auth)/layout.tsx @@ -1,11 +1,26 @@ -export default function AuthLayout({ +import '@/styles/globals.css'; +import { Providers } from '@/components/Providers'; +import type { Metadata } from 'next'; + +export const metadata: Metadata = { + title: 'Authentication | QR Master', + description: 'Login or Sign Up to QR Master', +}; + +export default function AuthRootLayout({ children, }: { children: React.ReactNode; }) { return ( -
- {children} -
+ + + +
+ {children} +
+
+ + ); } \ No newline at end of file diff --git a/src/app/(auth)/login/ClientPage.tsx b/src/app/(auth)/login/ClientPage.tsx new file mode 100644 index 0000000..8f82016 --- /dev/null +++ b/src/app/(auth)/login/ClientPage.tsx @@ -0,0 +1,187 @@ +'use client'; + +import React, { useState, useEffect } from 'react'; +import { useRouter, useSearchParams } from 'next/navigation'; +import Link from 'next/link'; +import { Card, CardHeader, CardTitle, CardContent } from '@/components/ui/Card'; +import { Input } from '@/components/ui/Input'; +import { Button } from '@/components/ui/Button'; +import { useTranslation } from '@/hooks/useTranslation'; +import { useCsrf } from '@/hooks/useCsrf'; + +export default function LoginClientPage() { + const router = useRouter(); + const searchParams = useSearchParams(); + const { t } = useTranslation(); + const { fetchWithCsrf, loading: csrfLoading } = useCsrf(); + const [email, setEmail] = useState(''); + const [password, setPassword] = useState(''); + const [loading, setLoading] = useState(false); + const [error, setError] = useState(''); + + const handleSubmit = async (e: React.FormEvent) => { + e.preventDefault(); + setLoading(true); + setError(''); + + try { + const response = await fetchWithCsrf('/api/auth/simple-login', { + method: 'POST', + body: JSON.stringify({ email, password }), + }); + + const data = await response.json(); + + if (response.ok && data.success) { + // Store user in localStorage for client-side + localStorage.setItem('user', JSON.stringify(data.user)); + + // Track successful login with PostHog + try { + const { identifyUser, trackEvent } = await import('@/components/PostHogProvider'); + identifyUser(data.user.id, { + email: data.user.email, + name: data.user.name, + plan: data.user.plan || 'FREE', + }); + trackEvent('user_login', { + method: 'email', + email: data.user.email, + }); + } catch (error) { + console.error('PostHog tracking error:', error); + } + + // Check for redirect parameter + const redirectUrl = searchParams.get('redirect') || '/dashboard'; + router.push(redirectUrl); + router.refresh(); + } else { + setError(data.error || 'Invalid email or password'); + } + } catch (err) { + setError('An error occurred. Please try again.'); + } finally { + setLoading(false); + } + }; + + const handleGoogleSignIn = () => { + // Redirect to Google OAuth API route + window.location.href = '/api/auth/google'; + }; + + return ( +
+
+
+ + QR Master + QR Master + +

Welcome Back

+

Sign in to your account

+ + ← Back to Home + +
+ + + +
+ {error && ( +
+ {error} +
+ )} + + setEmail(e.target.value)} + placeholder="you@example.com" + required + /> + + setPassword(e.target.value)} + placeholder="••••••••" + required + /> + +
+ + + Forgot password? + +
+ + + +
+
+
+
+
+ Or continue with +
+
+ + +
+ +
+

+ Don't have an account?{' '} + + Sign up + +

+
+
+
+ +

+ By signing in, you agree to our{' '} + + Privacy Policy + +

+
+
+ ); +} diff --git a/src/app/(auth)/login/page.tsx b/src/app/(auth)/login/page.tsx index 440505a..4326f65 100644 --- a/src/app/(auth)/login/page.tsx +++ b/src/app/(auth)/login/page.tsx @@ -1,187 +1,24 @@ -'use client'; +import React from 'react'; +import type { Metadata } from 'next'; +import LoginClientPage from './ClientPage'; -import React, { useState, useEffect } from 'react'; -import { useRouter, useSearchParams } from 'next/navigation'; -import Link from 'next/link'; -import { Card, CardHeader, CardTitle, CardContent } from '@/components/ui/Card'; -import { Input } from '@/components/ui/Input'; -import { Button } from '@/components/ui/Button'; -import { useTranslation } from '@/hooks/useTranslation'; -import { useCsrf } from '@/hooks/useCsrf'; +export const metadata: Metadata = { + title: 'Login to QR Master | Access Your Dashboard', + description: 'Sign in to QR Master to create, manage, and track your QR codes. Access your dashboard and view analytics.', + alternates: { + canonical: 'https://www.qrmaster.net/login', + }, +}; export default function LoginPage() { - const router = useRouter(); - const searchParams = useSearchParams(); - const { t } = useTranslation(); - const { fetchWithCsrf, loading: csrfLoading } = useCsrf(); - const [email, setEmail] = useState(''); - const [password, setPassword] = useState(''); - const [loading, setLoading] = useState(false); - const [error, setError] = useState(''); - - const handleSubmit = async (e: React.FormEvent) => { - e.preventDefault(); - setLoading(true); - setError(''); - - try { - const response = await fetchWithCsrf('/api/auth/simple-login', { - method: 'POST', - body: JSON.stringify({ email, password }), - }); - - const data = await response.json(); - - if (response.ok && data.success) { - // Store user in localStorage for client-side - localStorage.setItem('user', JSON.stringify(data.user)); - - // Track successful login with PostHog - try { - const { identifyUser, trackEvent } = await import('@/components/PostHogProvider'); - identifyUser(data.user.id, { - email: data.user.email, - name: data.user.name, - plan: data.user.plan || 'FREE', - }); - trackEvent('user_login', { - method: 'email', - email: data.user.email, - }); - } catch (error) { - console.error('PostHog tracking error:', error); - } - - // Check for redirect parameter - const redirectUrl = searchParams.get('redirect') || '/dashboard'; - router.push(redirectUrl); - router.refresh(); - } else { - setError(data.error || 'Invalid email or password'); - } - } catch (err) { - setError('An error occurred. Please try again.'); - } finally { - setLoading(false); - } - }; - - const handleGoogleSignIn = () => { - // Redirect to Google OAuth API route - window.location.href = '/api/auth/google'; - }; - return ( -
-
-
- - QR Master - QR Master - -

Welcome Back

-

Sign in to your account

- - ← Back to Home - -
- - - -
- {error && ( -
- {error} -
- )} - - setEmail(e.target.value)} - placeholder="you@example.com" - required - /> - - setPassword(e.target.value)} - placeholder="••••••••" - required - /> - -
- - - Forgot password? - -
- - - -
-
-
-
-
- Or continue with -
-
- - -
- -
-

- Don't have an account?{' '} - - Sign up - -

-
-
-
- -

- By signing in, you agree to our{' '} - - Privacy Policy - -

+ <> +

Login to QR Master – Create & Track QR Codes

+
+

Secure Dashboard Access

+

Log in to manage your dynamic QR codes, view scan analytics, and update destination URLs instantly.

-
+ + ); } \ No newline at end of file diff --git a/src/app/(auth)/signup/ClientPage.tsx b/src/app/(auth)/signup/ClientPage.tsx new file mode 100644 index 0000000..cbfe850 --- /dev/null +++ b/src/app/(auth)/signup/ClientPage.tsx @@ -0,0 +1,208 @@ +'use client'; + +import React, { useState } from 'react'; +import { useRouter } from 'next/navigation'; +import Link from 'next/link'; +import { Card, CardHeader, CardTitle, CardContent } from '@/components/ui/Card'; +import { Input } from '@/components/ui/Input'; +import { Button } from '@/components/ui/Button'; +import { useTranslation } from '@/hooks/useTranslation'; +import { useCsrf } from '@/hooks/useCsrf'; + +export default function SignupClientPage() { + const router = useRouter(); + const { t } = useTranslation(); + const { fetchWithCsrf } = useCsrf(); + const [name, setName] = useState(''); + const [email, setEmail] = useState(''); + const [password, setPassword] = useState(''); + const [confirmPassword, setConfirmPassword] = useState(''); + const [loading, setLoading] = useState(false); + const [error, setError] = useState(''); + + const handleSubmit = async (e: React.FormEvent) => { + e.preventDefault(); + setLoading(true); + setError(''); + + if (password !== confirmPassword) { + setError('Passwords do not match'); + setLoading(false); + return; + } + + if (password.length < 8) { + setError('Password must be at least 8 characters'); + setLoading(false); + return; + } + + try { + const response = await fetchWithCsrf('/api/auth/signup', { + method: 'POST', + body: JSON.stringify({ name, email, password }), + }); + + const data = await response.json(); + + if (response.ok && data.success) { + // Store user in localStorage for client-side + localStorage.setItem('user', JSON.stringify(data.user)); + + // Track successful signup with PostHog + try { + const { identifyUser, trackEvent } = await import('@/components/PostHogProvider'); + identifyUser(data.user.id, { + email: data.user.email, + name: data.user.name, + plan: data.user.plan || 'FREE', + signupMethod: 'email', + }); + trackEvent('user_signup', { + method: 'email', + email: data.user.email, + }); + } catch (error) { + console.error('PostHog tracking error:', error); + } + + // Redirect to dashboard + router.push('/dashboard'); + router.refresh(); + } else { + setError(data.error || 'Failed to create account'); + } + } catch (err) { + setError('An error occurred. Please try again.'); + } finally { + setLoading(false); + } + }; + + const handleGoogleSignIn = () => { + // Redirect to Google OAuth API route + window.location.href = '/api/auth/google'; + }; + + return ( +
+
+
+ + QR Master + QR Master + +

Create Account

+

Start creating QR codes in seconds

+ + ← Back to Home + +
+ + + +
+ {error && ( +
+ {error} +
+ )} + + setName(e.target.value)} + placeholder="John Doe" + required + /> + + setEmail(e.target.value)} + placeholder="you@example.com" + required + /> + + setPassword(e.target.value)} + placeholder="••••••••" + required + /> + + setConfirmPassword(e.target.value)} + placeholder="••••••••" + required + /> + + + +
+
+
+
+
+ Or continue with +
+
+ + +
+ +
+

+ Already have an account?{' '} + + Sign in + +

+
+
+
+ +

+ By signing up, you agree to our{' '} + + Privacy Policy + +

+
+
+ ); +} diff --git a/src/app/(auth)/signup/page.tsx b/src/app/(auth)/signup/page.tsx index 4782134..95adee8 100644 --- a/src/app/(auth)/signup/page.tsx +++ b/src/app/(auth)/signup/page.tsx @@ -1,208 +1,24 @@ -'use client'; +import React from 'react'; +import type { Metadata } from 'next'; +import SignupClientPage from './ClientPage'; -import React, { useState } from 'react'; -import { useRouter } from 'next/navigation'; -import Link from 'next/link'; -import { Card, CardHeader, CardTitle, CardContent } from '@/components/ui/Card'; -import { Input } from '@/components/ui/Input'; -import { Button } from '@/components/ui/Button'; -import { useTranslation } from '@/hooks/useTranslation'; -import { useCsrf } from '@/hooks/useCsrf'; +export const metadata: Metadata = { + title: 'Create Free Account | QR Master', + description: 'Sign up for QR Master to create free QR codes. Start with tracking, customization, and bulk generation features.', + alternates: { + canonical: 'https://www.qrmaster.net/signup', + }, +}; export default function SignupPage() { - const router = useRouter(); - const { t } = useTranslation(); - const { fetchWithCsrf } = useCsrf(); - const [name, setName] = useState(''); - const [email, setEmail] = useState(''); - const [password, setPassword] = useState(''); - const [confirmPassword, setConfirmPassword] = useState(''); - const [loading, setLoading] = useState(false); - const [error, setError] = useState(''); - - const handleSubmit = async (e: React.FormEvent) => { - e.preventDefault(); - setLoading(true); - setError(''); - - if (password !== confirmPassword) { - setError('Passwords do not match'); - setLoading(false); - return; - } - - if (password.length < 8) { - setError('Password must be at least 8 characters'); - setLoading(false); - return; - } - - try { - const response = await fetchWithCsrf('/api/auth/signup', { - method: 'POST', - body: JSON.stringify({ name, email, password }), - }); - - const data = await response.json(); - - if (response.ok && data.success) { - // Store user in localStorage for client-side - localStorage.setItem('user', JSON.stringify(data.user)); - - // Track successful signup with PostHog - try { - const { identifyUser, trackEvent } = await import('@/components/PostHogProvider'); - identifyUser(data.user.id, { - email: data.user.email, - name: data.user.name, - plan: data.user.plan || 'FREE', - signupMethod: 'email', - }); - trackEvent('user_signup', { - method: 'email', - email: data.user.email, - }); - } catch (error) { - console.error('PostHog tracking error:', error); - } - - // Redirect to dashboard - router.push('/dashboard'); - router.refresh(); - } else { - setError(data.error || 'Failed to create account'); - } - } catch (err) { - setError('An error occurred. Please try again.'); - } finally { - setLoading(false); - } - }; - - const handleGoogleSignIn = () => { - // Redirect to Google OAuth API route - window.location.href = '/api/auth/google'; - }; - return ( -
-
-
- - QR Master - QR Master - -

Create Account

-

Start creating QR codes in seconds

- - ← Back to Home - -
- - - -
- {error && ( -
- {error} -
- )} - - setName(e.target.value)} - placeholder="John Doe" - required - /> - - setEmail(e.target.value)} - placeholder="you@example.com" - required - /> - - setPassword(e.target.value)} - placeholder="••••••••" - required - /> - - setConfirmPassword(e.target.value)} - placeholder="••••••••" - required - /> - - - -
-
-
-
-
- Or continue with -
-
- - -
- -
-

- Already have an account?{' '} - - Sign in - -

-
-
-
- -

- By signing up, you agree to our{' '} - - Privacy Policy - -

+ <> +

Sign Up for QR Master – Free QR Code Generator

+
+

Get Started Free

+

Create your account today. No credit card required for the free tier. Start generating trackable QR codes in minutes.

-
+ + ); } \ No newline at end of file diff --git a/src/app/(marketing)/MarketingLayout.tsx b/src/app/(marketing)/MarketingLayout.tsx new file mode 100644 index 0000000..51c7ed7 --- /dev/null +++ b/src/app/(marketing)/MarketingLayout.tsx @@ -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 en from '@/i18n/en.json'; +import { ChevronDown, Wifi, Contact, MessageCircle, QrCode, Link2, Type, Mail, MessageSquare, Phone, Calendar, MapPin, Facebook, Instagram, Twitter, Youtube, Music, Bitcoin, CreditCard, Video, Users } 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]); + + // Default to English for general marketing pages + const t = en; + + 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 ( +
+ {/* Header */} +
+ + + {/* Mobile Menu */} + + {mobileMenuOpen && ( + +
+ {/* Free Tools Accordion */} + + + + {mobileToolsOpen && ( + +
+ {tools.map((tool) => ( + { setMobileMenuOpen(false); setMobileToolsOpen(false); }} + > + + {tool.name} + + ))} +
+
+ )} +
+ +
+ + setMobileMenuOpen(false)}>{t.nav.features} + setMobileMenuOpen(false)}>{t.nav.pricing} + setMobileMenuOpen(false)}>{t.nav.blog} + setMobileMenuOpen(false)}>{t.nav.faq} + +
+ setMobileMenuOpen(false)}> + + + setMobileMenuOpen(false)}> + + +
+
+
+ )} +
+
+ + {/* Main Content */} +
{children}
+ + {/* Footer */} +
+
+ ); +} diff --git a/src/app/(marketing)/blog/[slug]/page.tsx b/src/app/(marketing)/blog/[slug]/page.tsx index 383bf2b..8a62f2a 100644 --- a/src/app/(marketing)/blog/[slug]/page.tsx +++ b/src/app/(marketing)/blog/[slug]/page.tsx @@ -50,7 +50,7 @@ const blogPosts: Record = { { name: 'Create a Dynamic QR Code', text: 'Log into your QR Master dashboard and select "Create Dynamic QR Code". Enter your destination URL and customize design options.', - url: 'https://www.qrmaster.net/create', + url: 'https://www.qrmaster.net/signup', }, { name: 'Enable UTM Tracking', @@ -278,7 +278,7 @@ const blogPosts: Record = {

Step-by-Step with QR Master:

    -
  1. Sign up for free at qrmaster.net/signup
  2. +
  3. Sign up for free at qrmaster.net/signup
  4. Create a dynamic QR code by clicking "Create QR Code" and selecting "Dynamic QR"
  5. Enter the destination URL for your website, landing page, or content
  6. Customize the design with your logo, brand colors, and custom frame
  7. @@ -354,7 +354,7 @@ app.get('/qr/:id', async (req, res) => {

    Privacy Note: Always hash IP addresses, respect Do Not Track headers, and comply with GDPR when collecting scan data.

    - Person scanning QR code with smartphone in office + Person scanning QR code with smartphone in office

    QR Code Tracking Tools Comparison

    @@ -809,7 +809,7 @@ Tracking ✓ | Editable ✓ | Analytics ✓
    - Business card with elegant QR code + Business card with elegant QR code

    Static vs Dynamic QR Codes: Side-by-Side Comparison

    @@ -1441,7 +1441,7 @@ Event Ticket 1 | https://event.com/ticket/1 | events, tickets

    Step 2: Sign Up for QR Master

      -
    1. Go to qrmaster.net/signup
    2. +
    3. Go to qrmaster.net/signup
    4. Create free account (email + password)
    5. Verify your email
    6. Free plan: Up to 3 dynamic QR codes (no bulk upload)
    7. @@ -1870,7 +1870,7 @@ const response = await fetch('https://api.qrmaster.net/v1/bulk', { { name: 'Generate a Dynamic QR Code', text: 'Use QR Master to create a dynamic QR code. This allows you to update your menu URL anytime without reprinting codes.', - url: 'https://www.qrmaster.net/create', + url: 'https://www.qrmaster.net/signup', }, { name: 'Customize Your QR Code Design', @@ -2098,7 +2098,7 @@ const response = await fetch('https://api.qrmaster.net/v1/bulk', {

      How to Create a vCard QR Code

      Step 1: Choose Your QR Code Type

      -

      Go to the QR Master generator and select "Contact Card" or vCard type. Choose between static (data embedded) or dynamic (editable, trackable).

      +

      Go to the QR Master generator and select "Contact Card" or vCard type. Choose between static (data embedded) or dynamic (editable, trackable).

      Step 2: Enter Your Information

      Fill in the contact form with your details. Required fields typically include:

      @@ -2156,7 +2156,7 @@ const response = await fetch('https://api.qrmaster.net/v1/bulk', {

      Related Resources

      @@ -2253,9 +2253,9 @@ const response = await fetch('https://api.qrmaster.net/v1/bulk', {
      1. Identify Your Goal: What do you want customers to do after scanning?
      2. Choose Code Type: Static for permanent content, dynamic for flexibility
      3. -
      4. Create Your QR Code: Use our generator to design and customize
      5. +
      6. Create Your QR Code: Use our generator to design and customize
      7. Print at Right Size: Follow our print size guide
      8. -
      9. Track Performance: Monitor scans in your analytics dashboard
      10. +
      11. Track Performance: Monitor scans in your analytics dashboard

      Common Mistakes Small Businesses Make

      @@ -2411,7 +2411,7 @@ const response = await fetch('https://api.qrmaster.net/v1/bulk', {

      Create Print-Ready QR Codes

      Download high-resolution SVG and PNG files ready for any print application.

      - Create QR Code → + Create QR Code →

      Related Resources

      @@ -2440,7 +2440,7 @@ export async function generateMetadata({ params }: { params: { slug: string } }) }; } - const title = truncateAtWord(`${post.title} - QR Analytics Tips`, 60); + const title = post.title; const description = truncateAtWord(post.excerpt, 160); return { diff --git a/src/app/(marketing)/blog/page.tsx b/src/app/(marketing)/blog/page.tsx index 0850ec7..3cc9546 100644 --- a/src/app/(marketing)/blog/page.tsx +++ b/src/app/(marketing)/blog/page.tsx @@ -18,7 +18,7 @@ function truncateAtWord(text: string, maxLength: number): string { export async function generateMetadata(): Promise { const title = truncateAtWord('QR Insights: Latest QR Strategies', 60); const description = truncateAtWord( - 'Expert guides on QR analytics, dynamic codes & smart marketing uses.', + 'Expert guides on QR code analytics, dynamic vs static codes, bulk generation, and smart marketing use cases. Learn how to maximize your QR campaign ROI.', 160 ); diff --git a/src/app/(marketing)/bulk-qr-code-generator/page.tsx b/src/app/(marketing)/bulk-qr-code-generator/page.tsx index c5c43d4..812f246 100644 --- a/src/app/(marketing)/bulk-qr-code-generator/page.tsx +++ b/src/app/(marketing)/bulk-qr-code-generator/page.tsx @@ -333,7 +333,7 @@ export default function BulkQRCodeGeneratorPage() { Start Bulk Generation - + diff --git a/src/app/(marketing)/dynamic-qr-code-generator/page.tsx b/src/app/(marketing)/dynamic-qr-code-generator/page.tsx index 0cb0a55..30f7325 100644 --- a/src/app/(marketing)/dynamic-qr-code-generator/page.tsx +++ b/src/app/(marketing)/dynamic-qr-code-generator/page.tsx @@ -180,7 +180,7 @@ export default function DynamicQRCodeGeneratorPage() { position: 2, name: 'Generate QR Code', text: 'Enter your destination URL and customize the design with your branding', - url: 'https://www.qrmaster.net/create', + url: 'https://www.qrmaster.net/signup', }, { '@type': 'HowToStep', @@ -504,7 +504,7 @@ export default function DynamicQRCodeGeneratorPage() { Get Started Free - + diff --git a/src/app/(marketing)/faq/page.tsx b/src/app/(marketing)/faq/page.tsx index b69ac5d..ad12a1d 100644 --- a/src/app/(marketing)/faq/page.tsx +++ b/src/app/(marketing)/faq/page.tsx @@ -14,7 +14,7 @@ function truncateAtWord(text: string, maxLength: number): string { export async function generateMetadata(): Promise { const title = truncateAtWord('QR Master FAQ: Dynamic & Bulk QR', 60); const description = truncateAtWord( - 'All answers: dynamic QR, security, analytics, bulk, events & print.', + 'Find answers about dynamic QR codes, scan tracking, security, bulk generation, and event QR codes. Everything you need to know about QR Master features.', 160 ); diff --git a/src/app/(marketing)/layout.tsx b/src/app/(marketing)/layout.tsx index 51c7ed7..2272e68 100644 --- a/src/app/(marketing)/layout.tsx +++ b/src/app/(marketing)/layout.tsx @@ -1,248 +1,77 @@ -'use client'; +import type { Metadata } from 'next'; +import '@/styles/globals.css'; +import { Providers } from '@/components/Providers'; +import MarketingLayout from './MarketingLayout'; +// Import schema functions from library +import { organizationSchema, websiteSchema } from '@/lib/schema'; -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 en from '@/i18n/en.json'; -import { ChevronDown, Wifi, Contact, MessageCircle, QrCode, Link2, Type, Mail, MessageSquare, Phone, Calendar, MapPin, Facebook, Instagram, Twitter, Youtube, Music, Bitcoin, CreditCard, Video, Users } from 'lucide-react'; -import { cn } from '@/lib/utils'; -import { AnimatePresence, motion } from 'framer-motion'; +const isIndexable = process.env.NEXT_PUBLIC_INDEXABLE === 'true'; -export default function MarketingLayout({ - children, +export const metadata: Metadata = { + metadataBase: new URL('https://www.qrmaster.net'), + title: { + default: 'QR Master – Smart QR Generator & Analytics', + template: '%s | QR Master', + }, + description: 'Create dynamic QR codes, track scans, and scale campaigns with secure analytics.', + keywords: 'QR code, QR generator, dynamic QR, QR tracking, QR analytics, branded QR, bulk QR generator', + robots: isIndexable + ? { index: true, follow: true } + : { index: false, follow: false }, + icons: { + icon: [ + { url: '/favicon.svg', type: 'image/svg+xml' }, + { url: '/logo.svg', type: 'image/svg+xml' }, + ], + apple: '/logo.svg', + }, + twitter: { + card: 'summary_large_image', + site: '@qrmaster', + images: ['https://www.qrmaster.net/static/og-image.png'], + }, + openGraph: { + type: 'website', + siteName: 'QR Master', + title: 'QR Master – Smart QR Generator & Analytics', + description: 'Create dynamic QR codes, track scans, and scale campaigns with secure analytics.', + url: 'https://www.qrmaster.net', + images: [ + { + url: 'https://www.qrmaster.net/static/og-image.png', + width: 1200, + height: 630, + alt: 'QR Master - Dynamic QR Code Generator and Analytics Platform', + }, + ], + locale: 'en_US', + }, +}; + +export default function RootMarketingLayout({ + children, }: { - children: React.ReactNode; + 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]); - - // Default to English for general marketing pages - const t = en; - - 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 ( -
      - {/* Header */} -
      - - - {/* Mobile Menu */} - - {mobileMenuOpen && ( - -
      - {/* Free Tools Accordion */} - - - - {mobileToolsOpen && ( - -
      - {tools.map((tool) => ( - { setMobileMenuOpen(false); setMobileToolsOpen(false); }} - > - - {tool.name} - - ))} -
      -
      - )} -
      - -
      - - setMobileMenuOpen(false)}>{t.nav.features} - setMobileMenuOpen(false)}>{t.nav.pricing} - setMobileMenuOpen(false)}>{t.nav.blog} - setMobileMenuOpen(false)}>{t.nav.faq} - -
      - setMobileMenuOpen(false)}> - - - setMobileMenuOpen(false)}> - - -
      -
      -
      - )} -
      -
      - - {/* Main Content */} -
      {children}
      - - {/* Footer */} -
      -
      - ); + return ( + + +