skip to content

A hosted invoice extractor charges per document — how do you find the monthly volume where running your own becomes cheaper?

level: middleimportance: must knowfreq 62%

answer

  1. two cost shapes, not two prices
  2. fixed against variable
  3. the gap per document pays the floor
  4. floor divided by per-document saving
  5. compare against forecast volume, not today's

basics

~20 s

Divide the fixed monthly spend of running your own by the per-document saving it earns: crossover volume = fixed monthly cost / (hosted price per document - your own marginal cost per document). Below that volume, buying is the cheaper of the two recurring bills.

solid answer

~40 s

The two options have different cost shapes, so compare shapes rather than prices. Buying is almost all variable: `p` per document, near zero when no invoices arrive. Running your own is mostly fixed: a monthly floor `F` that exists for the first document of the month, plus a small marginal `m` per document. Set `p * V = F + m * V` and solve for the crossover volume `V* = F / (p - m)`. With `F` = 9,000 a month, `p` = 0.05 and `m` = 0.01, that is 9,000 / 0.04 = **225,000 documents a month**. The denominator is the whole trick: what pays down the floor is the *gap*, not the hosted price. Then compare `V*` against the volume forecast over the life of the decision, not against this month's.

code

pseudocode · 17 lines
pseudocode
FIXED_OWN_MONTHLY    = 9000     // serving floor + amortised retraining + upkeep
MARGINAL_OWN_PER_DOC = 0.01
HOSTED_PER_DOC       = 0.05

saving_per_doc = HOSTED_PER_DOC - MARGINAL_OWN_PER_DOC   // 0.04
if saving_per_doc <= 0:
    return "no crossover: buying is cheaper at every volume"

crossover_volume = FIXED_OWN_MONTHLY / saving_per_doc     // 225000 docs/month

volume = 90000
months = 0
while volume < crossover_volume:        // 8% growth month on month
    volume = volume * 1.08
    months = months + 1

return crossover_volume, months         // 225000, 12

go deeper

for a junior

Recall that the two options have different shapes: one is mostly a monthly floor, the other is mostly per document. The crossover is simply the volume where the two monthly totals meet.

for a middle

Derive it rather than quoting it: set the two monthly totals equal and solve for volume, then say out loud what belongs in the fixed floor and what belongs in the per-document figure.

for a senior

Show that you compare the crossover against a volume forecast over the life of the decision, and that you have checked both sides for costs the quoted price hides.

for a principal

Treat the crossover as one input among exit cost, data exposure and reversibility. A number that says build can still lose to a commitment the team cannot unwind later.

## Compare shapes, not prices A build-or-buy comparison for a prediction service is a comparison of **cost shapes**. A hosted extractor quoted per scanned document is almost entirely **variable**: process nothing this month and the bill is near zero. Running your own extractor is mostly **fixed**: the serving capacity has to exist before the first document of the month arrives, the retraining run happens on its own schedule, and the people who keep the pipeline alive are paid whether volume doubles or halves. Write both totals for a month of volume `V`: - buying: `p * V`, where `p` is the quoted price per document - running your own: `F + m * V`, where `F` is the monthly floor and `m` is what one more document genuinely costs you Setting them equal gives the **volume crossover**: ``` V* = F / (p - m) ``` The denominator carries the argument. The floor is paid down by the *gap* between the quoted price and your own marginal cost — not by the price alone, and not by your marginal cost alone. ## A worked crossover With `F` = 9,000 a month, `m` = 0.01 per document and `p` = 0.05 per document: | documents / month | buy (`0.05 * V`) | own (`9,000 + 0.01 * V`) | cheaper | |---|---|---|---| | 90,000 | 4,500 | 9,900 | buy | | 225,000 | 11,250 | 11,250 | equal | | 400,000 | 20,000 | 13,000 | own | `9,000 / (0.05 - 0.01) = 225,000`. Two arithmetic slips are common on the way there. Dividing by `p` alone gives 180,000 and quietly assumes your own documents are free to process. Dividing by `m` gives 900,000 and uses a number that is not a saving at all. ## Draw the line the same way on both sides The comparison is only honest if `F` and `m` are drawn with the same pen on both options. - **The buy side is not purely variable.** Integration, the connector that submits documents, and the exception queue that handles low-confidence fields are yours on either option. - **Costs common to both options cancel**, so they may be left out — but only after you have checked they really are common. Reviewing a wrongly read total is work whoever extracted it. - **The floor is what must exist at zero volume**: idle serving capacity, amortised retraining, the standing share of a person's time, and any capacity held for the month-end burst but unused the rest of the month. - **The marginal figure is only what scales with a document.** If a cost does not move when one more invoice arrives, it is not in `m`. - **A quoted price with a committed minimum is not variable either** — a floor on their side is a floor on yours. ## The volume crossover is not the time to payback The two questions are routinely confused, and they give different verdicts. 1. The **volume crossover** compares two *recurring* monthly costs and answers "at what volume does running our own become the cheaper bill?" 2. **Time to payback** compares the *one-off* engineering spend to reach a first version against the monthly saving earned after the crossover, and answers "how long until that spend is recovered?" 3. A team can be past the crossover and still lose: two quarters of build effort, then a volume forecast that flattens in the third, and the saving never accumulates far enough. Because of that, the one-off build effort does not belong in `F`. Keep it in the payback calculation where it answers a question about time. ## Growth makes it a dated decision This month's volume is the wrong input, because the decision lives as long as the commitment does. At 90,000 documents a month growing 8% month on month, `1.08^11` is about 2.33 (roughly 210,000) and `1.08^12` about 2.52 (roughly 227,000), so the crossover arrives in **month 12**. That does not say "build now". It says: buy, write the crossover and the growth assumption down beside the decision, and revisit before month twelve. The crossover itself moves while you wait — a renegotiated price lowers it, a falling marginal cost raises it, a flattening forecast delays it. And past the crossover the gap is still not the whole argument: exit cost, where customer documents are processed, and the value of keeping the decision reversible all sit outside this arithmetic.

  • Volume is 90,000 documents a month and grows 8% monthly — when does the crossover arrive?
    Solve 90,000 * 1.08^n >= 225,000. `1.08^11` gives about 210,000 and `1.08^12` about 227,000, so month 12. A comparison that only holds for a year is an argument to buy now with a review date attached, not an argument that buying is right.
  • Why is the volume crossover not the same as the time to pay back building it?
    The crossover compares two recurring monthly bills and answers "at what volume". Payback compares the one-off engineering spend against the monthly saving earned after the crossover and answers "how long". A team can cross the volume line and never recover the build months if the forecast moves first.
  • What moves the crossover before you ever reach it?
    A renegotiated price lowers `V*`; a fall in your own marginal cost per document raises the gap and lowers it further; a shrinking floor lowers it; a flattening volume forecast simply delays it. Recompute it on the schedule you review the contract, not once.

saying these in an interview costs you the question

  • Comparing the quoted price against hardware cost alone, ignoring upkeep
  • Treating the hosted option as having no fixed cost on your side
  • Assuming your own marginal cost per document is zero
  • Deciding on this month's volume when the forecast crosses within a year
  • Confusing the volume crossover with time to pay back the build effort