Skip to content

Enterprise Workflows

FWallet is designed for platform teams that operate more than one wallet business. The same backend supports super-admin platform controls, tenant-owner operations, tenant team roles, HMAC integrations, fee schedules, payout approvals, and ledger-backed reconciliation.

Use this page as the implementation checklist for an enterprise demo or first production integration.

Operating Model

ActorDashboardAPI surfaceTypical work
Super adminhttps://admin.fwallet.co.ug/v1/system/* with X-System-KeyCreate organizations, invite tenant admins, review cross-tenant analytics, inspect wallets and ledger transactions, configure platform fee commission.
Tenant ownerhttps://demo.fwallet.co.ug/v1/admin/* and tenant APIs with X-API-KeyManage wallet balances, developers, team members, fees, approvals, tenant float deposits, tenant fee withdrawals, and reconciliation views.
DeveloperTenant dashboard Developers area/v1/developer/*Create apps, create restricted API keys, rotate/revoke keys, inspect request logs, and debug HMAC signatures.
Finance operatorTenant dashboard Operations/Treasury areas/v1/wallets, /v1/deposits, /v1/payouts, /v1/admin/money/*Record deposits, initiate payouts, deposit tenant float, request tenant withdrawals, and review pending cases.
ApproverTenant dashboard Approvals area/v1/payouts/*/approve, /v1/admin/money/withdrawals/*/approveApprove or reject payout and tenant withdrawal cases. Approver must differ from requester.
ObserverTenant dashboard analytics/observer viewsRead-only tenant APIsMonitor activity, balances, errors, and request logs.

Tenant Onboarding

  1. Create the organization.

    A super admin creates the tenant with a default currency, allowed currencies, and transaction limit:

    Terminal window
    curl -X POST https://api.fwallet.co.ug/v1/system/organizations \
    -H "Content-Type: application/json" \
    -H "X-System-Key: $SYSTEM_KEY" \
    -d '{
    "name": "Striker Market",
    "slug": "striker-market",
    "config": {
    "defaultCurrency": "UGX",
    "allowedCurrencies": ["UGX", "USD"],
    "maxTransactionAmount": 50000000
    },
    "admin": {
    "name": "Amina Finance",
    "email": "amina@example.com"
    }
    }'

    This creates the tenant, creates or links an org-admin user, and sends an invite email when email delivery is configured.

  2. Confirm system accounts exist.

    Tenant creation provisions operating accounts per currency, including pool, MoMo clearing, bank clearing, cash clearing, payout clearing, suspense, tenant fee revenue, and FWallet commission accounts.

  3. Create scoped integration keys.

    Tenant admins can create keys from the dashboard Developers area or with POST /v1/developer/api-keys. Production keys should be scoped to the smallest resource set possible and should require request signing for server-to-server money movement.

  4. Invite the operating team.

    Add team members with roles that match the workflows they perform. Do not share one admin account across finance, developer, and approver users.

Team Roles

The tenant team API accepts these roles:

RoleIntended permissions
org-adminFull tenant administration, including team, developer, fees, treasury, and approvals.
operatorDay-to-day wallet, deposit, payout, and reconciliation work.
approverMaker-checker approval for payouts and tenant withdrawals.
developerAPI apps, API keys, request logs, and integration debugging.
finance-viewerRead-only finance, ledger, fee, payout, and reconciliation views.
observerRead-only operational monitoring.
userBasic tenant user account with no administrative assumptions.

Create team members with a tenant-scoped key that includes team:manage:

Terminal window
curl -X POST https://api.fwallet.co.ug/v1/team \
-H "Content-Type: application/json" \
-H "X-API-Key: $TENANT_ADMIN_KEY" \
-d '{
"name": "Daniel Approver",
"email": "daniel@example.com",
"password": "change-me-after-invite",
"orgRole": "approver"
}'

Fee Schedules

Fee schedules are tenant-scoped. Each schedule can contain multiple rules that match by transaction type, currency, amount band, flat fee, percentage fee, min fee, and max fee.

Super admins can set the platform commission share on system fee schedules with platformCommissionBps. Tenant owners can manage tenant fee rules from /v1/admin/fee-schedules. Published default schedules are used for deposits, transfers, payouts, and tenant fee analytics.

Example super-admin fee setup:

Terminal window
curl -X POST https://api.fwallet.co.ug/v1/system/organizations/$TENANT_ID/fee-schedules \
-H "Content-Type: application/json" \
-H "X-System-Key: $SYSTEM_KEY" \
-d '{
"name": "UGX production fees",
"isDefault": false,
"platformCommissionBps": 1000
}'
Terminal window
curl -X POST https://api.fwallet.co.ug/v1/system/organizations/$TENANT_ID/fee-schedules/$SCHEDULE_ID/rules \
-H "Content-Type: application/json" \
-H "X-System-Key: $SYSTEM_KEY" \
-d '{
"transactionType": "payout",
"currencyCode": "UGX",
"flatFee": 500,
"percentageFee": 150,
"minFee": 500,
"maxFee": 10000
}'
Terminal window
curl -X POST https://api.fwallet.co.ug/v1/system/organizations/$TENANT_ID/fee-schedules/$SCHEDULE_ID/publish \
-H "Content-Type: application/json" \
-H "X-System-Key: $SYSTEM_KEY" \
-d '{ "makeDefault": true }'

Tenant Float Deposits

Tenant float is operating money the tenant deposits into the platform for downstream wallet operations. Record tenant float with POST /v1/admin/money/float-deposits.

Terminal window
curl -X POST https://api.fwallet.co.ug/v1/admin/money/float-deposits \
-H "Content-Type: application/json" \
-H "X-API-Key: $TENANT_ADMIN_KEY" \
-H "Idempotency-Key: tenant-float-20260426-001" \
-d '{
"amount": 5000000,
"currencyCode": "UGX",
"rail": "momo",
"externalReference": "MTN-DEP-20260426-001",
"depositedBy": "finance-ops-001",
"note": "Initial operating float"
}'

The ledger records:

DR asset:pool:UGX
CR asset:momo-clearing:UGX

Use GET /v1/admin/money/balances to show operating float, tenant fee revenue, FWallet commission, suspense, and payout clearing balances by currency.

Tenant Fee Withdrawals

Tenants can withdraw earned fee revenue or operating float through a maker-checker flow.

  1. The requester calls POST /v1/admin/money/withdrawals.
  2. FWallet moves the requested amount into suspense.
  3. A different approver calls POST /v1/admin/money/withdrawals/{caseId}/approve.
  4. Approved funds settle into payout clearing for delivery through MoMo, bank, cash, or another payout rail.
  5. Rejected cases reverse the hold back to the original source account.
Terminal window
curl -X POST https://api.fwallet.co.ug/v1/admin/money/withdrawals \
-H "Content-Type: application/json" \
-H "X-API-Key: $TENANT_ADMIN_KEY" \
-H "Idempotency-Key: tenant-fee-withdrawal-001" \
-d '{
"source": "tenant_fees",
"amount": 200000,
"currencyCode": "UGX",
"payoutMethod": "momo",
"requestedBy": "finance-user-001",
"destination": {
"phoneNumber": "+256700100001",
"network": "MTN"
}
}'
Terminal window
curl -X POST https://api.fwallet.co.ug/v1/admin/money/withdrawals/$CASE_ID/approve \
-H "Content-Type: application/json" \
-H "X-API-Key: $TENANT_APPROVER_KEY" \
-d '{ "actorId": "finance-approver-001" }'

User Payout Lifecycle

User payouts use the same maker-checker pattern:

StepEndpointLedger behavior
RequestPOST /v1/payoutsHolds wallet funds and fee in suspense.
List casesGET /v1/payouts/cases?status=pendingShows pending approval cases.
ApprovePOST /v1/payouts/{caseId}/approveSettles suspense into payout clearing.
RejectPOST /v1/payouts/{caseId}/rejectPosts a reversing entry back to the wallet.

Every payout request must include an Idempotency-Key, and the approver’s actorId must differ from the requestedBy value.

Request Signing

Production server-to-server integrations should use HMAC keys. Create them with:

{
"name": "Striker Market backend",
"authMode": "hmac",
"scopes": ["wallets:read", "wallets:create", "transfers:create", "payouts:create", "request_logs:read"],
"environment": "live",
"restrictions": {
"requireRequestSigning": true,
"requireActorHeaders": true
}
}

Signed requests include X-FWallet-Key-Id, X-FWallet-Timestamp, X-FWallet-Nonce, X-FWallet-Content-SHA256, and X-FWallet-Signature. See Request Signing for the canonical request format and code examples.

Reconciliation

FWallet reconciliation starts from the ledger and compares it with external rail evidence:

FlowEvidenceWhat to compare
MoMo depositsProvider webhook or settlement exportExternal transaction ID, phone number, amount, currency, timestamp, wallet credit journal entry.
Bank depositsUploaded bank statement or verified slipBank reference, account, amount, currency, verification user, pool or wallet credit.
PayoutsProvider disbursement reportApproval case ID, payout clearing movement, provider payout reference, final status.
Tenant floatDeposit receipt, MoMo reference, bank statement, or cash receipttenant_float_deposit journal entry, clearing rail, externalReference, operator.
Tenant fee withdrawalsApproval case and payout rail evidenceSuspense hold, approval action, payout clearing settlement, destination.

Use tenant analytics, request logs, audit events, and journal queries together:

  • GET /v1/admin/analytics for tenant fee revenue, volume, liquidity, pending payouts, and request errors.
  • GET /v1/developer/request-logs for API caller, signature, idempotency, status, and correlation IDs.
  • GET /v1/team/audit-events for team and approval audit trails.
  • GET /v1/journal and GET /v1/journal/{id} for immutable ledger entries and lines.

Demo Checklist

To reproduce the enterprise demo:

  1. Create or select a tenant from the super-admin dashboard.
  2. Configure at least one published default fee schedule.
  3. Invite an org-admin, operator, approver, developer, and observer.
  4. Create an HMAC key for the sample app and a read-only observer key.
  5. Deposit tenant float from the Treasury view or POST /v1/admin/money/float-deposits.
  6. Create user wallets, run deposits, transfers, and payout requests.
  7. Approve or reject payout and tenant withdrawal cases with a different actor.
  8. Review tenant analytics, request logs, audit events, and journal lines.