The AppActor SDK purchase path is offering-first: fetch offerings, pick an offering, render packages, purchase a package.
Fetch the current offering
Usecurrent for the default paywall. The dashboard decides which offering is current for the project, so your app does not need a release to change the default package set.
Dashboard creation checklist
For the first offering, create a small, obvious setup:- Offering ID or lookup key:
default. - Current offering: enabled.
- Package slots:
monthlyandannual. - Package order: monthly first or annual first, matching your paywall design.
- Product mapping: each package maps to the correct iOS and Android product.
- Metadata: optional labels such as
badge: "Best value"or placement-specific copy.
offerings.current.monthly, both the current offering and the monthly package slot must exist for the running platform.
Use package helpers
Package helpers are convenient, but they only exist when the dashboard package slot exists.monthly is null, the SDK is usually telling you the dashboard offering does not contain a monthly package for that app/platform.
Fetch by offering id or lookup key
Usecurrent for most paywalls. Use explicit IDs or lookup keys only when the product design needs a specific surface, such as onboarding versus settings.
Use cached and fallback offerings deliberately
Wrappers expose cached offerings for fast UI and fallback offerings for offline resilience:Troubleshooting empty offerings
Empty offerings are almost always a configuration issue, not a rendering issue. Check:- the app uses the right public app SDK key
- the project has a current offering
- the offering has at least one package
- package products exist for the running platform
- products are available in App Store Connect or Google Play for the tester account
- the package’s products are attached to the entitlement you check after purchase