Skip to content

Platform model

Fabrik is a communications control plane for product teams operating in Ghana and Nigeria. Your server sends through one authenticated API; your team controls content, routes, sender identity, delivery evidence, and spend from the dashboard.

Application

One product inside your workspace. It owns its API keys, environments, message definitions, webhooks, activity, and delivery history. A workspace can hold several applications.

Environment

Sandbox and live are isolated. The sk_test_ or sk_live_ prefix selects which one a request uses.

Message

A direct request owns its content. A managed request addresses a released definition by a stable key such as order.shipped.

Delivery

The accepted request, delivery attempts, terminal status, cost, and webhook history form one traceable record.

Channel Best for Runtime surface Live prerequisite
SMS OTPs, alerts, receipts, operational updates fabric.sms or fabric.messages An active sender ID for each destination country
Email Receipts, product mail, account notices fabric.email or fabric.messages A verified sending domain
WhatsApp Approved-template notifications and conversations fabric.whatsapp or fabric.messages WhatsApp provider and template configuration

Direct resources are useful when your application owns the final payload. Managed messages are useful when product, operations, or compliance teams need to update approved content without a deploy.

  1. Prepare. Validate the recipient, content, channel rules, consent, and an optional cost ceiling.
  2. Accept. Fabrik records the message and reserves the required sandbox allowance or wallet funds.
  3. Dispatch. The virtual sandbox path or live provider attempts delivery.
  4. Observe. Retrieve the resource or consume a signed webhook until it reaches a terminal state.
  5. Reconcile. Match the delivery ID, your business reference, the final cost, and the wallet ledger.

An HTTP success is not the same as handset or inbox delivery. Treat message.delivered, message.undelivered, and message.failed as the terminal evidence for a send.

  • Keep keys server-side. The TypeScript SDK throws when constructed in a browser; never expose a secret key in client code or a mobile bundle.
  • Make writes idempotent. Reuse the same key when retrying the same business action. Use a new key only when you intend to send again.
  • Use webhooks for outcomes. Verify the raw body, persist the event ID, and make processing safe when the same event is delivered more than once.
  • Treat money as exact. Costs and balances are integer minor units represented as strings, never JavaScript floating-point numbers.