diff --git a/src/app/dashboard/layout.tsx b/src/app/dashboard/layout.tsx
index c50be65..396802e 100644
--- a/src/app/dashboard/layout.tsx
+++ b/src/app/dashboard/layout.tsx
@@ -2,6 +2,12 @@ import Link from "next/link";
import { requireUser } from "@/lib/auth/current-user";
import { DashboardMobileNav } from "@/components/dashboard-mobile-nav";
import { BrandLogo } from "@/components/brand-logo";
+import type { Metadata } from "next";
+
+export const metadata: Metadata = {
+ title: "Dashboard",
+ robots: { index: false, follow: false, nocache: true }
+};
const nav = [
["Ads", "/dashboard/ads"],
diff --git a/src/app/layout.tsx b/src/app/layout.tsx
index 004d832..fe04e85 100644
--- a/src/app/layout.tsx
+++ b/src/app/layout.tsx
@@ -1,18 +1,20 @@
import type { Metadata } from "next";
import "./globals.css";
-
-const appUrl = process.env.NEXT_PUBLIC_APP_URL || "http://localhost:3000";
+import { SITE_DESCRIPTION, SITE_NAME, SITE_URL } from "@/lib/seo";
export const metadata: Metadata = {
- metadataBase: new URL(appUrl),
- applicationName: "AdSeeQ",
+ metadataBase: new URL(SITE_URL),
+ applicationName: SITE_NAME,
title: {
default: "AdSeeQ — Reklam ve Trend Zekâsı",
template: "%s | AdSeeQ"
},
- description: "Meta reklamlarını, TikTok Shop ürünlerini, yükselen trendleri ve rakip markaları yapay zekâ ile tek panelden keşfedin.",
+ description: SITE_DESCRIPTION,
keywords: ["reklam kütüphanesi", "Meta Ads", "TikTok Shop", "trend analizi", "marka takibi", "reklam zekâsı"],
- alternates: { canonical: "/" },
+ alternates: {
+ canonical: "/",
+ languages: { "tr-TR": "/" }
+ },
openGraph: {
title: "AdSeeQ — Kazanan reklamları ve trendleri keşfedin",
description: "Meta Ads, TikTok Shop, Magic AI Trends ve Brand Tracker tek panelde.",
@@ -26,7 +28,17 @@ export const metadata: Metadata = {
title: "AdSeeQ — Reklam ve Trend Zekâsı",
description: "Kazanan reklamları, ürünleri ve rakip marka hareketlerini keşfedin."
},
- robots: { index: true, follow: true }
+ robots: {
+ index: true,
+ follow: true,
+ googleBot: {
+ index: true,
+ follow: true,
+ "max-image-preview": "large",
+ "max-snippet": -1,
+ "max-video-preview": -1
+ }
+ }
};
export default function RootLayout({ children }: { children: React.ReactNode }) {
diff --git a/src/app/llms.txt/route.ts b/src/app/llms.txt/route.ts
new file mode 100644
index 0000000..78d03c7
--- /dev/null
+++ b/src/app/llms.txt/route.ts
@@ -0,0 +1,37 @@
+import { SITE_DESCRIPTION, SITE_URL } from "@/lib/seo";
+
+const content = `# AdSeeQ
+
+> ${SITE_DESCRIPTION}
+
+AdSeeQ, reklam araştırması ve e-ticaret trend keşfi yapan ekipler için web tabanlı bir platformdur.
+
+## Temel özellikler
+
+- Meta Ads Library reklamlarını anahtar kelime ve ülkeye göre araştırma
+- Medya içeren reklam kreatiflerini inceleme ve kaydetme
+- TikTok Shop ürün keşfi
+- Magic AI ile reklam ve ürün sinyallerini analiz etme
+- Trends ile yükselen sinyalleri takip etme
+- Brand Tracker ve Store Tracker ile marka ve mağaza takibi
+
+## Resmî sayfalar
+
+- Ana sayfa: ${SITE_URL}
+- Fiyatlandırma: ${SITE_URL}/pricing
+- Hesap oluşturma: ${SITE_URL}/register
+- Giriş: ${SITE_URL}/login
+
+## Ürün bilgisi
+
+AdSeeQ ücretsiz ve ücretli planlar sunar. Güncel plan limitleri ve fiyatlar için resmî fiyatlandırma sayfasını kullanın. Özel dashboard ve API rotaları herkese açık içerik değildir.
+`;
+
+export function GET() {
+ return new Response(content, {
+ headers: {
+ "content-type": "text/plain; charset=utf-8",
+ "cache-control": "public, max-age=3600, s-maxage=86400"
+ }
+ });
+}
diff --git a/src/app/login/layout.tsx b/src/app/login/layout.tsx
new file mode 100644
index 0000000..32cf8ef
--- /dev/null
+++ b/src/app/login/layout.tsx
@@ -0,0 +1,12 @@
+import type { Metadata } from "next";
+
+export const metadata: Metadata = {
+ title: "Giriş",
+ description: "AdSeeQ hesabınıza giriş yapın.",
+ alternates: { canonical: "/login" },
+ robots: { index: false, follow: false, nocache: true }
+};
+
+export default function LoginLayout({ children }: { children: React.ReactNode }) {
+ return children;
+}
diff --git a/src/app/opengraph-image.tsx b/src/app/opengraph-image.tsx
new file mode 100644
index 0000000..3cf7dda
--- /dev/null
+++ b/src/app/opengraph-image.tsx
@@ -0,0 +1,50 @@
+import { ImageResponse } from "next/og";
+
+export const alt = "AdSeeQ — Reklam ve trend zekâsı";
+export const size = { width: 1200, height: 630 };
+export const contentType = "image/png";
+
+export default function OpenGraphImage() {
+ return new ImageResponse(
+
+
+
+
+ Q
+
+ AdSeeQ
+
+
+ Kazanan reklamları ve trendleri keşfedin
+
+
+ Meta Ads · TikTok Shop · Magic AI · Trends · Brand Tracker
+
+
+
,
+ size
+ );
+}
diff --git a/src/app/page.tsx b/src/app/page.tsx
index 29e6df8..433a074 100644
--- a/src/app/page.tsx
+++ b/src/app/page.tsx
@@ -1,9 +1,14 @@
import { LinkButton } from "@/components/ui/button";
import { BrandLogo } from "@/components/brand-logo";
+import { homeFaq, homeStructuredData, serializeJsonLd } from "@/lib/seo";
export default function LandingPage() {
return (
+
);
}
diff --git a/src/app/pricing/page.tsx b/src/app/pricing/page.tsx
index 59493f6..2abf8ff 100644
--- a/src/app/pricing/page.tsx
+++ b/src/app/pricing/page.tsx
@@ -3,6 +3,18 @@ import { LinkButton } from "@/components/ui/button";
import { Card } from "@/components/ui/card";
import { CheckoutButton } from "@/components/checkout-button";
import { BrandLogo } from "@/components/brand-logo";
+import type { Metadata } from "next";
+
+export const metadata: Metadata = {
+ title: "Fiyatlandırma",
+ description: "AdSeeQ Free, Basic, Standard ve Premium planlarının reklam arama, mağaza takip ve kayıt limitlerini karşılaştırın.",
+ alternates: { canonical: "/pricing", languages: { "tr-TR": "/pricing" } },
+ openGraph: {
+ title: "AdSeeQ Fiyatlandırma",
+ description: "İhtiyacınıza uygun reklam ve trend araştırma planını seçin.",
+ url: "/pricing"
+ }
+};
export default async function PricingPage() {
const plans = await prisma.plan.findMany({ orderBy: { sortOrder: "asc" } }).catch(() => []);
diff --git a/src/app/register/layout.tsx b/src/app/register/layout.tsx
new file mode 100644
index 0000000..21a680e
--- /dev/null
+++ b/src/app/register/layout.tsx
@@ -0,0 +1,12 @@
+import type { Metadata } from "next";
+
+export const metadata: Metadata = {
+ title: "Ücretsiz Hesap Oluştur",
+ description: "AdSeeQ ücretsiz hesabınızı oluşturun ve reklam araştırmasına başlayın.",
+ alternates: { canonical: "/register" },
+ robots: { index: false, follow: false, nocache: true }
+};
+
+export default function RegisterLayout({ children }: { children: React.ReactNode }) {
+ return children;
+}
diff --git a/src/app/robots.ts b/src/app/robots.ts
new file mode 100644
index 0000000..6adde14
--- /dev/null
+++ b/src/app/robots.ts
@@ -0,0 +1,14 @@
+import type { MetadataRoute } from "next";
+import { SITE_URL } from "@/lib/seo";
+
+export default function robots(): MetadataRoute.Robots {
+ return {
+ rules: {
+ userAgent: "*",
+ allow: ["/", "/pricing", "/llms.txt"],
+ disallow: ["/api/", "/dashboard/", "/login", "/register"]
+ },
+ sitemap: `${SITE_URL}/sitemap.xml`,
+ host: SITE_URL
+ };
+}
diff --git a/src/app/sitemap.ts b/src/app/sitemap.ts
new file mode 100644
index 0000000..751826a
--- /dev/null
+++ b/src/app/sitemap.ts
@@ -0,0 +1,19 @@
+import type { MetadataRoute } from "next";
+import { SITE_URL } from "@/lib/seo";
+
+export default function sitemap(): MetadataRoute.Sitemap {
+ return [
+ {
+ url: SITE_URL,
+ changeFrequency: "weekly",
+ priority: 1,
+ alternates: { languages: { "tr-TR": SITE_URL } }
+ },
+ {
+ url: `${SITE_URL}/pricing`,
+ changeFrequency: "monthly",
+ priority: 0.8,
+ alternates: { languages: { "tr-TR": `${SITE_URL}/pricing` } }
+ }
+ ];
+}
diff --git a/src/lib/seo.ts b/src/lib/seo.ts
new file mode 100644
index 0000000..ed95836
--- /dev/null
+++ b/src/lib/seo.ts
@@ -0,0 +1,85 @@
+export const SITE_URL = "https://adseeq.com";
+
+export const SITE_NAME = "AdSeeQ";
+
+export const SITE_DESCRIPTION =
+ "Meta reklamlarını, TikTok Shop ürünlerini, yükselen trendleri ve rakip markaları yapay zekâ destekli tek panelden araştırın.";
+
+export const homeFaq = [
+ {
+ question: "AdSeeQ nedir?",
+ answer:
+ "AdSeeQ; Meta reklamlarını, TikTok Shop ürünlerini, yükselen trendleri ve rakip markaları tek panelde araştırmaya yardımcı olan reklam ve trend zekâsı platformudur."
+ },
+ {
+ question: "AdSeeQ ile hangi reklamlar araştırılabilir?",
+ answer:
+ "Meta Ads Library kaynaklı reklamlar anahtar kelime ve ülke ölçütleriyle aranabilir; medya içeren kreatifler incelenebilir ve uygun reklamlar daha sonra değerlendirmek üzere kaydedilebilir."
+ },
+ {
+ question: "Magic AI ne işe yarar?",
+ answer:
+ "Magic AI, reklam ve ürün sinyallerini özetleyerek kreatif açıları, hedef kitle fikirleri ve test edilebilecek pazarlama yaklaşımları üretmeye yardımcı olur."
+ },
+ {
+ question: "AdSeeQ ücretsiz kullanılabilir mi?",
+ answer:
+ "Evet. Ücretsiz plan günlük sınırlı reklam araması sunar; daha yüksek arama ve takip limitleri için ücretli planlar bulunur."
+ }
+] as const;
+
+export const homeStructuredData = {
+ "@context": "https://schema.org",
+ "@graph": [
+ {
+ "@type": "Organization",
+ "@id": `${SITE_URL}/#organization`,
+ name: SITE_NAME,
+ url: SITE_URL,
+ logo: `${SITE_URL}/icon.svg`
+ },
+ {
+ "@type": "WebSite",
+ "@id": `${SITE_URL}/#website`,
+ url: SITE_URL,
+ name: SITE_NAME,
+ description: SITE_DESCRIPTION,
+ inLanguage: "tr-TR",
+ publisher: { "@id": `${SITE_URL}/#organization` }
+ },
+ {
+ "@type": "SoftwareApplication",
+ "@id": `${SITE_URL}/#software`,
+ name: SITE_NAME,
+ applicationCategory: "BusinessApplication",
+ applicationSubCategory: "Advertising Intelligence",
+ operatingSystem: "Web",
+ url: SITE_URL,
+ description: SITE_DESCRIPTION,
+ inLanguage: "tr-TR",
+ offers: {
+ "@type": "Offer",
+ price: "0",
+ priceCurrency: "EUR",
+ description: "Günlük sınırlı reklam araması içeren ücretsiz plan"
+ },
+ publisher: { "@id": `${SITE_URL}/#organization` }
+ },
+ {
+ "@type": "FAQPage",
+ "@id": `${SITE_URL}/#faq`,
+ mainEntity: homeFaq.map(({ question, answer }) => ({
+ "@type": "Question",
+ name: question,
+ acceptedAnswer: {
+ "@type": "Answer",
+ text: answer
+ }
+ }))
+ }
+ ]
+};
+
+export function serializeJsonLd(value: unknown) {
+ return JSON.stringify(value).replace(/ {
const ad = normalizeApifyAd({
@@ -76,3 +80,34 @@ test("AdSeeQ ana alan adı yönlendirilmez", () => {
assert.equal(response.status, 200);
assert.equal(response.headers.get("location"), null);
});
+
+test("sitemap yalnızca indekslenebilir herkese açık sayfaları içerir", () => {
+ const urls = sitemap().map((entry) => entry.url);
+ assert.deepEqual(urls, ["https://adseeq.com", "https://adseeq.com/pricing"]);
+ assert.equal(new Set(urls).size, urls.length);
+});
+
+test("robots özel alanları engeller ve sitemap adresini bildirir", () => {
+ const value = robots();
+ assert.equal(value.sitemap, "https://adseeq.com/sitemap.xml");
+ assert.deepEqual(value.rules, {
+ userAgent: "*",
+ allow: ["/", "/pricing", "/llms.txt"],
+ disallow: ["/api/", "/dashboard/", "/login", "/register"]
+ });
+});
+
+test("llms.txt ürün kapsamını düz metin olarak açıklar", async () => {
+ const response = llmsTxt();
+ const body = await response.text();
+ assert.match(response.headers.get("content-type") || "", /^text\/plain/);
+ assert.match(body, /Meta Ads Library/);
+ assert.match(body, /https:\/\/adseeq\.com\/pricing/);
+});
+
+test("ana sayfa JSON-LD verisi yazılım ve SSS şemalarını içerir", () => {
+ const value = serializeJsonLd(homeStructuredData);
+ assert.match(value, /SoftwareApplication/);
+ assert.match(value, /FAQPage/);
+ assert.equal(value.includes("<"), false);
+});