diff --git a/src/app/(main)/(marketing)/press/page.tsx b/src/app/(main)/(marketing)/press/page.tsx
new file mode 100644
index 0000000..5a845bb
--- /dev/null
+++ b/src/app/(main)/(marketing)/press/page.tsx
@@ -0,0 +1,139 @@
+import React from 'react';
+import { Metadata } from 'next';
+import Link from 'next/link';
+import { Button } from '@/components/ui/Button';
+import SeoJsonLd from '@/components/SeoJsonLd';
+import { organizationSchema, websiteSchema } from '@/lib/schema';
+import { ChevronRight, ExternalLink, Newspaper, Award, Calendar } from 'lucide-react';
+
+export const metadata: Metadata = {
+ title: 'Press & News | QR Master',
+ description: 'Latest news, press releases, and updates from QR Master. Stay informed about new features, company announcements, and industry insights.',
+ keywords: ['qr master press', 'qr code generator news', 'company updates', 'press releases'],
+ openGraph: {
+ title: 'Press & News | QR Master',
+ description: 'Latest news, press releases, and updates from QR Master.',
+ url: 'https://www.qrmaster.net/press',
+ type: 'website',
+ }
+};
+
+export default function PressPage() {
+ const pressReleases = [
+ {
+ id: "launch-2026",
+ title: "qrmaster.net Launches Free, Professional QR Code Generator for Global Users",
+ date: "January 27, 2026",
+ excerpt: "Duesseldorf-based startup unveils qrmaster.net, a comprehensive, free online QR code generator designed to serve as the ultimate bridge between the physical and digital worlds.",
+ bullets: [
+ "Advanced tracking capabilities with UTM builder for GA4 integration",
+ "100% Free professional templates and design customization",
+ "Privacy-focused architecture with no data selling",
+ "Dynamic QR codes that can be edited after printing"
+ ],
+ link: "https://www.prlog.org/13123883-qrmasternet-launches-free-professional-qr-code-generator-for-global-users.html",
+ source: "PRLog"
+ }
+ ];
+
+ return (
+ <>
+
+
+
+ {/* Hero Section */}
+
+
+
+
+
+ Newsroom
+
+
+ Latest updates, press releases, and announcements from the QR Master team.
+
+
+
+
+
+ {/* Press Releases List */}
+
+
+
+
+
Latest Releases
+
+
+
+ {pressReleases.map((pr) => (
+
+
+
+
+
+
+
+ {pr.date}
+
+
+ Press Release
+
+
+
+
+
+
+ {pr.excerpt}
+
+
+
+
Highlights
+
+ {pr.bullets.map((bullet, idx) => (
+
+
+ {bullet}
+
+ ))}
+
+
+
+
+
+ Source:
+ {pr.source}
+
+
+ Read full release
+
+
+
+
+ ))}
+
+
+
+
+ {/* Media Kit CTA (Future proofing) */}
+
+
+
Media Inquiries
+
+ For press inquiries, assets, or interview requests from our leadership team.
+
+
+
+ Contact Press Team
+
+
+
+
+
+ >
+ );
+}
diff --git a/src/app/(main)/(marketing)/testimonials/page.tsx b/src/app/(main)/(marketing)/testimonials/page.tsx
new file mode 100644
index 0000000..6ea6fa9
--- /dev/null
+++ b/src/app/(main)/(marketing)/testimonials/page.tsx
@@ -0,0 +1,142 @@
+import React from 'react';
+import Link from 'next/link';
+import { Metadata } from 'next';
+import { Button } from '@/components/ui/Button';
+import SeoJsonLd from '@/components/SeoJsonLd';
+import { organizationSchema, reviewSchema, aggregateRatingSchema } from '@/lib/schema';
+import { testimonials, getAggregateRating } from '@/lib/testimonial-data';
+import { Testimonials } from '@/components/marketing/Testimonials';
+import { Star } from 'lucide-react';
+
+function truncateAtWord(text: string, maxLength: number): string {
+ if (text.length <= maxLength) return text;
+ const truncated = text.slice(0, maxLength);
+ const lastSpace = truncated.lastIndexOf(' ');
+ return lastSpace > 0 ? truncated.slice(0, lastSpace) : truncated;
+}
+
+export async function generateMetadata(): Promise
{
+ const title = truncateAtWord('Customer Testimonials | QR Master Reviews', 60);
+ const description = truncateAtWord(
+ 'Read what our customers say about QR Master. Real reviews from businesses using dynamic QR codes for restaurants, pottery, retail, events, and more.',
+ 160
+ );
+
+ return {
+ title,
+ description,
+ keywords: ['qr master reviews', 'qr code testimonials', 'customer reviews', 'qr code generator reviews', 'dynamic qr code reviews'],
+ alternates: {
+ canonical: 'https://www.qrmaster.net/testimonials',
+ },
+ openGraph: {
+ title,
+ description,
+ url: 'https://www.qrmaster.net/testimonials',
+ type: 'website',
+ images: [
+ {
+ url: 'https://www.qrmaster.net/og-image.png',
+ width: 1200,
+ height: 630,
+ alt: 'QR Master Customer Testimonials',
+ },
+ ],
+ },
+ twitter: {
+ title,
+ description,
+ },
+ };
+}
+
+export default function TestimonialsPage() {
+ const aggregateRating = getAggregateRating();
+ const reviewSchemas = testimonials.map(t => reviewSchema(t));
+
+ return (
+ <>
+
+
+
+ {/* Hero Section with Aggregate Rating */}
+
+
+
+ Customer Testimonials
+
+
+ Real experiences from businesses using QR Master to create dynamic QR codes
+
+
+ {/* Aggregate Rating Display */}
+
+
+ {[...Array(5)].map((_, index) => (
+
+ ))}
+
+
+ {aggregateRating.ratingValue} out of 5 stars
+
+
+ Based on {aggregateRating.reviewCount} {aggregateRating.reviewCount === 1 ? 'review' : 'reviews'}
+
+
+
+
+
+
+ Get Started Free
+
+
+
+
+
+
+ {/* Testimonials Grid */}
+
+
+ {/* CTA Section */}
+
+
+
+ Ready to create your own QR codes?
+
+
+ Join businesses using QR Master to create dynamic, trackable QR codes for their products, menus, events, and campaigns.
+
+
+
+
+ Start Free Today
+
+
+
+
+ View Pricing
+
+
+
+
+
+
+ >
+ );
+}
diff --git a/src/app/sitemap.ts b/src/app/sitemap.ts
index 9ea7a11..73c2c64 100644
--- a/src/app/sitemap.ts
+++ b/src/app/sitemap.ts
@@ -175,6 +175,18 @@ export default function sitemap(): MetadataRoute.Sitemap {
changeFrequency: 'yearly',
priority: 0.6,
},
+ {
+ url: `${baseUrl}/press`,
+ lastModified: new Date(),
+ changeFrequency: 'monthly',
+ priority: 0.7,
+ },
+ {
+ url: `${baseUrl}/testimonials`,
+ lastModified: new Date(),
+ changeFrequency: 'monthly',
+ priority: 0.7,
+ },
...toolPages,
diff --git a/src/components/ads/AdBanner.tsx b/src/components/ads/AdBanner.tsx
index ee7e79d..66e9421 100644
--- a/src/components/ads/AdBanner.tsx
+++ b/src/components/ads/AdBanner.tsx
@@ -50,7 +50,7 @@ export default function AdBanner({
session.user.plan === 'LIFETIME'
);
- if (shouldExclude) return null;
+
useEffect(() => {
// Don't load if loading session or if user is paid
@@ -92,6 +92,8 @@ export default function AdBanner({
// Don't render anything while session is loading
if (status === 'loading') return null;
+ if (shouldExclude) return null;
+
return (
{
- Coming Soon
+ The Future is Here
diff --git a/src/components/marketing/HomePageClient.tsx b/src/components/marketing/HomePageClient.tsx
index 728f059..46c4e22 100644
--- a/src/components/marketing/HomePageClient.tsx
+++ b/src/components/marketing/HomePageClient.tsx
@@ -14,11 +14,14 @@ import { Button } from '@/components/ui/Button';
import { ReprintCalculatorTeaser } from '@/components/marketing/ReprintCalculatorTeaser';
import { ScrollToTop } from '@/components/ui/ScrollToTop';
import { FreeToolsGrid } from '@/components/marketing/FreeToolsGrid';
+import { Testimonials } from '@/components/marketing/Testimonials';
+import { getFeaturedTestimonials } from '@/lib/testimonial-data';
import en from '@/i18n/en.json';
export default function HomePageClient() {
// Always use English for marketing pages
const t = en;
+ const featuredTestimonials = getFeaturedTestimonials();
const industries = [
'Restaurant Chain',
@@ -41,6 +44,9 @@ export default function HomePageClient() {
{/* Free Tools Grid */}
+ {/* Testimonials Section */}
+
+
diff --git a/src/components/marketing/StatsStrip.tsx b/src/components/marketing/StatsStrip.tsx
index e275589..e80b80e 100644
--- a/src/components/marketing/StatsStrip.tsx
+++ b/src/components/marketing/StatsStrip.tsx
@@ -29,6 +29,15 @@ export const StatsStrip: React.FC = ({ t }) => {
))}
+
+ {/* Market Context - Citation / AEO Trust Signal */}
+