Onside Store Setup
Onside support is currently available in expo-iap. It is an iOS runtime integration for apps distributed through the Onside marketplace, not a React Native, Flutter, KMP, MAUI, or Godot build option.
Required Values#
Onside does not use an Android-style app id. The critical values are the iOS bundle identity and the Expo config flag that decides whether the Onside native module is compiled.
| Value | Where to get it | Where it is used |
|---|---|---|
ios.bundleIdentifier | Your Apple/Expo app configuration and Onside app record. | iOS app identity. It must stay stable across the Onside registration and the app binary you distribute. |
modules.onside | Your Expo config. | Enables the expo-iap Onside module during Expo prebuild and pod installation. |
| Onside app registration | developer.onside.io. | The installed app is recognized as an Onside-distributed app at runtime. App Store installs fall back to Apple StoreKit. |
Store Prerequisites#
- Register the app at developer.onside.io.
- Use an iOS app target with a stable bundle identifier.
- Test on a real iPhone with the Onside Store installed.
- Keep standard Apple IAP configured as the fallback for App Store installs.
Framework Setup#
| Framework | Status | Setup path |
|---|---|---|
| Expo | Supported | Enable modules.onside in the expo-iap config plugin. |
| React Native | Not supported | No Onside native module or config plugin path. |
| Flutter | Not supported | No Onside runtime selector. |
| KMP | Not supported | No Onside runtime selector. |
| MAUI | Not supported | No Onside runtime selector. |
| Godot | Not supported | No Onside runtime selector. |
Expo#
Enable Onside in the config plugin. The plugin updates the Expo module autolinking configuration and Podfile environment so the Onside native module is compiled only when requested.
plugins: [
[
'expo-iap',
{
modules: {
onside: true,
},
},
],
]Run prebuild after changing this option so native autolinking and pods are regenerated:
npx expo prebuild --clean
cd ios && pod installRuntime Selection#
Onside is selected at runtime based on the install source. Block IAP UI until the installation check finishes so the app does not default to Apple before the Onside check completes.
import { useOnside } from 'expo-iap';
export default function App() {
const { isOnsideLoading } = useOnside();
if (isOnsideLoading) return <SplashScreen />;
return <MainApp />;
}Purchase Code#
Purchase calls stay on the normal expo-iap API. The runtime chooses Onside or Apple under the hood:
import { finishTransaction, useIAP } from 'expo-iap';
function StoreScreen() {
const { products, fetchProducts, requestPurchase } = useIAP({
onPurchaseSuccess: (purchase) => {
void finishTransaction({ purchase, isConsumable: false }).catch((error) => {
reportPurchaseError(error);
});
},
onPurchaseError: (error) => {
reportPurchaseError(error);
},
});
return <ProductList products={products} onBuy={requestPurchase} />;
}See Expo Setup for the full config plugin context.