01 / COMPLETE METADATA REFERENCE

All six App Store Connect localization fields compared

In Searchbop’s validator ([`packages/core/src/aso/rules.ts`](file:///Users/tarik/Desktop/TengrX-SEO/packages/core/src/aso/rules.ts)), every draft is checked against the exact measurement unit Apple’s API enforces:

Field (`AsoListingFields`) Max Limit Measurement Unit in Code Editable Without New App Version?
Title (title) 30 Unicode code points ([...value].length) No — requires an editable version (`PREPARE_FOR_SUBMISSION`)
Subtitle (subtitle) 30 Unicode code points ([...value].length) No — requires an editable version (`PREPARE_FOR_SUBMISSION`)
Keywords (keywords) 100 UTF-8 Bytes (new TextEncoder().encode(value).length) No — requires an editable version (`PREPARE_FOR_SUBMISSION`)
Promotional Text (promotionalText) 170 Unicode code points ([...value].length) Yes — can be updated on a live version at any time
Description (description) 4,000 Unicode code points ([...value].length) No — locked once version is `READY_FOR_SALE`
What’s New (whatsNew) 4,000 Unicode code points ([...value].length) Editable on version updates (`1.0.1`+); skipped on initial `1.0` release
02 / THE 100-BYTE UTF-8 TRAP

Why standard LLM prompts overflow your Keyword field in non-English locales

When you ask a generic chatbot to “generate 100 characters of German, Turkish, or Japanese App Store keywords,” the model counts characters. Here is what happens when UTF-8 encoding hits App Store Connect:

Searchbop’s [`fieldLength()`](file:///Users/tarik/Desktop/TengrX-SEO/packages/core/src/aso/rules.ts#L23) function measures `keywords` strictly in UTF-8 bytes and passes that exact constraint to your AI model when drafting localized listings—even automatically trimming trailing keywords if an AI model slightly overshoots the 100-byte ceiling.

03 / DIACRITIC FOLDING & OVERLAP

Catching hidden duplicates like “Kur’an”, “Kuran”, and Title repeats

To a human or a search engine, variations that differ only by an apostrophe or diacritic (for example, Kur'an, Kur’an, and Kuran, or café and cafe) represent the same root word. Searchbop normalizes words using Unicode `NFKD` decomposition (`s.normalize("NFKD").replace(/\p{M}/gu, "").replace(/ı/g, "i").replace(/['’]/g, "").toLowerCase()`) before running three automatic checks:

EXACT VALIDATION CHECKS RUN ON EVERY LISTING DRAFTpackages/core/src/aso/rules.ts
Check 1 — Comma Space Waste:
if (/,\s/.test(fields.keywords))
  warn("Remove spaces after commas. They use up the 100 bytes.");

Check 2 — Internal Keyword Field Repetition:
Counts every normalized word across your comma-separated keywords.
If "tracker" appears in "habit tracker,water tracker", warns:
  "Repeated words waste space: tracker."

Check 3 — Title & Subtitle Overlap:
Compares every word in `keywords` against the words already present in `title` + `subtitle`.
If overlap exists, warns:
  "Already in the title or subtitle: [words]."
04 / APP REVIEW REJECTION TRIGGERS

Why you should never put “#1”, “Best”, “Free”, or “Discount” in your Title or Subtitle

Under Apple’s App Store Review Guidelines (Section 2.3.7), app titles and subtitles must not include unverifiable ranking claims or pricing/promotional terms that can become inaccurate. Searchbop scans both `title` and `subtitle` against common rejection triggers (`#1`, `No. 1`, `best`, `top rated`, `free`, `discount`, plus localized equivalents like `en iyi`, `ücretsiz`, `birinci`) and flags a warning before you push your draft to App Store Connect.

Honest boundaries & official sources

Live validation before API push: Searchbop runs `listingIssues()` and `keywordCoverage()` locally in your browser and desktop app in real time as you type or generate AI drafts. Reference: Apple App Store Product Page Guidelines.

Research context & search queries covered on this page Metadata Rules · P1

Cluster & intent: app-store-metadata-limits (Informational · P1) · Target queries: app store keyword field, app store connect keyword field, app store title and subtitle character limit, app store subtitle character limit, app store connect keywords 100 bytes.