iap-finalizer
Take a one-time in-app purchase from MISSING_METADATA to READY_TO_SUBMIT in App Store Connect — set its price schedule and localized display name/de…
它会碰到什么
这一栏是扫描器报的事实,不是结论。命中多不等于有毒(安全工具、规则库、示例脚本本来就会包含危险写法),命中少也不等于干净。它和你手上的凭据、文件、网络有什么关系,需要你自己看。
技能内容
IAP Finalizer
Finish a one-time in-app purchase on the store side: price + localization, the two fields the asc-metadata MCP can't set (it exposes only reference name / review note / family-sharing). Moves an IAP from MISSING_METADATA → READY_TO_SUBMIT so it can ship with the build.
> This finalizes; it does not define. The product id, tier, and price decision come from Phase 4 (Monetization / StoreKit). The ASC IAP record must already exist (created via the MCP create_iap or the ASC UI). This skill sets the metadata on that existing record.
Where it fits (read the seams)
- Not Phase 4. Phase 4 builds the IAP into the app (StoreKit 2, paywall) and decides the price. This is Phase 6 store-metadata finalization.
- Price = one source of truth. Do not re-ask the price. Read it from the monetization decision in
.planning/(e.g.MONETIZATION.md/PLAN.md); only confirm it. Re-eliciting risks drift from the paywall/StoreKit price. - Not
promoted-iap. That generator displays promoted IAPs in-app; this sets ASC price/localization. Different jobs. - One-time IAPs only. Subscriptions are a separate ASC flow (groups/offers) — out of scope here.
Prerequisites
_shared/asc-api/set up (see its README — key +~/.appstoreconnect/).- Set
ASC="python3 <path to asc.py>".asc.pylives at_shared/asc-api/asc.pyunder the sameskills/root as this skill — resolve it relative to this SKILL.md file's location (../../_shared/asc-api/asc.pyfrom this skill's directory), never relative to the project cwd (skills run with cwd = the user's project). Known install locations: - SwiftShip symlink install:
~/.claude/swiftship-skills/_shared/asc-api/asc.py - Copied install:
.claude/skills/_shared/asc-api/asc.py(project) or~/.claude/skills/_shared/asc-api/asc.py(global) - Plugin install: resolve from this file's location — the
_shared/tree ships with the plugin. - The IAP already exists in ASC. Get its id with the MCP:
list_iap→ pick the product. - Price decided in Phase 4. Read it from
.planning/and confirm — don't invent it.
Flow — dry-run → confirm → apply
- Confirm state. MCP
get_iap→ current state +productId. Read the target price + Display Name (≤30) + Description (≤45) from.planning/; confirm with the user viaAskUserQuestionif anything is missing. - Find the price point.
$ASC GET "/v1/inAppPurchases/<IAP_ID>/pricePoints?filter[territory]=USA"
Pick the inAppPurchasePricePoint id whose customerPrice matches the target tier (e.g. 6.99).
- Set the price (one-time IAPs use price schedules):
$ASC POST /v1/inAppPurchasePriceSchedules @price.json # dry-run: review the body
$ASC POST /v1/inAppPurchasePriceSchedules @price.json --apply # after you confirm
Body: data relationships inAppPurchase→{IAP_ID}, baseTerritory→USA, manualPrices→[new inAppPurchasePrices]; included a new inAppPurchasePrices referencing the price point with startDate: null (="now").
- Set the localization:
$ASC POST /v1/inAppPurchaseLocalizations '{"data":{"type":"inAppPurchaseLocalizations","attributes":{"locale":"en-US","name":"<=30","description":"<=45"},"relationships":{"inAppPurchase":{"data":{"type":"inAppPurchases","id":"<IAP_ID>"}}}}}' --apply
PATCH the existing localization id instead if one already exists.
- Review screenshot (optional):
POST /v1/inAppPurchaseAppStoreReviewScreenshots— the 3-step ASC upload (reserve → upload bytes → commit). - Verify: MCP
get_iap→ state no longerMISSING_METADATA.
Done
- IAP priced + localized in ASC; state advanced; ready to submit with the build.
Caveats
- Verify each endpoint/field against the current ASC API reference before
--apply(captured 2026-07). - Every write is dry-run first — show the body, confirm, then
--apply. Never--applya price the user hasn't seen. - One-time IAPs only. Subscriptions → the MCP
create_subscription*tools + a separate flow.
想直接用这个技能?
本站把开放许可(MIT / Apache 等)的技能按仓库打包整理到网盘,点一下转存到你自己的网盘,不用一个个从 GitHub 拉。许可未声明的技能只给原始仓库链接,不打包。
它属于哪个仓库
skills/app-store/iap-finalizer/SKILL.md