Support

Need help?

Most answers are already written down. For everything else, Oneop does not publish a response time — there is no SLA instrument behind one — so the fastest thing you can do is send a complete first message.

Search the help centreEmail support@oneop.ioOpen your workspace

Worth including

  • The email you log in with
  • The URL of the screen it happened on
  • What you expected, and what happened instead

Goes somewhere else

Architecture

Why CRM and inventory need the same customer and order context

By The Oneop team8 min read

TL;DR

When customer context lives in a CRM and order context lives in an inventory system, every question that crosses the boundary is answered from a copy. A salesperson quotes from a stock figure that was true at the last sync, and a support agent answering 'where is my order' can see the customer but not the shipment.

Three scenes from the same week. A salesperson promises a fourteen-unit order because her CRM says sixteen are in stock, and the figure is from last night. A support agent takes a call about a late delivery, finds the customer instantly, and cannot say what shipped. A finance controller issues a credit note against an order that has two shipments and one return, and gets the amount wrong because the order lines live in one system and the invoice lines in another.

None of these is a data-quality problem. Each one is a boundary being crossed at the moment a person needs an answer, and each answer arriving as a copy.

A separate architectural question, identity itself, is covered in why your help desk and CRM should share the same customer record. This article is about the other half: what happens to order context when it sits on the far side of a boundary from customer context.

What each side actually holds

The CRM holds who, and the inventory system holds what. Almost every useful question in a business that sells physical goods needs both.

The question someone is askingNeeds from the customer sideNeeds from the order sideWhat a split produces
“Can I promise fourteen by Friday?”Account terms, priority, credit statusReal-time available-to-promise, per warehouseA promise made from last night’s number
“Where is my order?”The caller’s identity and entitlementShipment, carrier, tracking, backordered linesAn escalation and a callback
“Why is this invoice this amount?”Agreed pricing, discountsQuantities actually shipped across partial shipmentsA credit note calculated by hand
“Is this customer worth expediting?”Lifetime value, open deals, support historyOrder frequency, margin, returns rateTwo reports that disagree

The right column is the point. Nothing in the split architecture is broken in a way that raises an error. Every system is internally consistent, and every answer is individually defensible, which is why the problem survives so many reviews.

The quote is where the boundary hurts first

A quote is a CRM object made almost entirely of inventory facts. It names items, quantities, prices and, implicitly, a claim that the goods can be supplied. When stock truth lives elsewhere, the quote is written against a cached figure, and the cache’s age is invisible on the document.

The defensible position is that a quote is an offer rather than a commitment, and that availability is confirmed at acceptance. That is correct, and it is the right design. It only works if acceptance actually checks, atomically, against live availability and takes the reservation then. A quote written from a stale number and accepted against the same stale number is a promise made twice from a figure that was never true.

The failure is worse for the salesperson than for the system. She was not careless. She read the number the interface gave her, and the interface did not tell her it was a snapshot.

The support agent who cannot see the shipment

“Where is my order” is the most common inbound contact for any business that ships goods, and it is the one a split architecture answers worst. The agent needs a chain: caller to customer, customer to order, order to shipment, shipment to tracking number. Every hop that crosses a system boundary depends on a join key that neither system owns.

When one of those hops fails, the agent does the human thing and asks the warehouse. The escalation costs more than the answer, the customer waits, and the ticket stays open long enough to breach whatever target you set. Multiply by the volume of a normal week and the split architecture has quietly hired someone.

There is a second-order effect that matters more. When order context is not available inside the support tool, agents start keeping their own notes about orders in the ticket, which creates a third place where order facts live and the only one nobody governs.

The failure case: a refund against a partially shipped order

A customer orders six units. Four ship immediately, two are backordered. The invoice raised at the first shipment covers four. Two weeks later the customer cancels the remainder and asks for a refund on one of the units already received.

The support agent sees an order for six in the CRM’s order tab, because that tab was synced at order creation and shows ordered quantities. The agent raises a credit for two sixths of the order value, reasoning from the wrong denominator. Finance posts it. The customer is refunded for a unit that was never invoiced and not refunded for the one they returned.

Unpick that and there is no villain. The CRM’s copy of the order was accurate as of order creation and had no concept of partial shipment, because partial shipment is an inventory state that the sync was never designed to carry. The refund was calculated correctly from incorrect inputs, which is the most expensive kind of correct.

