Onboarding live apps without owner questions for what the stores and the code prove: storebound onboard imports the live products and subscriptions with USD / base prices (catalog diff clean), contact values, the App Review contact and demo account (credentials.json, masked), sign-in for review from Apple's review detail and auth code, and the account deletion page from the app's site; App Store keywords count characters (live fields up to 265 bytes accepted); validate accepts the 6.5-inch iPhone set and Play's default-language graphics fallback; Play Reporting API off gives the project's enable link and apps list falls back to local apps; accounts default <profile>; store-only apps (apps add --store --app-id) shown read-only in the desktop (pitfalls 43-52)
This commit is contained in:
parent
d2ce185441
commit
e5f148e534
55 changed files with 1648 additions and 158 deletions
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
name: store-pitfalls
|
||||
description: Known pitfalls with App Store Connect, Google Play and storebound itself, learned from real releases, and what to do about each - first: do the work, don't ask the owner for every step; store lists that lag right after a create, dry runs that print a count instead of a plan, App Store names taken on a storefront, keyword limits in bytes, Data safety answers without code evidence, missing font glyphs in screenshots, console sign-in and sessions, Capacitor monorepo plugins, duplicates from retries and re-runs, search ranks that are only a trend, no Play search API, Play's Create app form (no API, opener and submit share a name, Free is final), App Privacy purposes over-mapped (Play advertising is Third-Party Advertising only), an unknown console page, a signed-in console read as a sign-in page, console forms driven agent-first, stale Capacitor web assets, a declined flow step logged ok. Read it before any store task, and when a store command does something you did not expect.
|
||||
description: Known pitfalls with App Store Connect, Google Play and storebound itself, learned from real releases, and what to do about each - first: do the work, don't ask the owner for every step; store lists that lag right after a create, dry runs that print a count instead of a plan, App Store names taken on a storefront, keyword limits in characters (not bytes), Data safety answers without code evidence, missing font glyphs in screenshots, console sign-in and sessions, Capacitor monorepo plugins, duplicates from retries and re-runs, search ranks that are only a trend, no Play search API, Play's Create app form (no API, opener and submit share a name, Free is final), App Privacy purposes over-mapped (Play advertising is Third-Party Advertising only), an unknown console page, a signed-in console read as a sign-in page, console forms driven agent-first, stale Capacitor web assets, a declined flow step logged ok. Read it before any store task, and when a store command does something you did not expect.
|
||||
---
|
||||
|
||||
# Store pitfalls
|
||||
|
|
@ -41,11 +41,8 @@ testers) and answers, in ONE batch at the start, only the facts no file proves (
|
|||
keep `app.name` for Play and the brand. Do not pick the suffix yourself.
|
||||
- **Guard:** `apple.name` overrides the App Store name.
|
||||
|
||||
## 4. Keyword field "too long" at fewer than 100 characters
|
||||
- **Symptom:** App Store Connect rejects keywords that look short enough, mostly in Turkish, German, CJK.
|
||||
- **Cause:** the 100 limit counts UTF-8 bytes, not characters ("ş" is 2 bytes, a CJK character 3).
|
||||
- **Do:** shorten by bytes; drop words, not commas.
|
||||
- **Guard:** `storebound check` counts bytes for keywords.
|
||||
## 4. Keyword field length (superseded by 43)
|
||||
- The limit is 100 characters, not UTF-8 bytes (see 43). Count characters; drop whole words, not commas.
|
||||
|
||||
## 5. Data safety says "email collected" for an app that never asks for one
|
||||
- **Symptom:** the proposal marks email (or phone) as collected because the app has accounts.
|
||||
|
|
@ -564,3 +561,68 @@ that fails without the fix (see CONTRIBUTING.md).
|
|||
- **Guard:** `tests/asc-query-guard.test.ts` (every App Store Connect GET with a query in `cli/` against the spec and
|
||||
`APPLE_LIVE_REJECTED`), the fake App Store Connect's 400 for such parameters, `unknownGroupMessage`;
|
||||
`tests/idempotency.test.ts` (distribute), `tests/testflight.test.ts`.
|
||||
|
||||
## 43. Keyword field: 100 characters, not bytes
|
||||
- **Symptom:** `check` / `listing check` / `check --aso` called live keyword fields too long ("105 bytes > 100") that App
|
||||
Store Connect accepted.
|
||||
- **Cause:** App Store Connect counts characters. Live READY_FOR_SALE versions (read 2026-10-13): Thai 95 characters /
|
||||
265 bytes, Russian 91 / 169, Turkish 100 / 105, Polish 99 / 105. Entry 4 (bytes) was wrong.
|
||||
- **Do:** count characters (`[...text].length`); fill up to 100 characters in any script.
|
||||
- **Guard:** every keyword check counts characters (`cli/lib/copy.ts`, `aso.ts`, `listing-translate.ts`,
|
||||
`aso-intel.ts`); tests with Thai, Turkish and Polish fields over 100 bytes.
|
||||
|
||||
## 44. "No 6.7-inch iPhone screenshots" on a live app with the 6.5-inch set
|
||||
- **Symptom:** `validate` blocked every locale of a live app: "en-US: no APP_IPHONE_67 screenshots".
|
||||
- **Cause:** App Store Connect requires the 6.9" set (APP_IPHONE_67) or, when it is missing, the 6.5" set
|
||||
(APP_IPHONE_65), and scales the smaller sizes from it.
|
||||
- **Do:** treat the 6.5" set as meeting the requirement; adding a 6.9" set is a recommendation.
|
||||
- **Guard:** `ACCEPTED_INSTEAD` in `cli/lib/validate-rules.ts` (a warning `screenshots-size`, no blocker).
|
||||
|
||||
## 45. Play graphics missing in extra languages
|
||||
- **Symptom:** `validate --play` listed an icon and a feature graphic blocker for every non-default language.
|
||||
- **Cause:** Play shows the default language's graphics in a language that has none of its own.
|
||||
- **Do:** only the default language's graphics are required; a language with none uses them (a note).
|
||||
- **Guard:** `playRules` (`images-fallback` note per type).
|
||||
|
||||
## 46. Play Developer Reporting API off
|
||||
- **Symptom:** `apps list --store play` and Play vitals failed with a 403 SERVICE_DISABLED.
|
||||
- **Cause:** the Reporting API is not enabled in the service account's Google Cloud project.
|
||||
- **Do:** open the link the finding prints (`…/playdeveloperreporting.googleapis.com?project=<id>`), press Enable,
|
||||
wait a few minutes. Meanwhile `apps list` shows the Play apps of this machine's folders and store-only entries.
|
||||
- **Guard:** `reportingEnableUrl`, `knownPlayPackages` (`cli/apps.ts`), `healthFindings`.
|
||||
|
||||
## 47. Onboarding a live app left its products out ("no USD prices")
|
||||
- **Symptom:** after `init` + `listing pull` the config had no products although the app sells some.
|
||||
- **Cause:** only texts were pulled, never prices; Apple's price schedule can have a base territory other than the USA.
|
||||
- **Do:** `storebound onboard` (then `--write`): products and subscriptions from both stores with usd = the US price,
|
||||
Apple's base territory as an override, one-store items marked with `platforms`. Then `storebound catalog diff`
|
||||
(clean). Store prices are never changed; an item with no USD price anywhere is named with its base price.
|
||||
- **Guard:** `importCatalog` (`cli/lib/onboard.ts`), `tests/onboard.test.ts`.
|
||||
|
||||
## 48. Contact e-mail, website and App Review contact asked of the owner
|
||||
- **Symptom:** onboarding kept `support@example.com` and asked for the website and review contact.
|
||||
- **Cause:** nothing read Play's app details or App Store Connect's review detail.
|
||||
- **Do:** `storebound onboard` reads them; template values are replaced, real ones kept; the review contact goes to
|
||||
`.storebound/credentials.json` (masked in output, the phone never printed).
|
||||
- **Guard:** `contactProposal`, `reviewContactOf`, `maskContact`.
|
||||
|
||||
## 49. Sign-in for review defaulted to yes
|
||||
- **Symptom:** every onboarded app got "sign-in required: add a demo account".
|
||||
- **Do:** decide from Apple's review detail (`demoAccountRequired`; a demo account there is imported, never printed)
|
||||
and from the code's auth signals; ask only when neither proves it.
|
||||
- **Guard:** `signInDecision`.
|
||||
|
||||
## 50. Account deletion URL asked although the site has the page
|
||||
- **Do:** `storebound onboard` tries /delete-account, /account/delete, /delete, /account-deletion and the privacy
|
||||
policy's deletion links; not found is reported as the real gap it is (Play requires the page). Never invent one.
|
||||
- **Guard:** `findDeletionUrl`.
|
||||
|
||||
## 51. No default credential profile except one named "default"
|
||||
- **Do:** `storebound accounts default <profile>` (`--clear`). Order: env > the project's named profile > the
|
||||
project's own keys > this default > the only profile.
|
||||
- **Guard:** `defaultProfile`, `tests/machine.test.ts`.
|
||||
|
||||
## 52. A live app with no local project is missing from the desktop
|
||||
- **Do:** `storebound apps add --store apple --app-id <id> --account <profile>`; the desktop shows it read-only
|
||||
("Store only": status, reviews, analytics). `apps remove apple:<id>` takes it out.
|
||||
- **Guard:** `storeApps` in `~/.storebound/projects.json` (`cli/lib/registry.ts`, `registry.rs`), the boot check.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue