Install any skill in seconds. Free to start, no credit card required.
Get Started Free →rshankras/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/description (and optional review screenshot) via the ASC REST API. Use at Phase 6 (Pre-Release), after the IAP is built in-app (Phase 4) and its ASC record exists. NOT for subscriptions, and NOT the same as promoted-iap (which displays IAPs in-app).
Passed 16 of 21 test cases with the skill, and 9 of 21 without it.
and 5 more in the full report
8 fixed9 passed either way5 still failing0 broke
Tokens, turns and time describe resource use, not a dollar price.
One of 8 test cases the skill fixed. Same model, same prompt, with and without the skill.
In the price schedule JSON body, what country code is assigned to the base territory relationship object?
| Checked | Without skill | With skill |
|---|---|---|
| The response sets USA as the base territory relationship identifier. | Missed | Passed |
The instructions your model reads when the skill loads.
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_iapor the ASC UI). This skill sets the metadata on that existing record.
.planning/ (e.g. MONETIZATION.md / PLAN.md); only confirm it. Re-eliciting risks drift from the paywall/StoreKit price.promoted-iap. That generator displays promoted IAPs in-app; this sets ASC price/localization. Different jobs._shared/asc-api/ set up (see its README — key + ~/.appstoreconnect/).ASC="python3 <path to asc.py>". asc.py lives at _shared/asc-api/asc.py under the same skills/ root as this skill — resolve it relative to this SKILL.md file's location (../../_shared/asc-api/asc.py from this skill's directory), never relative to the project cwd (skills run with cwd = the user's project). Known install locations:
~/.claude/swiftship-skills/_shared/asc-api/asc.py.claude/skills/_shared/asc-api/asc.py (project) or ~/.claude/skills/_shared/asc-api/asc.py (global)_shared/ tree ships with the plugin.list_iap → pick the product..planning/ and confirm — don't invent it.get_iap → current state + productId. Read the target price + Display Name (≤30) + Description (≤45) from .planning/; confirm with the user via AskUserQuestion if anything is missing.$ASC GET "/v1/inAppPurchases/<IAP_ID>/pricePoints?filter[territory]=USA"
Pick the inAppPurchasePricePoint id whose customerPrice matches the target tier (e.g. 6.99).$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").$ASC POST /v1/inAppPurchaseLocalizations '{"data":{"type":"inAppPurchaseLocalizations","attributes":{"locale":"en-US","name":"<=30","description":"<=45"},"relationships":{"inAppPurchase":{"data":{"type":"inAppPurchases","id":"<IAP_ID>"}}}}}' --apply
test cases passed, vs 9 / 21 without
More skills from the same source and nearby in the registry, with their headline benchmark lift.