Legacy vs. modern
MOM compatibility
A feature-by-feature comparison of legacy MOM (MultiChannel Order Manager) and OpenMOM. Every row is traced to the live legacy database, documented API, implementation, and tests.
72 features tracked · Status as of Sep 6, 2026 · Updated as roadmap phases ship
01 · Core business entities
Customers, orders, products
The foundational data model — customers, orders, products, and the relationships between them. Fully shipped, including migration from legacy MOM databases.
| MOM feature | How MOM does it today | How OpenMOM does it | Status |
|---|---|---|---|
| Customers | CUST table, 50+ columns, full API surface for create/read/update |
Full customer CRUD with addresses and stored payment methods; legacy CUST migration proven live — 71,386 customers and 100,900 addresses loaded from the real estate |
Live |
| Customer search | Fuzzy name/address matching plus filtered bulk pulls | Find by email, phone, or name — exact and fuzzy, with distinct not-found and ambiguous-match errors | Live |
| Contacts & addresses | Linked ship-to / bill-to / sold-to / gift records via relationship tables | Typed address and contact relationships covering all legacy roles | Live |
| NCOA processing | Define an address list, export DEMOLIST.xls, process the provider-returned file, and update customer addresses |
Provider-neutral NCOA workspace with minimized export snapshots, validated result import, operator review, stale-address conflict protection, and transactional address updates | Live |
| Contact history | Phone and written contact logs per customer | Contact log with list and add operations | Live |
| Custom fields | Demographics system that alters live tables per company — confirmed on a production instance | Custom fields stored as data, with definitions — no schema changes at runtime | Live Improved |
| Orders (header) | CMS table plus a family of order APIs for addresses, shipping, and payments |
Whole-order creation in one call, plus get/update; 127,184 legacy orders loaded in the live rehearsal | Live |
| Multi-step staged creation | Orders built up across multiple screens before commit | Optional draft → commit flow — design decision pending | Gap |
| Order line items | ITEMS table with add/detail/delete API methods |
Add/update/remove line items with pipeline guards — immutable once picking starts; 235,196 legacy line items loaded | Live |
| Products / stock items | STOCK table with 20+ product-attribute columns |
Products with attributes, images, and retail-price cascading; 10,664 legacy STOCK products loaded |
Live |
| Product composites / kits | Component tables tying parent products to inventory items with quantities | Kit bills of material with quantity components | Live |
| Pricing / special pricing | Per-source, per-customer, per-catalog discount rules | Pricing rules with priority, date range, and customer/source/product scope, plus supplier buy prices | Live |
| Suppliers / vendors | Supplier table plus per-supplier cost records | Vendors with typed pricing records; 169 legacy suppliers loaded | Live |
02 · Order processing
The pipeline & its rules
MOM's staged processing pipeline with "stage latches" — the core workflow that drives fulfillment. The pipeline itself, holds, notes, per-line pick/pack progress, totals, and returns are all shipped.
| MOM feature | How MOM does it today | How OpenMOM does it | Status |
|---|---|---|---|
| 10-stage pipeline | E-Payment Approval → Picking → Packing → Gift Cert → Box Label → Notices → Drop Ship → Catalog Labels → Shipping → Invoicing. Stage latches prevent skip-ahead. | Pick, pack, ready-to-ship, ship, and invoice stage tools with the same stage-latch semantics | Live |
| Order holds & stop-review | Hold-type flags on the order plus hold/stop-review API calls | Hold and release with prior-status restoration, stop-review, held-state preserved in migration | Live |
| Order notes | Three distinct note types: internal, box-label instructions, fulfillment instructions | Typed notes — note, instruction, memo, box label — editable and removable with a full audit trail | Live |
| Totals calculation | Dedicated calculation calls, single and batch | Server-side atomic recalculation, single and batch | Live |
| Gift messages | Six fixed lines per item, plus box-label gift text | Gift messages as open-length lists — no fixed cap, no continuation flag | Live Improved |
| Batch order processing | Orders grouped by stage, configured via Global Parameters | Batch processing tool with typed stage filters, returning per-order success/failure | Planned |
| Packer's workstation | One-at-a-time scan-and-pack screen, alternative to batch | Single-order pack workflow — scan barcode, confirm items, assign box | Gap |
| Multi-ship orders | Ship-to address per line item | Line-item-level ship-to references — same capability, typed | Live |
| Per-line picked/packed quantities | Package-level detail tracks what's been picked and packed | Per-line picked/packed quantities recorded across the pick/pack window, separate from shipped quantities | Live |
| Returns / RMAs | Return authorization, restock or disposal, exchange, refund | Routed RMA/returns workspace covering creation from shipped lines, authorization, receipt, restock, disposal, exchange, refund, and cancellation | Live |
| Point of Purchase / counter sales | CMS.POPENTRY identifies POP orders; MOMUSER.CASHIER and POPWARE identify cashier and warehouse context |
Routed scanner-first counter workspace over real orders, inventory, exact split tenders, invoices, durable receipt snapshots, voids, and multi-tender returns/refunds. Review fixes are implemented and pending final independent review. Historical register/drawer ETL is evidence-deferred because no source entity is documented. | In progress |
| Exclusive edit locks | Editing an order blocks the MOM UI for everyone until saved (SAVE_PARTIAL_ORDERS) |
Atomic commits instead — no locks to hold or lose | Excluded |
03 · Payments & financial
Payments, invoicing, journals
Payment methods, the payment lifecycle, invoicing, and the A/R journal are shipped — tokenized by design. Accounts payable is in too: supplier bills commit from received purchase orders, payments apply to bills with exact-decimal balances, and end-of-day deposit batches record the banking event.
| MOM feature | How MOM does it today | How OpenMOM does it | Status |
|---|---|---|---|
| Credit card processing | Raw card numbers and security codes stored across several tables | Tokenized only: last four, brand, expiry, processor token. No raw card data column exists — and PAN-shaped inputs are rejected at the API. | Live Improved |
| eCheck / ACH | Routing and account numbers stored directly | ACH payments tokenized via the processor — bank details never touch the database | Live Improved |
| Check / invoice / COD / PayPal | Dedicated API methods per payment type | One typed payment-method set covering card, check, ACH, COD, invoice, and PayPal | Live |
| Payment capture & refunds | Capture, void, and refund through merchant integrations | Capture, refund, update/remove payment lifecycle — refunds post as linked ledger rows, never mutations of captured funds | Live |
| Card on file | An undocumented customer-table column with a raw card number, plus a separate tokenized path | Processor vault tokens only, migrated from legacy CCTOKEN records — 2,629 payment methods loaded in the live rehearsal with zero PCI violations, never raw card data |
Live Improved |
| Gift cards | Full card number and PIN stored | Balance tracked via processor reference — no card number stored. Redemption contract in design. | Planned |
| Invoicing | Invoices generated at the final pipeline stage | Invoice generation on order completion; 153,494 legacy invoices loaded with exact decimal totals and order reconciliation | Live |
| A/R journal | Dual-entry journal with a fixed vocabulary of transaction codes | Journaling in the schema with the same transaction codes as typed enums, plus G/L account mapping and posting | Live |
| Accounts payable | Vendor payables and bank-deposit reporting | Routed Payables workspace: supplier bills commit directly from received purchase orders (received-minus-billed per line); payments record with check references and apply/unapply against exact-decimal balances — and method/date-filtered deposit batches record the banking event over captured funds | Live |
04 · Inventory & purchasing
Stock, warehouses, POs
Stock, purchasing, receiving, and drop-shipping are shipped — a 649,086-transaction legacy inventory ledger migrated and chain-verified, and the whole domain loaded end to end in the live rehearsal.
| MOM feature | How MOM does it today | How OpenMOM does it | Status |
|---|---|---|---|
| Inventory / stock levels | On-hand, committed, backorder, and available quantities | Stock reporting with committed-demand allocation; the full legacy INVTRANS ledger migrates chain-verified with verbatim running totals — 649,086 transactions loaded in the live rehearsal |
Live |
| Warehouses | Warehouse table per company | Warehouses per tenant; single-warehouse estates like the live source load under the default model — shared-inventory crosswalk deferred with recorded evidence | Live |
| Bins & lot tracking | Bin and inventory tables per warehouse | Bin/lot model in place — 1,426 legacy bins migrated under the single-warehouse model in the live rehearsal | Live |
| Shared inventory | Cross-company warehouse groups (MOMSHARE) | Explicit shared-warehouse-group grants — deferred by owner decision with recorded evidence (this estate has no shared inventory); activates when a real migration customer needs it | In progress |
| Inventory adjustments | Manual unit/cost/transfer adjustments via the AIM module | Adjustment and allocation operations with an audit trail | Live |
| Purchase orders | PO APIs for header and detail management | Full PO lifecycle — create, submit, receive, close — with legacy PO migration covering all five statuses; 29,272 POs and 47,264 lines loaded | Live |
| Receiving | Manual delivery screen or barcode scan-and-receive (AIM module) | Per-line and bulk receiving with partial receives, commit, and automatic inventory allocation | Live |
| Drop shipping | Flagged line items become automatic POs in batch processing | Parallel drop-ship workflow, including drop-ship origin orders in migration | Live |
| Reorder points | Manual or auto-calculated from sales history | Reorder reporting with configurable thresholds per product | Gap |
05 · Shipping & fulfillment
Carriers & packages
Carrier and rate management, package tracking and maintenance, and quick-print document output are shipped — one shipment model replaces MOM's 12+ per-carrier table families. Direct carrier label integrations are not built yet.
| MOM feature | How MOM does it today | How OpenMOM does it | Status |
|---|---|---|---|
| Shipping methods & rates | Carrier services with charge rules, zone and rate tables | Carriers, rate bands, and rate estimation; 33 legacy carriers loaded in the live rehearsal | Live |
| Box / package tracking | 12+ near-identical per-carrier share tables | One carrier-shipments model with line items — 131,063 shipments and 205,302 line items loaded with package/address/content reconciliation | Live Improved |
| Direct carrier integrations (UPS / FedEx / DHL) | Per-carrier modules — direct UPS API, FedEx tables, two generations of DHL tables | Carrier-agnostic shipment records today; direct label and rate integrations not yet built | Gap |
| Package info & quick-print | Package instructions, charges, and label/document output | Order-workflow package maintenance (weights, dimensions, service, charges) with a pre-shipment window; structured packing slips, shipping-label data, and invoices render in browser print preview with a generation log — no invented server PDF | Live |
| Address validation | Licensed add-on module (USPS/CASS certified) | Pluggable address-validation provider — module decision pending | Gap |
06 · Integrations & channels
Channels, tax, accounting sync
The channel model, tax engine, and multi-company support are shipped. The import/export execution engine and per-marketplace sync workflows are the remaining work.
| MOM feature | How MOM does it today | How OpenMOM does it | Status |
|---|---|---|---|
| Channel listings (Shopify / Miva / ShopSite / etc.) | Separate licensed modules, each with its own table family | One channel-listing entity parameterized by channel type; per-channel variant tables collapsed into one | Live Improved |
| Marketplace / storefront sync | Amazon connector, SiteLINK hosted storefront, web auction module | Per-channel sync workflows; SiteLINK itself is superseded by any-storefront adapters | Gap |
| Import/Export module (IEM) | A field-mapping job engine spread across six wizard tables, forked across two generations | One import/export engine — jobs, source files, field mappings, history, and durable batch execution with crash-resume checkpoints. Customer and stock imports execute today; order/rates/zones remain | In progress |
| Tax calculation (TaxJar / Avalara) | Four-tier jurisdictions with five tax classes each, plus two parallel connector table sets (19 tables combined) | One jurisdiction table with a level discriminant, normalized tax classes, and one pluggable provider interface | Live Improved |
| QuickBooks integration | Two generations: legacy Desktop (qbXML) plus modern QuickBooks Online OAuth | QuickBooks Online OAuth2 configuration — the legacy Desktop protocol is excluded as superseded | Live |
| Multi-company controller | Up to 50 isolated company data stores per license | Shared-database tenancy with engine-enforced isolation — not capped at 50 | Live Improved |
07 · Security & compliance
Permissions, audit, PCI
RBAC, audit logging, PCI-safe payments, and tenant isolation are shipped and tested. Identity and permissions were migrated from the live estate in the Phase 7 rehearsal — with zero PCI violations.
| MOM feature | How MOM does it today | How OpenMOM does it | Status |
|---|---|---|---|
| Role-based access control | Menu-coordinate permissions plus hardcoded capability columns on the user table | Permission catalog and user grants — migrated from SECDEF/SECUSER with suspend/revive convergence and roles derived from legacy capability flags; 35 users and 108 permission grants loaded in the live rehearsal |
Live |
| Audit logging | Activity records with maker/checker (enterer + authorizer) timestamps | Audit log with before/after values, actor, and review workflow — same two-person-integrity pattern | Live |
| Legacy audit history migration | 57,000+ legacy USERACTIVITY rows |
Permanently disabled at the current source — the rows are nearly all blank-actor and unattributable, and migrating them would fabricate an audit trail. Future sources with attributable actor data can enable under a confirmed actor policy. | Excluded |
| PCI compliance | Raw card numbers in 8+ tables, security codes in 4, static-key encryption from the early 2000s | No raw card data anywhere — card, bank, and credential records are excluded at extraction and quarantined. Tokenized storage only — the full live estate migrated with zero PCI violations. | Live Improved |
| SSN / tax ID storage | Social security numbers stored as plain text on the user table | Not migrated — a compliance liability, not a feature | Excluded |
| API credentials | Plaintext in merchant and connector configuration tables | All credentials as references into a secrets manager — never in the schema | Live Improved |
| Tenant isolation | Database-per-company, enforced only by the application | Row-level security enforced by the database engine itself, per transaction — the app role cannot bypass it | Live Improved |
08 · Subscriptions & recurring
Three mechanisms, not one
MOM has three distinct recurring-order mechanisms — not one feature under different names. The subscription and club domains are shipped; migrating live data waits on a source that has any.
| MOM feature | How MOM does it today | How OpenMOM does it | Status |
|---|---|---|---|
| Magazine / periodical renewals | A flat subscription table tied to publication products | Publication-linked subscriptions with renewal tracking | Live |
| Club membership plans | Plan templates, product rosters, per-customer enrollment, shipment history | Membership plans, enrollments, and shipment history as linked records | Live |
| Batch order making | "Clone these existing orders with a new item substituted" — e.g. book-of-the-month | Batch clone with a typed substitute-item workflow | Planned |
| Continuous order forms | A possible third recurring mechanism — columns not yet fully read | Under evaluation — confirming whether this is a distinct feature before designing anything | Gap |
09 · API surface
How the two connect out
The API is live, with schema-validated tools, structured results, and no session state. This is the layer everything above ships through.
| Aspect | How MOM does it today | How OpenMOM does it | Status |
|---|---|---|---|
| Protocol | A Windows-only COM API — ~400 methods, single-threaded | A tool-based API server covering every domain above — built for automation and AI agents | Live |
| Authentication | Session-based: connect, log in, keep a session alive | Authentication on every call — no session state to manage | Live Improved |
| Error handling | Bare integer return codes, error text in a side channel | Structured results — success with data, or failure with a code and message | Live Improved |
| Input validation | Everything passed as strings — booleans as "T"/"F" | Schema-validated inputs — real types, strict schemas that reject unexpected fields | Live Improved |
| Pagination | Stateful two-call cursors tied to your session | Stateless cursor pagination | Live Improved |
| Concurrency | Exclusive edit locks — editing an order blocks the MOM UI until saved | Optimistic concurrency via versions — no locks | Live Improved |
| Platform | Windows-only | Cross-platform — Docker, Linux, macOS, any cloud | Live Improved |
10 · Migration strategy
How the data moves
How legacy data moves from MOM's SQL Server to OpenMOM's PostgreSQL. The migration framework is live and covered by 380+ tests — and proven end to end against the full live MOM estate in the September 2026 rehearsal: 1,889,649 rows extracted, 1,768,484 loaded, zero errors, zero PCI violations.
Extract
Read-only connection to the live MOM database with a manifest of supported mappings. All ~413 tables cataloged with column-level detail, deterministic IDs, and PCI exclusions applied up front.
Transform
Bridge columns on every core entity preserve the link back to the MOM record. Enum codes translated explicitly. Raw card, bank, and credential data never enters the pipeline.
Validate
Row-count reconciliation, exact financial totals, and source-total cross-checks. Anomalies land in a durable quarantine — classes are accepted only by explicit operator sign-off, and nothing is dropped silently.
Cutover
Full-table reruns and delta runs converge changes without losing history. Cutover is gated on exit criteria — zero unapproved rejections, reconciled counts — with a rollback window and side-by-side coexistence.
Coming January 2027.
The repository opens after full testing, 100% parity with MOM 10, and verified improvements beyond the legacy system.