How to

How to build an order management tracker

An order is confirmed, shipped and invoiced in three systems, and only one person knows how to reconcile them. Here is the model behind a tracker, the prompts to build it, and what it takes to run it.

The short answer

An order management tracker is four parts: one order record that survives the whole life of the order, a state model that includes the messy states rather than only the happy path, exception surfacing for the orders that stall, and a reconciliation between what was ordered, shipped and invoiced. The failure is modelling only the good outcome. Real orders get partially shipped, backordered, amended after confirmation and returned, and a tracker that has no state for those pushes them into a spreadsheet somebody keeps privately.

orders.helix-app.ai

Orders

41

Open orders

6

Stuck over 5 days

88K

Shipped, not invoiced

3

Lines that do not reconcile

Confirmed 12

Halden Foods, 4471

18,400 · 2 days

Vantor, 4468

6,200 · 1 day

Partially shipped 7

Northrise, 4455

2 of 5 lines · no date for rest

Backordered 5

Kestrel, 4449

expected 14 Oct · 11 days stuck

Shipped, not invoiced 9

Brightsea, 4441

31,000 · 8 days

Fenwick, 4438

12,400 · 3 days

A sketch of the board, with the messy states given columns of their own. Three cards are flagged for having stopped, which is a different question from how old the order is.

What matters here

  • An order tracker is four parts: one record, a state model including the messy states, exception surfacing, and a three-way reconciliation.
  • Model the states that actually happen. Partially shipped, backordered, amended and returned are not edge cases, they are Tuesday.
  • An order that has not moved is the thing to surface. Sorting by date received hides the one stuck for eleven days.
  • Reconcile ordered against shipped against invoiced. Where those three disagree is where the money goes missing.
  • Amendments after confirmation need their own history, or nobody can explain why the invoice does not match the order.
  • The tracker reads from and writes to systems of record, so managed credentials belong in the build rather than after it.

Who this is for

You run finance operations, order operations or customer operations. Orders pass through several systems and somebody reconciles them by hand. What you want is one view of where every order is and an alert on the ones that have stopped.

How it works in practice

What happens to an order between somebody placing it and the money arriving.

  1. 1

    One record is created and keeps its references

    Every other system's identifier lives on it, rather than a second record being created per system.

  2. 2

    It moves through states that include the mess

    Partially shipped, backordered and amended are columns, not notes, because a state with no home ends up in somebody's spreadsheet.

  3. 3

    Amendments keep their history

    What changed, who approved it and why, with the previous version kept, because that is where an invoice mismatch is always explained.

  4. 4

    Anything that stops is surfaced

    Sorted by days stuck rather than date placed, and routed to whoever resolves that kind of problem.

  5. 5

    Ordered, shipped and invoiced are compared per line

    Because a short shipment inside an otherwise correct order nets out at the order level and vanishes.

  6. 6

    Unbilled value is reported as a number

    Shipped and not invoiced is revenue you have earned and not asked for.

What an order tracker is made of

An order tracker is not a status column. It is four parts, and the second one decides whether people use it or keep a private spreadsheet.

One order record

Customer, lines with quantity and price, dates promised and actual, payment terms, and references into every system the order touches. One record for its whole life, not one per system.

A state model with the messy states

Placed, confirmed, partially shipped, backordered, amended, shipped, invoiced, paid, returned, cancelled. If a real state has no home, it ends up in somebody's notes.

Exception surfacing

Orders that have not moved, are past their promised date, are partially fulfilled with no plan for the rest, or are shipped and not invoiced. The queue is the exceptions, not the orders.

A three-way reconciliation

Ordered against shipped against invoiced, per line. Where they disagree is where revenue quietly leaks, and nobody finds it by reading three separate reports.

These prompts start from a Helix project, which is what handles sign-in, credentials and hosting. Start with Helix

The prompts

