Merit · E-Commerce Solution · Internal
Every service the E-Commerce Solution owns, every system it has to call to complete an order, and the contract at each seam between them. The green band is ours. Everything above it is a caller and everything below it is a dependency, which is why most of what blocks us is not code.
What this page is, and what it deliberately is not.
This is the New World view. The E-Commerce Solution is a B2B SaaS stack: loyalty programmes and brands, called tenants, run their own branded commerce experience on it and pay a subscription plus a take rate. The target every dated commitment traces back to is sixteen large tenants producing 869,200 dollars a month by December 2026.
The Old World earns the revenue today, across eight live client instances, and it runs on the legacy Online Catalogue, MGC and the Platform services. The New World is a parity chase beside it. A number from one stack does not describe the other. When somebody says "the platform", they almost always mean an Old World thing.
The E-Commerce Solution.
Boards MSP and STOR, delivered with Tintash.
Called by us, owned by somebody else, and not by one team. Payments hold the Payment Service and the tax rules, Marthino holds the Exchange Hub, the Communication Hub and LiveOps, Bilal holds Identity. A few of them are Akshay's Old World services that the new stack still has to call. None carry a deprecation date.
MGC and the Online Catalogue. Being replaced, and a supplier behind our own pipeline until they are.
Three things this page does not do. It does not specify any service, because each one has its own PRD. It does not describe the Old World order path, which is covered in the companion page. And it is not a deployment or infrastructure diagram: every box is a responsibility, not a container.
Every part, and the fifteen places work crosses from one part to another. Each numbered badge on the diagram is a seam listed underneath.
Read it downward. Everything above the green band asks for something, everything below it is asked for something, and the E-Commerce Solution holds both ends together. The lanes at the edges carry the six routes that skip a band, and the catalog bridge on the right runs in both directions. Each badge is a seam, listed below.
We own one band. The order cannot complete without the two bands underneath it, and neither of them is on our roadmap or our sprint. That is the whole reason the recurring shape of a problem here is a sync that fails on bad data, a contract nobody signed, a budget nobody approved, or a design review nobody scheduled.
Most architecture arguments on this stack are one of these five, restated.
A product is what an item is: iPhone 15, 128GB, black. An offer is one seller's listing of it, with their price and their stock. Two sellers, one product, two offers, and the Buy Box picks which one the shopper sees. Offers reference products and never the reverse. PIM stores no price at all.
Every storefront, the B2C app and every order come through E-commerce Core, and they never reach PIM directly. Supply is the exception that matters: a seller uploading in the Seller Portal writes the master product into PIM and the offer into Core, because they are two different objects with two different owners. Reading that as one write is how the catalogue and the offer drift apart.
OMS Core is the state machine, and it belongs to the E-Commerce Solution. Fulfilment and Settlement are both called by OMS, not by Core: Core has no business knowing that an order shipped or that it became final. Platform's own team page still lists "order lifecycle infrastructure" among its components, and that page was never corrected.
One interface, provider adapters behind it, and TMS sits behind it rather than beside it. Core never calls TMS and neither does OMS. Phase one proxies MGC, which inverts the dependency on purpose: legacy becomes a supplier behind our pipeline rather than the system the order is handed to. Warehouses are mirrored here too, from the Identity Service, and pushed to OTO as pickup locations.
The Platform Tax Service already holds every TaxRule. So a market stores no rates: it
names the categories it sells and resolves them against that service at configuration time, shows the
result read only, and turns a missing rule into a request rather than a field to type into. The same
reasoning applies to FX, which belongs to the Merit Exchange Hub.
Storefront is a running client shop, which is Marketplace, and it is also the builder product, which is ours. Catalog is the Online Catalogue, which is Old World, and it is also PIM plus Core. Naming a client means the first. Saying builder, template or tenant means the second.
What each one owns, who it depends on, and where it actually stands this week. The state column goes stale fastest; the live answer is the dashboard and journal/todo.md.
| Service | What it owns | It calls | It is called by | State, 11 Sep | |
|---|---|---|---|---|---|
E-commerce Corenp-core | The offer: price, stock context, condition, channel assignment. Sales channels and markets. | PIM, the Platform Tax Service, the Online Catalogue, OMS | Every storefront, the B2C app, the Seller Portal, LiveOps | partial | In progress. Blocked on catalogue sync automation, and carrying about one engineer |
PIMnp-core | What a product is. Canonical identity and enrichment, on MedusaJS. It stores no price at all. | Nothing outward | E-commerce Core, and the Seller Portal upload, which writes the master product straight in | live | Live and multi-tenant. A supplier SKU conflict is stopping one sync |
OMS Corenp-oms | The order state machine, the SLA engine and the settlement hooks. Everything after the order is called from here, not from Core. | The Fulfillment Service, the Settlement Service, the Communication Hub, Payment | E-commerce Core, support tooling, the B2C order webhook | partial | In testing and migration. It slipped July and it gates most of Q3, so it is the critical path |
Seller Portalnp-sp | Self service for third party merchandise sellers: upload, price and stock, warehouses, fulfilment, payout view. Plus the cross-tenant Merit Ops console, which is the only planned replacement for operating a physical order in MGC. | PIM and E-commerce Core on upload, the Identity Service on every address write | Sellers directly, and Merit Ops staff on the admin console | partial | Live and expanding. Blocked mainly on the Online Catalogue two way sync. The admin console is P0 for the Al Fursan cutover and is still a draft |
Digital Seller Portalnp-dsp | The same idea for gift card merchants. Phase 0 is not a portal: it is a store of commercial terms plus two APIs, at the grain of tenant and product. | E-commerce Core, which is the single source of truth for the terms | LiveOps writes, the Rewards Portal reads and caches | not built | Phase 0 designed on 8 Sep and not yet estimated |
Storefront and Buildernp-sf | The multi-tenant white label template, the builder, tenant provisioning and a basic CMS. | E-commerce Core, the Identity Service | Tenants configuring their own shop | partial | In progress, about half way through its sprint and flagged at risk |
Fulfillment Servicenp-ffs | Everything that happens to a reward after the order. Provider adapters behind one interface, and the mirror of every seller warehouse. | TMS on OTO, MGC, the Communication Hub. It subscribes to the Identity address snapshot | OMS | partial | Phase one proxies MGC. The warehouse sync is built end to end and parks every row as BLOCKED, because OTO needs contact fields identity holds as optional |
TMS on OTOnp-ffs | Carrier orchestration: labels, AWB, tracking, more than 200 GCC carriers on one API. It runs behind the Fulfillment Service and nothing else calls it. | OTO, and SPL for Saudi Post branches | The Fulfillment Service only | not built | Planning. Gated on OTO budget approval and a solution design review open since mid August |
Settlement Servicenp-settle | The final calculation once the order is done: turns a hold into a charge and writes the revenue line. It is triggered by OMS, because only OMS knows the order is final. | The Wallet and Ledger, the Payout Service | OMS, Finance reporting | not built | Draft v0.4. Product says a new service, engineering may overrule it on technical grounds |
Searchnp-core | Advanced product search across the tenant catalogue. | E-commerce Core | Storefronts and the B2C app | partial | In progress and untuned. The Old World search has years of tuning behind it |
OMS gates most of Q3. Core is blocked on catalogue sync automation, the Seller Portal is blocked on the same sync from the other side, and PIM is where the sync actually fails, on a supplier SKU conflict. Four rows, one root cause.
Six lanes carry it. Only two of them are ours.
An order in the New World. Compare step "create the order" with the Old World, where the shop forwards the order to MGC and MGC becomes the source of truth for sales and inventory.
A market holds the country, the pricing currency, the settlement currency, the delivery fee, the payment providers and the fulfilment profile. Today Core assigns one hardcoded Saudi market to every sales channel created from LiveOps, because LiveOps has no field for it. That is acceptable for the first multi-currency launch and not after it: Jordan is next, and it currently needs an engineer and a database write.
The one seam where the two stacks touch continuously rather than at cutover.
Physical merchandise only. Gift cards, digital codes and vouchers are excluded from this bridge. Two routes run today and one is agreed and not built.
The original plan was a direct bridge from the Seller Portal to MGC. In April 2026 that was dropped, because the Online Catalogue already had an automated sync into MGC that had been running for nine months. The method changed at the same time, from pull based polling to bi-directional webhook push.
The newest seam, and the one most likely to be got wrong, because the obvious answer is wrong: a seller warehouse is not stored in the Seller Portal.
The grain is per warehouse, not per seller. Every leg of this is built and in review, and the thing stopping it is five fields nobody asks the seller for.
Synchronous proxy write, then an event after the 2xx, then a synchronous call to OTO. That was decided on 1 September and it is built on all three services. What is open is smaller and harder: the fields OTO demands are optional in identity and absent from the seller form, so the pipeline runs end to end and every row parks as BLOCKED. Validating at capture puts the correction in front of the seller who knows the answer. Validating at sync time puts it in front of Ops, weeks later, on an address nobody can chase.
One consequence worth carrying: a bulk import written straight into identity emits no event, so it would land the addresses and leave the mirror empty. The import goes through the seller portal address API instead.
Tax at checkout, settlement after the order, payout on delivery. Three services, and only one of them is ours.
Two clocks. The client is charged at purchase, and revenue is recognised on reveal. Any settlement design that assumes one money event per order is wrong for gift cards.
The client is charged at purchase, at the rate in force when the order was placed. Revenue is recognised when the customer reveals the card, so the unclaimed part is reversed to contract liability at every month end and returns as revenue on reveal. Reading the first rule as "revenue lands at purchase and stays there" is the mistake Finance already corrected once.
This table is the honest risk register of the migration. Every red row is a capability that is live in the Old World and has no counterpart in ours.
| What we depend on | Whose | What it does for us | State, 11 Sep | |
|---|---|---|---|---|
| Platform Tax Service | Payments, Tamer. Hamd built it | Holds every TaxRule and computes at runtime. We resolve a category against it and display the result read only. A market stores no rate. | partial | Two questions open: who applies the origin rule, and whether there is a lookup call or only a calculation call |
| Wallet, Payment and Ledger | Payments | Per tenant prepaid balance, the debit, and the immutable per transaction proof that reconciliation and billing are built on. | partial | The Ledger is the reconciliation source of truth and a go live blocker |
| Identity Service | Bilal owns the address module | Login, and the structured address module. Every seller warehouse is stored here, not in the Seller Portal, and the portal proxies each write to it before publishing a snapshot. | partial | The fields OTO requires are optional in the identity DTO and absent from the seller form, so every mirrored warehouse parks as BLOCKED until that is fixed |
| Merit Exchange Hub | Marthino | FX rates, rate refresh and the requote tolerance for multi-currency. It wraps Fixer so that no other service re-integrates it. | live | Ownership settled in DEC-0289. Core reads it and must not rebuild it |
| Communication Hub | Marthino | Email, SMS, and the tenant branded templates. WhatsApp still runs through the client side. | partial | WhatsApp has to move to Merit and no team is assigned to it |
| LiveOps console | Marthino | The operator front end for tenants, catalogue approval, seller onboarding and market management. | partial | Market management does not exist, so every market other than Saudi needs an engineer and a database write |
| Points Exchange | Akshay, Old World | Converts Merit points into a partner currency and back. Six partner programmes live. | not built | No New World counterpart at all, and burning points is the reason Al Fursan exists |
| Payout Service | Akshay, Old World | Pays the seller and the partner. PayPal, Revolut and THUNES are live. | not built | No New World counterpart. Rebuilding it is the largest uncosted item on the migration |
| Online Catalogue, MGC and the Merchandise Service | Akshay, Old World | The catalog source of truth today, the order and inventory engine today, the gift card issuer for as long as it lives, and every supplier integration. | partial | Full deprecation is targeted for November 2026 in the migration plan and December in the older strategy documents. Work to November |
| OTO | Vendor | Logistics aggregation. One API to more than 200 GCC carriers, and the pickup locations every warehouse is registered against. | partial | Commercial agreement signed on 30 June 2026. The integration budget is still not approved |
| Salasa and SPL | Vendor | Fulfilment partner for Al Fursan and Apple Store, and Saudi Post for parcels. | not built | The Salasa contract was still unsigned on 8 September and is a live escalation. The SPL branch creation API is an open dependency |
| Moyasar | Vendor | Card and settlement rail in Saudi Arabia. | live | Live |
| HERE Maps | Vendor, Marketplace side | Address validation and geocoding at checkout. | live | Live on the Al Fursan storefront. It belongs to Marketplace, not to us |
Points Exchange and Payout have no New World counterpart, and both are live, partner integrated Platform services whose integrations took years to build. Rebuilding them inside the E-Commerce Solution is the largest uncosted item on this page. Calling the existing services instead is the cheaper answer and it has not been decided.
Ranked by how fast it moves.
http://localhost:3737 and journal/todo.md, not this
page.The E-Commerce Solution orientation pack of 9 September 2026, the Merit E-Commerce Solutions strategic overview v2.0, the LiveOps market management requirement v0.3 of 11 September, the Settlement Service PRD v0.4 of 3 September, the Wallet and Fulfillment alignment document v1.2, the team onboarding guide, and the system topography page of 25 August. No source code was read.
Where this page disagrees with a PRD, the PRD wins and the fix belongs in this file. Regenerate with
python3 "Clients/Merit/assets/build_ecom_service_map.py".