🧩 Dynamics4Omni
ERP connector platform Β· UAT1

One reusable integration for hundreds of independent Dynamics 365 environments.

A connector platform where a customer's credentials, environment URL, field names and custom columns are data on a connection β€” not code branches. The Dataverse Web API behind one interface, over Entra ID client-credentials auth, with bidirectional sync that is resumable, idempotent, conflict-aware and observable.

β–Ά Open the docs page πŸ–₯️ The running app β€” dashboard & API

Opens the live Omni app, signed in to the demo account, on the documentation page.

Nothing signs in until you click β€” the demo account is shared, so this page never logs you in on its own.

Live platform Β· API docs (OpenAPI) Β· Prometheus metrics Β· Grafana dashboard Β· Repository

What the demo shows you

A landing pane and a documentation panel, each a note β€” one tab per document, so you can edit the docs and see the tab follow. The platform itself runs on the same box: the dashboard can start the scenario, inject faults and configure field mappings.

πŸ”Œ The Dataverse Web API, one interface

  • OData v4 record calls at /api/data/v9.2
  • Entra ID client-credentials tokens, cached and refreshed
  • @odata.bind writes, _x_value reads
  • A modifiedon gt β€¦ delta window

πŸ›‘οΈ Reliability is the product

  • Idempotent writes β€” a lost response cannot duplicate an invoice
  • Jittered retries that honour Retry-After
  • A per-connection circuit breaker
  • Conflict detection that refuses to guess

πŸ§ͺ Evidence, not claims

  • 18 tests against a fake Dataverse that speaks the real wire protocol
  • Six environments built to be hostile: legacy customisations, a missing column, a required custom column, a least-privilege role and a 2,000-row history
  • Fault injection: 429s, 5xx, a lost write, schema drift
  • Every step prints its own numbers

πŸ“ˆ Observable, and instrumented for real

  • Prometheus metrics from the platform itself
  • A Grafana dashboard scraped every 60s
  • Self-throttling, circuit state, stream leases, backfill progress
  • A live simulator panel (demo/d365/site/panel.html, run against a local make sim-dynamics β€” the fake Dataverse environment is loopback-only, because its control plane writes), plus ranked "what needs a human" rather than a wall of graphs

Run it yourself

The deployed instance is the same code, one bash deploy/install-vps.sh away. No Dynamics 365 tenant or Azure subscription required β€” the bundled simulator speaks the real wire protocol.

git clone <this repo> && cd erp-connector-platform
make install        # python 3.11+ venv + deps
make sim-dynamics   # the fake Dataverse environment on :8012
make api            # the platform API on :8000
make test           # the suite, including tests/test_dynamics365.py

# or as services on a box (this is what erp.uat.sites.miomni.me runs):
bash deploy/install-vps.sh --dry-run

Inside the demo account

The notes are real Omni notes: searchable, editable, and the page follows them.

Two connectors, one platform

Dynamics 365 is the platform's second real connector β€” after NetSuite. Adding it was one connector class and one register() call: nothing under hub/ or api/ changed. That is the claim this demo is here to evidence.

The NetSuite build of this same demo lives at netsuite4omni.sites.miomni.me.