Data flows

The hub sits in the centre. Each module owns its own records and tells the hub when something happens; the hub passes the event to every module that needs it. No module is wired directly to another.

Modules on the hub
14
Plus 14 outside systems through connectors
Flows running
12
2 more drafted, not switched on
Events passed today
1,146
Median hand-over 0.4 seconds
Events waiting or failed
3
All in the accounting connector

Hub and modules

Reads and writes through the hubPath of "Order paid", shown below
Central integration and data hub APIs · Events · Master data · Automation Single source of truth
AI layer reads through the hub with staff permissions and writes only drafts and suggestions. AI overview
Outside systems WordPress, payment gateway, video platform, email and WhatsApp, accounting, calendar, sign-in. Connectors
Sample volumes
SourceEvent, then what happens in orderModules touched30 daysStateOn
Each step is a hub event that other modules or outside systems can also subscribe to. See the event catalogue. Steps with conditions are managed as automation rules.

One flow in detail: order paid

Last run today 10:14, 1.2 s
  1. Order paidCommerce, O-5128
  2. Enrolment createdLearners, Hassan Reda
  3. Added to rosterScheduling, B-2612, seat 11 of 24
  4. Invoice createdCommerce, INV-2086
  5. Deal updatedCRM, marked won
  6. Posted to accountingWaiting: customer missing
StepModule that actsRecord writtenFields passedIf it fails
Order paidCommercePayment PAY-5209 on order O-5128order_id, learner_id, batch_id, amountOrder stays "awaiting payment"
Create enrolmentLearnersEnrolment E-7741learner_id, course_code, batch_idRetry 3 times, then task for operations
Add to batch rosterSchedulingSeat on B-2612batch_id, enrolment_idIf full: waitlist and tell the learner
Create invoiceCommerceINV-2086order_id, tax_profileTask for finance
Update dealCRMDeal stage: wonaccount_id, order_id, amountSkipped when no deal exists
Post to accountingAccounting connectorLedger entry for INV-2086, order O-5128: not posted, customer missing. See the export queue (simulated, DEC-01)invoice_id, customer_refQueued; shown under sync errors
Insight. "Order paid" touches five modules in 1.2 seconds. Before the hub this was four manual steps and a spreadsheet; the one remaining manual step is creating the customer in accounting. Fix it in the connector

Events by module, today

Single source of truth. Each kind of record has exactly one owner. Other modules hold a reference, never a copy they can edit. When two systems disagree, the owner is right.
EntityOwned by (source of truth)Who can change itRead byKeyLegacy source
ASME program content is owned by ASME. The catalog stores it read-only with the date it was last taken from the ASME source.

Single source of truth

One owner per entity. A learner's name is changed in one place and every invoice, roster and certificate follows.

See ownership

API-first

Everything the screens do goes through the same documented API that outside systems use.

API and keys

Modular

A module or provider can be replaced as long as it keeps emitting and accepting the same events.

Connectors

Role-based access

The hub checks the role on every read and write, for people, API keys and the AI layer alike.

Roles and permissions

Auditable

Every change records who, when, before and after. Flows write their own entries.

Audit log

Expandable

A new product, region or delivery mode is a new record type or connector, not a new system.

Roadmap