Paste these into Claude Code, Codex or Cursor in order. Each one leaves you with something that runs, so you can stop after any step.

  1. One record, and the states that actually happen

    Modelling the mess rather than the happy path.

    In this Helix project, build me an order management tracker.
    
    One order record that lives for the whole life of the order: customer,
    order reference, order date, promised date, payment terms, currency, and
    lines with product, quantity, unit price and line total. Keep the
    references into every other system on the same record rather than
    creating a second record per system.
    
    Now the state model, and be generous with it. Placed, confirmed,
    partially shipped, backordered, amended, shipped, invoiced, paid,
    returned, cancelled. Let me edit that list.
    
    Model the messy ones properly. Partial shipment is a state, not a note.
    Backordered is a state, with the expected date on it. Amended after
    confirmation is a state, with a history of what changed.
    
    If a state that really happens has nowhere to live, somebody keeps a
    private spreadsheet for it, and that spreadsheet becomes the real system
    within a month.
    
    I sign in through Helix, so do not build a login page. Read the signed-in
    user from the runtime. And do not put any key or connection string in the
    code: if this needs to reach another system, tell me and I will create the
    connection in my workspace.

    Worth knowing. The list of states is the design. Ask the person who currently reconciles orders what they write in the margin, and those are your missing states.

  2. Where has it stopped

    The queue is exceptions, not orders.

    Build the working view, and put exceptions in it rather than every order.
    
    Surface: orders that have not changed state for longer than a threshold I
    set, orders past their promised date, orders partially shipped with no
    expected date for the remainder, orders shipped but not invoiced, and
    invoices past due.
    
    Sort by how long the order has been stuck, not by when it was placed.
    Those are different, and only the first one tells you where to look.
    
    Each exception routes to whoever can resolve that type, and shows the
    order, its history, and the specific thing that is wrong, on one screen.
    
    Give me a per-customer view too, showing every order and its state, which
    is what you need open when they ring.
  3. Amendments, with a history

    Because the invoice not matching the order is always explained by something.

    Handle amendments properly.
    
    When an order changes after confirmation, record what changed, who
    approved it, when, and why, and keep the previous version. Quantity
    changes, price changes, date changes, line additions and removals.
    
    Show the amendment history on the order. When an invoice does not match
    the original order, the answer is nearly always in that history, and
    without it somebody spends an afternoon in three systems finding out.
    
    Handle returns and credits as their own records linked to the order and
    the line, rather than as a negative amendment, so the original order
    stays intact and the return is visible as a return.
  4. Reconcile ordered, shipped and invoiced

    The report where revenue leaks show up.

    Add the reconciliation, and do it per line rather than per order.
    
    For each line: quantity ordered, quantity shipped, quantity invoiced, and
    the value of each. Flag any line where those three disagree, with the
    difference shown.
    
    Group the mismatches by cause where you can: short shipped and not
    credited, shipped and never invoiced, invoiced above what shipped,
    returned and not credited. Those are different problems with different
    owners.
    
    Then report: value shipped and not invoiced, which is revenue sitting
    unbilled; average days from placed to shipped and shipped to invoiced,
    reported separately because they fail for different reasons; and orders
    by state over time, so a growing backordered pile is visible before
    somebody complains.
  5. Connect it to real systems

    The step that turns a working prototype into something with your data in it.

    Now connect it to the systems we actually run, so it works on real data
    rather than the rows you seeded.
    
    Anything in angle brackets is a placeholder. Swap it for whatever we use
    instead, and have the app name the connection it wants rather than assume
    a vendor, so changing my mind later is a config change and not a rewrite.
    
    <NetSuite>. Read orders and invoices, and write back the reconciliation
    result. Usually the system of record for the order itself.
    
    <Salesforce>. Read the opportunity the order came from, and write the
    order state back so the account team can see it.
    
    <Stripe>. Read payment status so paid is a fact rather than an assumption.
    
    <Okta>. Read the team attribute, so the app can keep customer pricing and
    terms to the people who negotiate them.
    
    <Slack>. Tell an owner when an order has stopped moving, with the specific
    reason.
    
    <Zendesk>. Show the customer's open tickets on the order, since a stalled
    order and a support ticket are usually the same story.
    
    <Snowflake>. Land the full order lifecycle with its timestamps, which is
    the only way to see where in the process the time actually goes.
    
    <Coupa>. Where an order is fulfilled by a supplier, read the purchase side
    so the two halves reconcile.
    
    Only write where I have said to write. Everything else is read only.
    
    Do not write a key, a token or a connection string anywhere in the code,
    and do not ask me to paste one. Tell me which connections you need and I
    will create each as an authentication in my Helix workspace. Reference
    them by alias.

    Worth knowing. Every name in angle brackets is a placeholder for whatever you run. Helix holds the credential as a workspace authentication, so the app references an alias and never the secret itself.

  6. Ship it

    The last step of every build: a URL, and the right people on it.

    Deploy my app.

    Worth knowing. Your assistant runs helix deploy underneath and the app comes back as a URL. Order data includes customer pricing, so set Access Control before sharing and scope it to the people who need to see terms.

