It Will Not Read the Vendor's Own PDF
The quotation importer opens PDFs, Word files and spreadsheets, and it will still refuse your supplier's own letterhead quote. That refusal is the feature: a parser that guesses at a price it cannot actually find is worse than one that declines, because a guessed price gets approved.
A supplier sends a quote as a PDF on their own letterhead, and the buyer types it in. Every procurement team on earth does this, and every one of them has asked why the software cannot just read it.
The honest answer is not that the software cannot open the file. It opens PDFs. It opens Word documents and spreadsheets too — three separate parsing libraries, five supported formats.
The answer is that opening a document and understanding a document are different problems, and only one of them has a reliable solution.
What the importer actually reads
It reads the quotation templates this product itself produces. The buyer downloads a template, sends it to suppliers, and each supplier fills in prices and sends it back. The importer knows precisely where every figure sits, because the same system laid the document out.
This is an importer, not a general document reader.
That sentence is in the code, and the distinction it draws is worth borrowing whenever you evaluate any "we can read your documents" claim. Reading a known layout is a solved problem with a correct answer. Reading an arbitrary one is inference, and inference has a confidence level rather than an answer.
Why guessing is worse than declining
Consider what a general parser has to get right on a supplier's letterhead quote.
- Which of the numbers on the page is the unit price and which is the line total. Both are money, both sit in columns, and which is which depends on a header the layout may or may not have.
- Whether the price includes tax. Suppliers vary, and the answer is frequently in a footnote rather than in the table.
- Whether a figure is a price or a quantity, when a quantity happens to be written with a decimal.
- Which lines are items and which are subtotals, delivery, or a discount expressed as a negative line.
- What currency it is in, when the symbol appears once at the top and nowhere in the table.
- Whether a two-page quote continued a table or started a new one.
A parser can be built that gets most of this right most of the time. The trouble is what happens on the occasions it does not.
A misread price does not announce itself. It arrives as a number in the right shape, in the right column, on a comparison screen beside two other suppliers. It gets compared, it gets chosen, it becomes a purchase order, and the discrepancy surfaces when an invoice arrives that does not match — by which point the order is placed and somebody is arguing about who agreed to what.
The caller is expected to say so rather than to guess at prices.
So the design refuses. The buyer is told the document could not be read, and types the figures in — which is what they were going to do anyway, and now they do it knowing they are the one who read the page.
The general principle, which is not about procurement
When an automated step can be right most of the time and wrong silently, the question to ask is what the wrong answers cost and who catches them. Where a mistake is loud and cheap, automate and let the errors surface. Where it is quiet and expensive — a price, a dosage, a payment destination — a refusal that hands the work back to a person is a better product than a plausible guess, even though it tests worse and demonstrates worse.
The bug that blamed the customer
One detail from consolidating this code is worth more than the rest of the article, because of how the failure presented.
The upload saved the file to one storage location. The PDF branch of the parser looked for it in a different one. So every PDF import failed — not sometimes, every time, since the day it was written.
And the message it produced was that the file was malformed.
Put yourself on the receiving end. You upload a supplier's quote. The system tells you the document is malformed. You look at the document; it opens perfectly. You conclude the software is fussy about PDFs, and you type the quote in by hand. You do that every time, for months. You never report it as a bug, because it does not present as one — it presents as a limitation you have been told about.
An error message that names the wrong cause is worse than a crash
A crash gets reported. An error blaming the input gets accepted, worked around, and absorbed into how people believe the system behaves. When you write a failure message, the question is not only whether it is accurate but what the reader will do next — and "your file is malformed" sends them to inspect a file that is fine.
The fix was one path. What makes it worth writing down is that the bug lived in a branch that only one of two entry points reached, and consolidating both onto one implementation is what surfaced it. Two code paths doing the same job means one of them can be broken indefinitely, and the one that is broken is whichever gets used less.
Working with the template flow
-
Download the template with the request
The template carries the lines you are asking about, so a supplier is quoting against your list rather than composing their own. This is worth more than the parsing: it is what makes three quotes comparable line by line.
-
Send it as the requested response format
Say plainly that a completed template comes back into the system automatically and anything else is typed in by hand. Most suppliers will use the template when the reason is a working day rather than a preference.
-
Accept that some will not
A large supplier with their own quoting system will send you their own document, and no amount of asking changes that. Type those in. It is the minority case once the template is the default ask.
-
Keep the original either way
The uploaded file is stored privately whether or not it parsed. The document a supplier actually sent is the thing that settles a dispute, and it is worth having regardless of whether a machine could read it.
Our take
This is a refusal we would defend rather than apologise for, and it is the kind of thing that reads badly in a feature comparison. A competitor saying they read any supplier quote is making a claim about the good cases, and the good cases are not where the cost is. A price misread from a letterhead PDF enters the workflow looking exactly like a correct one, gets compared against other suppliers, and becomes an order. Nothing downstream can tell it was inferred. Handing the document back and saying it could not be read puts a person in front of the page, which is where they were anyway. What we would change is not the refusal but its surroundings: the template flow should be easier to run, and the message when a document cannot be read should say what would have worked instead of describing the file as malformed.
What AWRA OpsHub does today
- Import of completed quotation templates in five formats, using three separate parsing libraries for spreadsheets, Word documents and PDFs.
- Downloadable quotation templates in Word and spreadsheet form, carrying the requested lines so suppliers quote against one list.
- One shared implementation behind both the web upload page and the mobile endpoint, so the two cannot drift apart or fail differently.
- The uploaded document stored privately whether or not it parsed, so the supplier's original is retained as the record of what was actually sent.
- A deliberate refusal to infer prices from an arbitrary layout, with the caller expected to report that plainly rather than present a guess as a reading.
- A storage-path defect fixed during consolidation that had caused every PDF import to fail and report itself as a malformed file.
More we can add to your workspace
- A refusal that names the template flow, so a buyer whose document could not be read is told what would have worked rather than being told their file is malformed.
- Assisted extraction with the figures shown for confirmation, where a parse of an arbitrary layout is offered as a draft a person accepts line by line rather than as a reading.
- A supplier-facing page for entering a quote directly, removing the document from the loop for the suppliers willing to use it.
- Template recognition on upload, so a buyer who uploads the wrong file is told which document they sent rather than that it did not parse.
- Import of a supplier's own recurring layout once mapped, for the large supplier whose quote always arrives in the same shape.
- Currency and tax treatment read from the template, so a completed template carries those rather than depending on what the buyer selects afterwards.
Where we point you to a specialist
- We would decline to present an inferred price as a read one. A figure guessed from an unfamiliar layout arrives on a comparison screen indistinguishable from a figure a person confirmed, and once it becomes an order nothing downstream can tell which it was. Where extraction from arbitrary documents is added, it will arrive as a draft for confirmation rather than as an import.
- Where a tender process governs how quotations must be submitted, received and opened, that process governs and we will implement what it requires rather than treating our template flow as equivalent. Which rules bind a given procurement is a question for your own advisers.
- We hold that the supplier's original document is kept whatever happens to the parse. A system that stores only its own interpretation of a quote has discarded the evidence at exactly the point a dispute needs it.
Assisted extraction offered as a draft for line-by-line confirmation is the piece that gets most of the convenience without the risk, because a person still signs off every figure. It is the right shape for this problem and the one to scope.
Three ways to reduce the typing without guessing
Every item here keeps a person in front of the numbers. That is the constraint the design is built around, and none of these relaxes it.
A draft you confirm
Extraction from an arbitrary layout presented as a proposal, with each figure shown beside the page it came from and accepted line by line rather than imported.
A page the supplier fills in
Removing the document entirely for suppliers willing to use it, which is also the version that produces the cleanest comparison.
A better refusal
The smallest item and the most immediately useful: when a document cannot be read, say what would have been readable rather than describing the file as malformed.
We publish scope, not dates.
Scope quotation importFour questions for any vendor claiming to read your documents
Does it read any document, or one you produced?
A good answer sounds like
A straight answer, either way.
What ours actually is
Templates this product produced. Ask this first — most systems answering yes to "can you read a PDF quote" mean a layout they defined.
What happens when it reads a figure wrongly?
A good answer sounds like
A confirmation step before the figure counts.
What ours actually is
The situation is avoided by declining to guess. Where a vendor imports directly, ask what marks an imported figure as unconfirmed on the comparison screen.
Is the supplier's original document kept?
A good answer sounds like
Yes, always.
What ours actually is
Yes, stored privately whether or not it parsed. A system holding only its own interpretation has discarded the evidence.
Does the mobile app read files the same way as the web?
A good answer sounds like
Same implementation.
What ours actually is
One implementation behind both. Worth asking generally: two code paths for one job means one of them can be broken indefinitely, and it will be the one used less.
Make the template the default ask
The parsing is downstream of a habit. Suppliers who receive a template with the request mostly return it, and a returned template is both readable and comparable line by line. The buyers who type in every quote are usually the ones whose request never included one.
Talk through your RFQ flowFrequently asked questions
Can it open a PDF at all?
Yes, and the distinction matters. Three parsing libraries are in use across five formats, and PDFs are among them. What it declines is inferring which figure on an unfamiliar page is a unit price, whether tax is included, and which lines are items rather than subtotals. Opening a document and understanding one are different problems, and only the first has a reliable solution.
Why not attempt a parse and let the buyer check it?
That is a good design and it is on the list of work we can add, with one condition: the figures have to arrive as a draft that is confirmed line by line rather than as an import. The failure being avoided is a guessed price that reaches a comparison screen looking identical to a confirmed one, gets chosen, and becomes an order. A confirmation step is what separates assistance from that.
What actually happens if I upload a supplier letterhead quote?
The file is stored privately and the parse does not produce usable lines, so the buyer enters the figures. Keeping the original either way is deliberate — the document the supplier actually sent is the thing that settles a disagreement later, whether or not a machine could read it.
What was the PDF bug?
The upload wrote the file to one storage location and the PDF branch of the parser read from another, so every PDF import failed from the day it was written. It reported the file as malformed, which sent buyers to inspect documents that were perfectly fine and led them to conclude the system was fussy about PDFs. It was found and fixed while consolidating the web and mobile paths onto one implementation.
Why do templates make quotes comparable?
Because every supplier is quoting against the same list of lines in the same order. Three letterhead quotes for the same requirement routinely describe the lines differently, bundle two items into one, or include delivery in one and separately in another. Aligning them is the actual work of comparing quotes, and issuing a template does it in advance rather than afterwards.
Will suppliers actually use the template?
Most will, when the request explains that a completed template is processed immediately and anything else is typed in by hand. The exception is a large supplier running their own quoting system, who will send their own document regardless. That is a genuine minority once the template is the default ask rather than an option mentioned at the end of a message.