The structural lesson: a synced copy of an order is only ever a copy of the order’s shape at the moment of the sync. Order state changes many times after creation, and the states that matter most for money, partial shipment and backorder, appear latest.

What has to be shared, as opposed to synced

Not everything needs to live in one place. The list of things that do is shorter than it looks, and it is specific.

  • Customer identity, as one row with a stable internal id that orders, tickets and invoices reference rather than copy.
  • Order lines with their live quantities: ordered, reserved, picked, shipped, backordered. These are the fields that change after creation.
  • Reservation state, because a promise is only real if it is enforceable where the next order is taken.
  • Shipments and tracking, because that is the answer to the most frequent question anyone asks you.
  • The invoice link, so the amount can be traced to the units that actually left.

Everything else, product marketing copy, supplier terms, campaign attribution, can live wherever it is most convenient and be reported on periodically. The test for whether something must be shared is whether a decision or a promise is made from it in real time.

How Oneop keeps order context on the customer record

In Oneop’s CRM, a contact is one row, and a support ticket’s requester resolves to the same row that a deal and an invoice reference. An account view lists every quote, sales order and invoice for that account, with drill-down to line items, so order context is part of the customer record rather than a tab fed by a job.

The quote-to-order path is a single transaction. Converting an accepted quote creates the sales order and reserves stock together, and it is idempotent on the workspace and quote pair, so a repeated call returns the existing records rather than a duplicate order. Where a quote has no inventory lines, no sales order is created at all, and the invoice is raised directly. Where it does, the invoice is deliberately deferred to shipment, so you never invoice goods that have not left the building.

Because stock is in the same system, the availability figure a quote is written against is the same number the reservation is taken from, and the reservation is enforced at the write rather than in the interface. The help desk sits on the same records, so the agent answering a delivery question is reading the order, not a synced summary of it.

Tasks attach to twelve different record types through one engine, which is the same principle applied to work: a follow-up on a backordered line is a task on that record, not a reminder in a separate tool.

The question to ask your own stack

For each of the four questions in the table above, trace how the answer is assembled today and count the boundaries it crosses. Boundaries are not automatically wrong. Boundaries crossed at the moment of a promise are, and that argument in its narrowest form is available-to-promise and why overselling happens. What automation does to the same boundary is in order-to-fulfilment automation without overselling, and the general case is the argument behind how Oneop is built.

Frequently asked questions

Can a CRM and an inventory system be integrated well enough?

They can be integrated well enough for reporting and badly enough for promises. A sync is adequate when the consumer only needs an approximate figure, such as a dashboard or a forecast. It is inadequate wherever a commitment is made, because a commitment needs the current state and the ability to claim it in the same operation, and a copy updated on a schedule can do neither.

Should a sales quote reserve stock?

Usually not, and this surprises people. A quote is an offer, not an order, and reserving against every quote starves real demand with speculation. What a quote should carry is a clear statement of whether the goods were available when it was written and the fact that availability is confirmed at acceptance. If your business does reserve at quote stage, the reservation needs an expiry and a sweep that releases it.

What should a support agent be able to see about an order?

The order's lines and quantities, its current lifecycle state, whether any line is backordered, the shipments raised against it with their tracking numbers, and the invoices it produced. That is enough to answer almost every inbound 'where is my order' without an internal escalation. Cost, margin and supplier terms are not part of answering that question.

Where does the customer record end and the order record begin?

The customer record owns identity: the canonical name, the identifying addresses, the company relationship and a stable internal id. The order record owns the episode: what was bought, at what price, in what quantity, against which warehouse, and what shipped. Orders reference the customer by id rather than storing their own copy of the customer's name and address, because copies are what drift.

What is the first thing to fix if the two systems are already separate?

Pick one system as the authority for customer identity and make every merge and identity edit happen there, so at least the join key is stable. Then move the surfaces that make commitments onto whichever system holds real-time stock, so that a promise is never made from a copy. Splitting reads from writes this way removes the worst failures without a migration.

Written by

The Oneop team

Writing from the team that builds Oneop — an AI customer platform with web chat and email on top of a real CRM, help desk, ledger and warehouse.

Related reading

Start on the free plan and see the real thing

No credit card. Free plan, 2 seats.

Free forever · 2 seats · No credit card