hasari-api / docs /SEO_CHECKLIST.md
erdoganpeker's picture
v0.3.0 — multimodal vehicle damage MVP
e327f0d
# 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)