Your entire operation in one view.

From the first registration to the last retention call — every interaction, every trade, every dollar.

4Registration paths
32RBAC permissions
14Workflow actions
200+Endpoints

Customer lifecycle

Four registration paths: organic, affiliate (with 72-hour autologin), CSV import (50,000 rows), and promo code. Each with its own group assignment and fraud gates.

  • Disposable email blocking with configurable domain blocklist
  • Duplicate detection: email, phone, and affiliate_lead_id scoring
  • Scoring-based dedupe: affiliate_lead_id = 10, email = 4, phone = 3, country = 1
  • Automatic retention classification: active → churning → dormant

POST /api/customer/register

{
  "email": "[email protected]",
  "password": "TestPass1234",
  "first_name": "John",
  "last_name": "Doe",
  "phone": "+447700900000",
  "country": "GB",
  "source": "organic",
  "promo_code": null,
  "affiliate_id": "aff_123"
}

Agent workspace

Polymorphic status pipelines (sales, finance, KYC), bulk assignment with round-robin, activity feed with keyset pagination, task management with due dates.

  • SSE live account feed with 500ms throttle
  • Customer online presence via Redis TTL (300s)
  • Notes with full edit history — append-only compliance trail
  • Task management with overdue tracking and team-level views

GET /api/crm/accounts/{login}/stream (SSE)

event: state
data: {
  "balance": 10000.0,
  "credit": 0.0,
  "equity": 10250.5,
  "pnl": 250.5,
  "margin_used": 500.0,
  "free_margin": 9750.5,
  "margin_level": 2050.1,
  "currency": "USD"
}

Teams & RBAC

Hierarchical teams with materialized path queries. 32 permissions across 7 categories. PII masking — email and phone shown as full, masked, or hidden depending on the viewer's role.

  • customer_view_scope: own / team / all
  • customer_edit_scope: none / own / team / all
  • pii_email and pii_phone: full / masked / hidden
  • can_export_pii controls CSV export access
  • Privilege escalation guards on role creation and permission grants

Same customer, three views

Admin
[email protected]+447700900000
Sales Agent
tr***@example.com+44***000
Read-only
——————

Financial operations

Deposits, withdrawals, credits, bonuses, corrections, IB payments, chargebacks — all in one ledger. Maker-checker approval flows with withdrawal amount thresholds.

  • 15 transaction types with full status lifecycle
  • Threshold-based approval rules: agent < $1K, manager < $10K, compliance $10K+
  • Per-country payment routing with BridgerPay and Praxis
  • Auto-freeze on negative chargeback balance

Withdrawal approval rules

// Three-tier approval
{"min_amount_usd": 0,     "max_amount_usd": 1000,  "required_role": "agent"}
{"min_amount_usd": 1000,  "max_amount_usd": 10000, "required_role": "manager"}
{"min_amount_usd": 10000, "max_amount_usd": null,   "required_role": "compliance"}

// Maker-checker: creator ≠ approver
// 403 if same user attempts both actions

Customer import & promo codes

Upload a CSV with 50,000 leads. Async processing at 10/sec with real-time progress. Download rejection reports. Promo codes assign customers to specific groups at registration.

POST /api/backoffice/customers/import

// Upload CSV (multipart form)
// Required: email, phone, first_name, last_name, country
// Optional: group_name, assigned_to_email, comment

// 202 Accepted
{
  "job_id": "uuid",
  "status": "pending",
  "total_rows": 1500,
  "message": "Import job created. Processing 1500 rows."
}

// Poll GET /api/backoffice/customers/import/{job_id}/status
// Download GET /api/backoffice/customers/import/{job_id}/rejections

Communications

Email and SMS template builders with {{placeholder}} resolution. Multilingual with per-locale translations. RTL auto-detection for Arabic and Hebrew. GSM-7/UCS-2 character counting with segment analysis.

  • Per-locale translations with default fallback
  • Live template preview with sample data
  • Delivery tracking via customer communication log
  • Integrated with workflow send_email and send_sms actions

PUT /api/platform/email-templates/{id}/translations/en

{
  "subject": "Welcome, {{customer.first_name}}!",
  "body_html": "<p>Hello {{customer.first_name}},</p>
    <p>Your account with {{broker.platform_name}}
    is ready.</p>",
  "body_text": "Hello {{customer.first_name}}..."
}

Ready to see it in action?