File size: 6,745 Bytes
e327f0d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
# SEO Checklist — Hasarİ (arac-hasar-v2)

Last updated: 2026-05-16
Default locale: **tr** (Turkish) — Secondary: **en** (English)
Site URL env var: `NEXT_PUBLIC_SITE_URL` (fallback `https://hasari.app`)

---

## 1. IMPLEMENTED (in repo)

### Meta tags & Metadata API (Next.js 15 App Router)
- [x] Root `metadata` in `apps/web/app/layout.tsx`
  - title template (`%s · Hasarİ`), default TR title
  - description (TR, 150-160 chars)
  - keywords array (TR-priority: "araç hasar tespit", "yapay zeka oto ekspertiz", "hasar fiyat hesaplama", "fotoğrafla hasar", "kasko hasar tahmin", "tampon çizik tamir fiyatı", "göçük tamir maliyeti", + EN secondary)
  - authors, creator, publisher, applicationName, category
  - canonical + hreflang (`tr-TR`, `en-US`, `x-default`)
  - robots directives (index/follow, googleBot max-image-preview=large)
  - icons (favicon, apple-touch-icon)
  - formatDetection disabled (email/telephone/address)
- [x] Per-page metadata:
  - `app/page.tsx` — Home (Server Component, direct export)
  - `app/inspect/layout.tsx` — Inspect page (wrapper for client child)
  - `app/(auth)/login/layout.tsx` — Login
  - `app/(auth)/register/layout.tsx` — Register

