Skip to main content
This guide takes you from zero to a working prepaid flow. Choose your backend and frontend below — the narrative is the same for every stack.
Jaza collects Mobile Money across supported African markets and settles USD to you. You do not create an aggregator account or manage multi-currency settlement yourself.

Prerequisites

  • A Jaza developer account
  • Node.js 18+
  • A React Native (Expo) or React web app
  • Sandbox API keys from the dashboard

1. Create an app and copy keys

In the dashboard:
  1. Create an app and enable Countries (Mobile Money markets)
  2. Add at least one feature (e.g. SEND_MESSAGE) and one bundle
  3. Open API keys and copy sandbox keys
Use EXPO_PUBLIC_JAZA_PUBLISHABLE_KEY (or your bundler’s public env) for the publishable key.
Never ship the secret key in a mobile binary, web bundle, or public repo.
When you switch from sandbox to live keys, create a new customerId under live and overwrite it in your user database — test wallets do not carry over. See Authentication → Going live.

2. Install the backend SDK

Create a shared server client:

3. Create a customer

Call once when your user signs up; store customer.id on your user record.

4. Expose a host init route

Your app needs a client session from your backend. Map the signed-in user → Jaza customerId → jaza.init.
The app never calls Jaza with the secret key. It calls your BFF; you call the Node SDK. See Handshake for getSession vs authEndpoint and 401 re-auth.

5. Install the frontend SDK

Peer dependencies (Expo):
Ensure Android resizes with the keyboard (app.json):

6. Wrap the app with JazaProvider

Pass getSession so the SDK loads the client session from your init route. Top-up JWTs are minted internally — no host onRequestToken.

7. Balance, top-up, ledger, and gated actions

  • JazaBalance — credits from the session snapshot / client wallet refresh
  • JazaTopUpButton — opens MoMo checkout; SDK mints the top-up JWT from the session
  • JazaLedger — recent movements (preview or scroll)
  • JazaActionButton — gate only; opens top-up when balance is too low; never debits

8. Meter a feature on the host

JazaActionButton is UX. Real enforcement is always jaza.consume on your backend with the secret key.
For variable usage (e.g. AI tokens), pass both featureCode and credits to override the dashboard default while still attributing the feature. See Consume credits.

Optional: merchant webhooks

Register HTTPS endpoints under App Settings → Webhooks, then verify payloads with jaza.webhooks.constructEvent. See Webhooks.

What you just shipped

  • Client session handshake (no secret in the app)
  • Credit wallet UI + MoMo top-ups without running an aggregator
  • Feature gating in the UI and metering on your backend
Next: Handshake · Authentication · Top-up · Node SDK