Procurement & Sourcing

Supplier quote comparison

Tavnit extracts line items from competing supplier quotes, then Matchers pair equivalent items across suppliers and name a champion per line on price. You get a comparison table rather than three PDFs and a spreadsheet you built by hand.

Why this is painful

Comparing quotes is the part of sourcing that never gets easier. Three suppliers send three layouts, describe the same item three different ways, and quote different pack sizes. Someone builds a spreadsheet, retypes everything, and hopes they matched the right rows.

The matching is the actual difficulty. 'M8 hex bolt 50mm', 'Bolt, hex, M8x50' and 'HEX BOLT M8 50MM zinc' are the same item, and no exact-match lookup will ever pair them.

What to extract

FieldWhy it needs care
Supplier identityThe field that names each participant in the comparison. One quote, one supplier.
Item descriptionThe text that gets matched across suppliers. Extract it verbatim — normalising too early destroys the signal matching needs.
Unit priceThe numeric field the champion is decided on. Non-numeric entries like 'POA' are excluded and reported rather than silently ignored.
Quantity and unit of measureUsed as matching context so a 12-pack does not get paired with a single unit.
Lead timeFrequently the deciding factor when prices are close, and rarely captured in manual comparisons.
Validity date and payment termsA cheaper quote with worse terms is not always cheaper.

What makes supplier quotes hard

The same item is never described the same way twice

This is why exact matching fails and why comparison stays manual almost everywhere. Matchers pair rows semantically rather than by string equality, with an LLM tiebreaker for the ambiguous pairs, so differently-worded descriptions of the same item still line up.

Pack size silently breaks a comparison

A quote for a box of 12 against a quote for one unit is not a price difference, it is a unit error — and it is the mistake that survives review because both numbers look reasonable. Context fields let you include quantity and unit of measure in the match, so unlike items stay unmatched instead of producing a wrong winner.

Not every line has a comparable price

Quotes contain 'POA', 'included' and blank cells. Rather than dropping those rows quietly, the comparison excludes them from the championship and records a warning against the row, so you can see what was not compared instead of assuming everything was.

How the pipeline handles it

  • Flows One flow reads every supplier's quote layout into the same field structure — the precondition for comparing them at all.
  • Cleaners Converts currencies so quotes in different currencies are compared on the same basis.
  • Buckets Keeps quotes over time, so today's price can be checked against what the same supplier quoted last quarter.

Common questions

How does it match items described differently by each supplier?
Matching is semantic rather than exact: item descriptions are compared by meaning, with an LLM tiebreaker resolving the ambiguous pairs. 'M8 hex bolt 50mm' and 'Bolt, hex, M8x50' pair up without you maintaining a synonym list.
Can I benchmark against one supplier rather than compare all of them?
Yes. Benchmark mode treats one quote as the baseline and compares every other against it, which is the right shape when you have an incumbent and are testing the market.
What happens to lines that cannot be compared?
Rows with non-numeric prices are excluded from the championship and recorded as warnings against that row, so gaps in the comparison are visible rather than hidden.

Other document types

Try it on one document

Build a flow, send a real supplier quote through it, and see what comes back. Free credits to start.

Start free