Router.Africa — Build Inventory
What to build for the dashboard: screens, then features. Orgs, workspaces, and multi-user are all included from day one.
Structure: an org owns members and roles. Each org has one or more workspaces. Each workspace has its own currency and its own credit balance, plus its own keys, usage, and logs. The workspace currency decides what the workspace pays in when topping up and which published rates it sees. Balances are always shown as credits, never with a currency symbol or code. Every org gets a “Default” workspace automatically, so a solo user never has to think about it.
Screens
Section titled “Screens”Auth & onboarding
Section titled “Auth & onboarding”| # | Screen | Description |
|---|---|---|
| 1 | Sign up | Email + password, Google/GitHub buttons, one consent checkbox, live password check |
| 2 | Sign in | Email + password or social |
| 3 | Reset password | Request link, set new password |
| 4 | Verify email | Shows the address (editable), resend with countdown |
| 5 | Choose models and currency | Onboarding step. Models pre-checked with defaults. Currency preselected from the user’s country. One click to accept |
| 6 | Your API key | Onboarding step. Key auto-generated in the Default workspace, shown once, copy button, sample curl (same snippet as the docs quickstart). Then lands on Overview |
| 7 | Accept invitation | Landing page for an invite link. Sign in or sign up, then join the org |
Overview
Section titled “Overview”| # | Screen | Description |
|---|---|---|
| 8 | Overview | This workspace’s credit balance, last-24h spend (in credits) and requests, alerts (e.g. low balance), quickstart curl (same snippet as the docs quickstart), link to the API docs, “Add credits” button |
| # | Screen | Description |
|---|---|---|
| 9 | Usage | Spend (credits) / requests / tokens chart with date range and timezone. Breakdown by model, provider, key, member. Toggle: this workspace / all workspaces. Credits from workspaces with different currencies are never summed. “As of a few minutes ago” note |
Request logs
Section titled “Request logs”| # | Screen | Description |
|---|---|---|
| 10 | Logs | Table: time, model, status, latency, tokens, cost (credits), key, member. Filters: workspace, key, model, status, date. Column chooser |
| 11 | Log detail | Side drawer with the full record of one request |
API keys
Section titled “API keys”| # | Screen | Description |
|---|---|---|
| 12 | Key list | Keys in the current workspace: name, owner, status, models enabled, spend vs cap, expiry |
| 13 | Create key | Name, owner (me / workspace), expiry, spend cap (in credits) and reset period, models |
| 14 | Key reveal | Shown once after create or rotate. Copy button, must confirm saved |
| 15 | Key detail | Side drawer. Edit name, cap, models, expiry. Rotate, revoke |
Billing (per workspace)
Section titled “Billing (per workspace)”| # | Screen | Description |
|---|---|---|
| 16 | Balance | This workspace’s credit balance, active holds, “Add credits” and “Transfer credits” buttons |
| 17 | Top-up | Customer enters the credit amount. Screen shows credits, the transaction fee, and the total to pay, collected in the workspace currency via Niobi. Pending / success / failed states |
| 18 | Transfer credits | Move credits from this workspace to another in the same org. Same currency: 1 for 1. Different currency: shows how many credits the destination receives at one final conversion rate, then confirm. The rate is fixed at confirm |
| 19 | Transactions | Top-ups (credits, fee, total collected), transfers, settlements, holds released. Toggle: this workspace / all workspaces |
| 20 | Rates | Published per-model, per-token-type final rate in credits per token, for this workspace’s currency. One number each |
| 21 | Billing details | Org-level. Name, country, address, tax ID. Shown before the first top-up |
Workspaces
Section titled “Workspaces”| # | Screen | Description |
|---|---|---|
| 22 | Workspaces list | Name, currency, credit balance, key count, member count. No cross-workspace total. “New workspace” button |
| 23 | Create workspace | Name, currency, members. Currency is fixed after the first top-up. Optionally fund it by transferring credits |
| 24 | Workspace settings | Name, currency (read-only once funded), delete. Delete requires moving the remaining balance out first. Can’t delete the last workspace |
| 25 | Workspace members | Who has access to this workspace. Add or remove org members |
Team (org level)
Section titled “Team (org level)”| # | Screen | Description |
|---|---|---|
| 26 | Members | Table: member, org role, workspaces, key count. Invite, change role, remove |
| 27 | Invitations | Pending invites. Resend, revoke |
| 28 | Remove member | Dialog. Revoke their keys or reassign them |
Settings
Section titled “Settings”| # | Screen | Description |
|---|---|---|
| 29 | Profile | Name, email |
| 30 | Security | Password, linked social logins, log out everywhere |
| 31 | Organization | Name, transfer ownership, delete org |
| 32 | Data & privacy | Prompt/response retention opt-out (on by default), set per workspace, for the current workspace |
| 33 | Notifications | Low-balance threshold (in credits) and email, set per workspace |
| # | Screen | Description |
|---|---|---|
| 34 | Org switcher | Top-left dropdown. Switch org, create org |
| 35 | Workspace switcher | Sidebar dropdown showing each workspace’s currency. Switch workspace, create workspace |
| 36 | Empty, error, no-access states | 404, “you don’t have access”, empty tables and charts with a CTA |
Admin (staff only, at admin.router.africa)
Section titled “Admin (staff only, at admin.router.africa)”| # | Screen | Description |
|---|---|---|
| 37 | Admin overview | Signups, active workspaces, requests, spend and margin today, failed top-ups, gateway sync errors |
| 38 | Orgs | Search all orgs. Detail: workspaces, members, status. Set the org’s rate limits and hold toggle (applies to all its workspaces). Suspend / reactivate |
| 39 | Users | Search all users. Detail: orgs, status. Suspend, force logout, resend verification |
| 40 | Workspace detail | Credit balance, currency, ledger, keys. Freeze, manual balance adjustment with a required reason |
| 41 | Keys | Search any key (by name or pasted key). Revoke. Shows the rate limit each key inherits from its org. Customers never see these |
| 42 | Rates | Today’s published rate per model, token type, currency, in credits per token. Last refresh status, recompute, history |
| 43 | Markup rules | List and edit rules: flat / percentage, scoped to global, currency, model, or transfers |
| 44 | FX and currencies | Daily mid-market rates per currency, last update, manual override. Enable or disable supported currencies |
| 45 | Model catalog | Enable or disable models, set the pre-checked onboarding defaults, mark deprecated |
| 46 | Transactions and top-ups | Search everything. Each top-up shows credits, fee, and total collected. Pending and failed top-ups, refunds, reconcile against Niobi |
| 47 | Margin report | Provider cost (Bifrost’s reported cost) vs what was charged, by model, currency, and day. Top-up fee revenue shown separately |
| 48 | Gateway sync | Each Router.Africa key vs its Bifrost virtual key. Shows out-of-sync keys, retry |
| 49 | Audit log | Every audited event, filter by org, user, action, date |
| 50 | Staff | Staff users and their admin role |
| 51 | Top-up fees | Transaction fee per vendor, flat or percentage. Shown to customers before they pay |
| 52 | Workspace discounts | Percentage off the published rate for one workspace, all models or one model. Reason required. List, edit, disable. Audit-logged |
| 53 | Unbilled usage | Calls Bifrost logged that the ledger did not charge, and token-count mismatches. Per row: request, workspace, key, model, tokens, Bifrost cost. Charge or release without charge, reason required. Audit-logged |
| 54 | Scheduled jobs | Every job: last run, last status, next run, running now, overdue flag. Drill in for run history (start, duration, status, summary counts, error). Edit schedule and config, enable or disable (reason required), Run now. Admin can edit, Support read-only. Audit-logged |
Features (non-screen)
Section titled “Features (non-screen)”| Feature | Description |
|---|---|
| Orgs and memberships | Every signup creates an org. Users belong to orgs with a role |
| Org roles | Owner, Admin, Member, with permission checks in one place |
| Workspaces | Each org has one or more. A “Default” workspace is created automatically |
| Workspace currency | Chosen at creation, preselected from the user’s country. Changeable until the first top-up, then fixed. Sets the currency the workspace pays in and which published rates apply |
| Credits | The balance unit. 1 credit = 1 unit of the workspace currency at top-up. Shown as credits, never with a currency symbol or code. Not redeemable for cash |
| Wording rule | Credits are currency internally (ledger, admin) but never presented as money to customers: no “wallet”, “cash”, or currency symbol on balances, no withdrawal or refund-to-cash. Applies to the dashboard, API, emails, receipts, and docs. Currency appears to customers only on the top-up payment amount and the workspace’s currency label |
| Workspace balance | Each workspace has its own ledger: credit balance, holds, settlements. This is the account the request path charges |
| Charging | Customer is charged the tokens Bifrost reports × the published rate, locked at hold time. Bifrost’s cost is kept separately for margin only |
| Top-up fee | A fee per vendor, set in Admin, added to the top-up. Customer pays credits + fee, receives only the credits. Fee is stored on the top-up record and recorded as revenue, not as balance |
| Credit transfer | Move credits between workspaces in the same org. Recorded as a paired debit and credit |
| Cross-currency transfer | Converts using the daily mid-market rate plus markup, same rule as model pricing. Between two non-USD currencies the mid-market rates are chained through USD (ZAR→USD × USD→ZMW) and the markup is applied once to the result, never per leg. The customer sees one final rate, no breakdown. The rate is locked at confirm and stored on both ledger entries |
| Workspace access | Owners and Admins see every workspace. Members see only workspaces they’ve been added to |
| Who can pay and transfer | Owners and Admins only |
| Workspace deletion rule | Balance must be moved out first. The last workspace can’t be deleted |
| Invitations | Email invite, expiring link, resend, revoke |
| Key ownership | Each key belongs to one workspace and is owned by a user or the workspace. Owner is recorded on the key |
| Model allowlist per key | Checked on every request before routing |
| Spend cap per key | In credits, with optional daily / weekly / monthly reset |
| Key expiry | Optional expiry date, enforced on request |
| Spend attribution | Every usage event carries org, workspace, key, and key owner |
| Org and workspace in the URL | Every dashboard route carries both from day one |
| Low-balance alerts | Per workspace, in credits |
| Transactional emails | Verify, invite, low balance, receipt |
| Audit events | Recorded from day one: key created/revoked, top-up, transfer, member and workspace changes |
| Rate limits | Set per org in Admin (Orgs screen), copied onto each key’s Bifrost virtual key, never shown to customers |
| Admin origin | Separate origin, admin.router.africa, with its own session cookie and CORS scope. Not reachable from the customer dashboard origin |
| Staff access | Separate staff flag, not an org role. Admin pages and admin API routes have their own permission checks |
| Staff roles | Admin (full) and Support (read-only plus limited actions like force logout) |
| API docs links | “Docs” link in the dashboard shell; API reference link on the Rates screen. The docs themselves are scoped in api-docs-scope.md |
| Admin audit | Every admin action is recorded with who, what, and a required reason for money or access changes |
Auto top-up, guardrail policy bundles, SSO/SAML, customer-facing audit log screen, admin “view as customer”, webhooks, per-member budgets, custom roles, global search, an org-wide total balance in a reference currency.