Payments · Card payments at POS and online.
Shopify & WooCommerce sync products, prices, stock and pull online orders into Sales Orders.
Shopify · WooCommerceMarketplace feeds (Amazon-style CSV/API) reuse the same product export contract.
via API exportCard and wallet payments settle straight into Cash & Banking with fees split out.
BML Gateway · m-FaisaaJournal export in QuickBooks format for external accountants — mirrors the built-in ledger.
QuickBooks ExportDispatch to courier with live tracking pushed back onto the sales order.
Redbox DeliveryReceipts, reminders and OTPs by WhatsApp, SMS and email — templates per document type.
WhatsApp · SMS · GmailPayments · Mobile-wallet payments.
Banking · Daily statement import for reconciliation.
E-commerce · Sync products, stock and online orders.
E-commerce · Website product & stock sync.
Delivery · Malé-area courier dispatch + tracking.
Messaging · Receipts, quotes and reminders by WhatsApp.
Messaging · OTP + loyalty and payment reminders.
Messaging · Invoices and statements by email.
Hardware · Barcode shelf labels.
Hardware · 80mm thermal receipts.
Hardware · Any HID scanner works out of the box.
Accounting · Journal export for external accountants.
Storage · Nightly encrypted backup.
REST API v1
JSON over HTTPS, bearer-key auth, request signing optional. Responses match the exact data shapes the app itself uses — what you see in the UI is what the API returns.
GET /api/products List products with stock, prices and availability. Paged, filterable by category.
Response (items[0] shown)
{
"id": "p2",
"sku": "VAS-GLS-M",
"barcode": "8964001010020",
"name": "Glass Vase Medium",
"category": "Homeware",
"prices": {
"retail": 180,
"wholesale": 150,
"dealer": 140,
"distributor": 132,
"vip": 165,
"staff": 130,
"online": 185
},
"minPrice": 125,
"stock": {
"wh1": 8,
"wh2": 4,
"wh3": 0
},
"reserved": 2,
"incoming": 40,
"available": 10,
"taxPct": 8
} GET /api/products/{id} One product, full detail — the same shape the UI uses.
Response
{
"id": "p2",
"sku": "VAS-GLS-M",
"barcode": "8964001010020",
"name": "Glass Vase Medium",
"category": "Homeware",
"prices": {
"retail": 180,
"wholesale": 150,
"dealer": 140,
"distributor": 132,
"vip": 165,
"staff": 130,
"online": 185
},
"minPrice": 125,
"stock": {
"wh1": 8,
"wh2": 4,
"wh3": 0
},
"reserved": 2,
"incoming": 40,
"available": 10,
"taxPct": 8
} POST /api/invoices Create an invoice. Totals, GST and numbering are computed server-side — clients never do tax maths.
Request body
{
"customerId": "c2",
"lines": [
{
"productId": "p5",
"qty": 8,
"unitPrice": 420,
"discountPct": 0
}
],
"overallDiscPct": 0,
"due": "2026-08-16"
} Response
{
"id": "INV-2026-0302",
"status": "Unpaid",
"totals": {
"subtotal": 3360,
"discount": 0,
"tax": 268.8,
"grand": 3628.8
},
"pdfUrl": "/api/invoices/INV-2026-0302/pdf"
} GET /api/invoices?status=unpaid Open receivables — the collections feed.
Response
{
"count": 2,
"totalOutstanding": 7256.6,
"invoices": [
{
"id": "INV-2026-0299",
"customerId": "c2",
"due": "2026-07-22",
"outstanding": 3628.8
},
{
"id": "INV-2026-0298",
"customerId": "c4",
"due": "2026-06-20",
"outstanding": 6026.4,
"overdueDays": 27
}
]
} POST /api/stock-adjustments Adjust stock with a mandatory reason. Adjustments above tolerance route to approval.
Request body
{
"warehouse": "wh1",
"productId": "p11",
"delta": -2,
"reason": "damaged",
"note": "Leaked bottles, disposed",
"requiresApproval": true
} Response
{
"id": "ADJ-0008",
"status": "Awaiting approval"
} GET /api/customers/{id}/statement Customer balance, credit and open documents.
Response
{
"customerId": "c2",
"name": "Coral Reef Resort",
"creditLimit": 150000,
"creditBalance": 64200,
"openInvoices": [
{
"id": "INV-2026-0299",
"outstanding": 3628.8
}
]
} API keys
Keys are shown once at creation, stored hashed, and scoped per integration. Rotate regularly.
| Label | Key | Scope | Created | Last used | |
|---|---|---|---|---|---|
| Shopify sync | sk_live_••••••••••••4f2a | products:read stock:read | 2026-05-02 | never | |
| Accountant export | sk_live_••••••••••••9c11 | journals:read | 2026-06-14 | Jul 12 |
Events
HMAC-signed| Event | Fires when | |
|---|---|---|
| stock.low | Available stock crosses below minimum | |
| order.created | New sales order (POS, portal or API) | |
| invoice.paid | Payment recorded against an invoice | |
| invoice.overdue | Invoice passes its due date | |
| grn.received | Goods receipt posted | |
| price.changed | Approved price change goes live |
Sample payload — stock.low
{
"event": "stock.low",
"firedAt": "2026-07-17T06:00:12Z",
"data": {
"productId": "p1",
"sku": "FLR-ROSE-R",
"available": 56,
"minStock": 100,
"daysOfCover": 2
},
"signature": "sha256=6d3f…(HMAC of body with your webhook secret)"
} Your endpoints
https://hooks.coralreef.mv/stockmaster stock.low · order.created — delivered 214, failed 2 (auto-retry ×5)
Deliveries are signed with your webhook secret (sha256 HMAC), retried 5 times with backoff, and every attempt is logged.