Skip to main content

Configuration

Configuration is stored at ~/.config/kappmaker/config.json.

Managing Config

kappmaker config init # Interactive setup
kappmaker config list # Show all values
kappmaker config set <key> <value> # Set a value
kappmaker config get <key> # Get a value
kappmaker config path # Show config file path

App Store Defaults

kappmaker config appstore-defaults # View App Store defaults
kappmaker config appstore-defaults --init # Set up API key + review contact (backfills missing credit-pack IAPs from template)
kappmaker config appstore-defaults --save ./config.json # Save as global defaults

Adapty Defaults

kappmaker config adapty-defaults # View Adapty defaults
kappmaker config adapty-defaults --init # Initialize from template (subs + 3 credit packs + Credits Paywall + credits_pack placement)
kappmaker config adapty-defaults --save ./config.json # Save as global defaults

--init is idempotent — running it against an existing defaults file backfills any missing arrays from the built-in template (e.g. in_app_purchases for ASC, or products / paywalls / placements for Adapty) so upgrades from earlier KAppMaker versions don't silently lose credit-pack support.

Config Keys

KeyDescriptionDefault
templateRepoTemplate repository Git URLKAppMaker template
bundleIdPrefixBundle/package ID prefix (e.g., com.measify)com.<appname>
androidSdkPathAndroid SDK location~/Library/Android/sdk
organizationOrganization for Fastlane signingApp name
falApiKeyfal.ai API key
imgbbApiKeyimgbb API key
openaiApiKeyOpenAI API key (only for --prompt flows without --spec)
ascAuthNameASC keychain credential nameKAppMaker
ascKeyIdApp Store Connect API Key ID
ascIssuerIdApp Store Connect Issuer ID
ascPrivateKeyPathPath to .p8 private key
appleIdApple ID email
googleServiceAccountPathGoogle Play service account JSON~/credentials/google-service-app-publisher.json

Global Defaults

FileUsed byManage with
~/.config/kappmaker/appstore-defaults.jsoncreate-appstore-appconfig appstore-defaults --init (interactive) or --save <file>
~/.config/kappmaker/adapty-defaults.jsonadapty setupconfig adapty-defaults --init (template-based) or --save <file>

Global defaults are merged as a base layer so shared settings (review contact, privacy, subscriptions, etc.) don't need to be re-entered per app.

Config Resolution Order

For App Store Connect and Adapty, configuration is resolved by deep-merging layers (later overrides earlier):

  1. Built-in template — sensible defaults (age rating, privacy, encryption, subscriptions)
  2. Global defaults — shared settings across all your apps
  3. Local config (e.g., ./Assets/appstore-config.json) — per-project overrides
  4. Interactive prompts — only for fields still empty

Subscription Product ID Alignment

Subscription IDs are auto-generated so App Store Connect, Google Play, and Adapty all link automatically:

PlatformFieldFormatExample ($6.99 weekly)
App Store ConnectproductId{appname}.premium.{period}.v1.{price}.v1myapp.premium.weekly.v1.699.v1
Google PlayproductId{appname}.premium.{period}.v1myapp.premium.weekly.v1
Google PlaybasePlanIdautorenew-{period}-{priceDigits}-v1autorenew-weekly-699-v1
Adaptyios_product_idmatches ASC productIdmyapp.premium.weekly.v1.699.v1
Adaptyandroid_product_idmatches Play productIdmyapp.premium.weekly.v1
Adaptyandroid_base_plan_idmatches Play basePlanIdautorenew-weekly-699-v1

priceDigits is the price with the decimal removed (e.g., 6.99699). {period} is one of weekly, monthly, twomonths, quarterly, semiannual, yearly.

Per-region PPP pricing (1.6.0+)

KAppMaker fans out every subscription and one-time IAP to all supported regions/territories on Google Play (~175) and App Store Connect (~155) with purchasing-power-parity-adjusted prices, not a single global USD amount. The multipliers come from a Steam/Spotify-inspired tier table (iosdevmax/ppp-pricing, MIT).

TierMultiplierSample regions
Very low0.30AR, EG, PK, BD, NG, KE
Low0.35IN, VN, PH, ID, UA, KZ
Lower-mid0.45BR, TR, TH, MY, CO, RO, BG
Mid0.60MX, ZA, CL, PL, HU, GR, PT, CZ
Upper-mid0.80KR, JP, TW, ES, IT, IL, SA, AE
Base1.00US, CA, GB, AU, NZ, FR, DE, NL, SG
High1.10CH, NO, DK, SE, FI, IS, LU

Prices round to .99 endings (e.g. $4.99 × 0.35 = $1.99 in IN). Regions outside the table fall back via a closest-neighbour lookup; anything still missing uses 0.60.

Override rule

Any region/territory you list explicitly in regional_configs (Play) or prices (ASC) wins. PPP fills only the regions/territories you didn't list:

"regional_configs": [
{ "region_code": "US", "price": "6.99", "currency_code": "USD" },
{ "region_code": "DE", "price": "5.99", "currency_code": "EUR" }
]

Above: US gets $6.99, DE keeps 5.99 EUR, every other Play region gets a PPP-adjusted USD price derived from your $6.99 anchor.

Opt-out

Set "ppp_enabled": false on any base plan, IAP, or subscription entry to skip the fan-out:

{ "ppp_enabled": false, "regional_configs": [...] }

That entry stays restricted to the regions/territories you listed, no automatic fan-out.

Smoke test

npm run test:ppp

Runs 16 assertions covering multiplier lookup, .99 rounding, fan-out length, and exclusion-set behaviour.

Currency model

  • Google Play: every region gets a USD price; Google's convertRegionPrices displays each region's local currency to buyers at runtime via the configured exchange table.
  • App Store Connect: Apple uses fixed price-point tiers per territory. For each (territory, PPP-adjusted USD) pair the CLI resolves to the closest price-point in that territory's catalog (territory catalogs are cached per session so each is fetched once).

Credit Pack (IAP) Product ID Alignment

Default consumable in-app purchases (credit packs) ship in all three templates. Auto-fill triggers on any IAP/product entry with a numeric credits field, and the same product ID is used on App Store Connect, Google Play, and Adapty so app code only needs one constant.

FieldFormatExample (10 credits, $4.99)
ASC product_idcredit_pack_{credits}_{priceDigits}_{appname}credit_pack_10_499_myapp
Play skusamecredit_pack_10_499_myapp
Adapty ios_product_id / android_product_idsamecredit_pack_10_499_myapp
ASC ref_name{AppName} {LocalizedName} v1 ({price})MyApp Basic Credit Pack v1 (4.99)

Default credit packs: Basic — 10 credits / $4.99, Pro — 30 credits / $9.99, Ultimate — 80 credits / $19.99.

The Adapty template also adds a Credits Paywall (linking the three credit pack products) and a Credits placement (developer_id credits_pack). Fetch with Adapty.getPaywall("credits_pack").