What it connects to

An order touches more systems than almost any other app in this library, which is exactly why it is worth having one record across them.

  • NetSuite

    Read orders and invoices, and write back the reconciliation result. Usually the system of record for the order itself.

  • Salesforce

    Read the opportunity the order came from, and write the order state back so the account team can see it.

  • Stripe

    Read payment status so paid is a fact rather than an assumption.

  • Okta

    Read the team attribute, so the app can keep customer pricing and terms to the people who negotiate them.

  • Slack

    Tell an owner when an order has stopped moving, with the specific reason.

  • Zendesk

    Show the customer's open tickets on the order, since a stalled order and a support ticket are usually the same story.

  • Snowflake

    Land the full order lifecycle with its timestamps, which is the only way to see where in the process the time actually goes.

  • Coupa

    Where an order is fulfilled by a supplier, read the purchase side so the two halves reconcile.

Each line says whether the app reads, writes or both. Anything not described as writing should be read only.

Named systems are the ones most teams actually run, not a list of the only ones that work. Swap in whatever you use.

Each connection is an authentication in your Helix workspace, referenced by alias. The app names the connection it wants and never holds the credential, so nothing here ends up in your code and any of it can be rotated or revoked without a redeploy.

Running it for real

The build gets you a working tracker. It reads and writes across finance and fulfilment systems and its reconciliation feeds revenue reporting, so it needs to be run properly.

AI Deployment

Get it to a URL people can open

One command takes the app from your assistant to a live address, so the people who need it get a link rather than instructions for running it locally.

App Security

Put your identity provider in front of it

Order records carry customer pricing and terms, which are commercially sensitive. SSO means people sign in with their existing account, and access is scoped to those who need to see them.

App Security

Connect the system of record with managed credentials

Reading orders, shipments and invoices from three different systems needs real access to each. Granting it to the app rather than pasting keys into it means credentials can be rotated or revoked without a redeploy.

App Registry

Put a name on it

Every app carries a named owner and an entry IT can see, so the tool does not become nobody's problem when the person who built it changes role.

Cost Management

Know what it costs to run

Per-app spend visibility, with budgets and caps, so an internal tool cannot quietly become a line item nobody can explain.

Questions people ask

What is an order management tracker?

One record per order that survives its whole life across every system it touches, with a state model covering what actually happens, an exception queue for orders that have stalled, and a reconciliation between ordered, shipped and invoiced.

Which order states are usually missing?

The messy ones. Partially shipped, backordered, amended after confirmation and returned. Teams model the happy path and then keep the exceptions in a private spreadsheet, which quietly becomes the real system.

How should the queue be sorted?

By how long an order has been stuck in its current state, not by when it was placed. Those are different numbers, and only the first one points at where the problem is.

Why reconcile per line rather than per order?

Because a short shipment on one line inside an otherwise correct order nets out at the order level and disappears. Per-line comparison of ordered, shipped and invoiced is where unbilled revenue actually shows up.

How should amendments be handled?

As a recorded change with the previous version kept, an approver and a reason. When an invoice does not match the original order the explanation is almost always in the amendment history, and without it somebody spends an afternoon across three systems.

Can I build this without an engineering team?

Yes. The prompts here are written for Claude Code, Codex or Cursor and stage the build. The judgement call is your state list, and the fastest way to get it right is to ask whoever reconciles orders today what they write in the margin.

Last reviewed September 2026.

Build it, then run it properly

Helix is the governed runtime for AI-built apps. Deploy what you build, put SSO in front of it, connect it to your systems with managed credentials, and give it a named owner.