### Open Graph + Twitter Card
- [x] OG configured in root layout: type=website, siteName, locale=tr_TR, alternateLocale=en_US
- [x] Twitter card: `summary_large_image`, creator=@hasari_app
- [x] OG image generated at edge via `app/opengraph-image.tsx` (1200×630, PNG)
  - Brand mark "H" + "Hasarİ" wordmark + tagline
  - Headline: "Araç hasarını fotoğraftan tespit et."
  - Feature chips: 20+ parça, 6 hasar sınıfı, < 8 sn analiz, Türkiye fiyat tabanı
  - Gradient background (#0b3aa8 → #4c9fff)
- [x] `app/twitter-image.tsx` re-exports the OG image

### Sitemap & robots
- [x] `app/sitemap.ts` (dynamic) — `/`, `/inspect`, `/login`, `/register` with hreflang alternates
- [x] `app/robots.ts` (dynamic) — Allow `/`, Disallow `/api/`, `/dashboard`, `/admin`, `/inspections/`, `/settings`, `/_next/`, references sitemap, declares host
- [x] Optional block for LLM scraper bots (commented; enable if desired)

### Structured data (JSON-LD)
- [x] `WebApplication` + `Organization` + `WebSite` `@graph` in root layout
- [x] `inLanguage: ['tr-TR', 'en-US']` for bilingual signal
- [x] Offer price 0 TRY (free MVP), applicationCategory: BusinessApplication

### i18n SEO
- [x] hreflang alternates declared (tr, en, x-default)
- [x] `<html lang>` set from runtime locale
- [x] Cookie-based locale switching preserves canonical URL (no per-language URL prefix needed)

---

## 2. MANUAL STEPS (do BEFORE launch / after deploy)

### Required assets — drop into `apps/web/public/`
- [ ] `favicon.ico` (32×32 + 16×16 multi-resolution)
- [ ] `icon.png` (512×512 for schema.org Organization.logo)
- [ ] `apple-touch-icon.png` (180×180)
- [ ] `manifest.webmanifest` if PWA later

### Environment variables (production)
- [ ] Set `NEXT_PUBLIC_SITE_URL=https://hasari.app` (or final domain) in Vercel / hosting
- [ ] Verify `metadataBase` resolves to HTTPS production URL

### Google Search Console
- [ ] Create property at https://search.google.com/search-console (Domain property preferred — covers all subdomains)
- [ ] Verify via DNS TXT record (preferred) or HTML tag (paste verification code into `metadata.verification.google` in `layout.tsx`)
- [ ] Submit sitemap: `https://hasari.app/sitemap.xml`
- [ ] Enable email alerts (Manual Actions, Core Web Vitals regressions)
- [ ] Check Index Coverage report 48h after submit
- [ ] Validate hreflang via "International Targeting" report

### Bing Webmaster Tools
- [ ] Register at https://www.bing.com/webmasters
- [ ] Import from Search Console (one-click) OR verify via meta tag (paste into `metadata.verification.other['msvalidate.01']`)
- [ ] Submit sitemap

### Yandex Webmaster (Turkish market secondary)
- [ ] https://webmaster.yandex.com — register + verify (TR audience uses Yandex marginally)

### Analytics & tag setup
- [ ] Install GA4 (or Plausible/Umami for privacy-first) — track organic landing pages
- [ ] Link GA4 ↔ Search Console for unified reporting
- [ ] Set up GTM if planning multiple tags

### Social & profile setup (E-E-A-T signals)
- [ ] Twitter/X account `@hasari_app` (or update handle in `metadata.twitter.creator`)
- [ ] LinkedIn company page
- [ ] Add real `sameAs` URLs to `Organization` JSON-LD in `layout.tsx`
- [ ] Author entity pages with credentials (when blog launches)

### Performance & Core Web Vitals
- [ ] Run Lighthouse on production URL — target SEO ≥ 95, Performance ≥ 90
- [ ] Validate LCP < 2.5s, INP < 200ms, CLS < 0.1 (mobile + desktop)
- [ ] Audit images: ensure `next/image` everywhere, AVIF/WebP enabled
- [ ] Preconnect to API origin if used above the fold

### Rich Results Test (validation)
- [ ] https://search.google.com/test/rich-results — paste prod URL
- [ ] Confirm WebApplication + Organization + WebSite parsed without errors
- [ ] https://validator.schema.org for structural validation
- [ ] Twitter Card Validator (X): https://cards-dev.twitter.com/validator

### Content roadmap (post-launch — weeks 2-12)
- [ ] Blog/Knowledge base under `/rehber` or `/blog` for topical authority
  - Target clusters: "tampon çizik tamir fiyatı", "kasko hasar süreci", "göçük çıkartma yöntemleri", "ön cam değişim fiyatı"
- [ ] FAQ schema on home + inspect page (use existing copy)
- [ ] HowTo schema on inspect page ("Aracını nasıl çekersin?" steps)
- [ ] Original data study: "2026 Türkiye'de tampon onarım fiyatları" — linkable asset for digital PR

### Penalties / risks to watch
- [ ] Avoid duplicate content if `/dashboard` thin pages get accidentally indexed (robots.ts blocks them but add `noindex` meta on those pages too)
- [ ] Monitor Search Console "Soft 404" and "Crawled — currently not indexed" buckets monthly

---

## 3. NICE-TO-HAVE (not blocking launch)

- [ ] PWA `manifest.webmanifest` + service worker for re-engagement
- [ ] BreadcrumbList schema once `/blog/[slug]` and `/inspections/[id]` exist publicly
- [ ] VideoObject schema if product demo video added to home hero
- [ ] Speakable schema for FAQ (voice search readiness)
- [ ] hreflang verified via Merkle hreflang tester
- [ ] IndexNow integration for Bing/Yandex instant indexing of new pages

---

## 4. FILE INVENTORY (created/edited in this pass)

Edited:
- `apps/web/app/layout.tsx`
- `apps/web/app/page.tsx`

Created:
- `apps/web/app/sitemap.ts`
- `apps/web/app/robots.ts`
- `apps/web/app/opengraph-image.tsx`
- `apps/web/app/twitter-image.tsx`
- `apps/web/app/inspect/layout.tsx`
- `apps/web/app/(auth)/login/layout.tsx`
- `apps/web/app/(auth)/register/layout.tsx`
- `docs/SEO_CHECKLIST.md` (this file)