Files That Are Not Tables
Most data does not arrive as a clean rectangle. It arrives as a PDF invoice, a spreadsheet with a title row and three tables on one tab, or a scan of something printed. Converting one is easy. Converting the same thing every month, the same way, is the actual problem.
A PDF invoice with the numbers in a box in the corner. A spreadsheet with a title row, a blank row, a table, another blank row, and a second table underneath it. A scan of something that was printed, then signed, then photographed. A tab where somebody merged four cells in 2021 and nobody has dared touch it since.
Converting one of those is easy. We give it away: PDF to CSV and image to CSV, no account needed.
The problem is not the file on your desk. It is the one that arrives next month, in almost the same shape, that has to end up in the same columns as the last one.
Converting is not the hard part
A one-off conversion has a satisfying shape. Upload, wait, download, done. You have your rows.
Then the month turns and you do it again. This time the export has an extra column. Or the supplier renamed "Net Amount" to "Amount (net)". Or the person who did it last month is on leave and the person doing it now makes slightly different decisions about which of the three tables on the tab is the real one.
Nothing has broken. There is no error message. You simply have two months of data that were read by two different sets of judgements, and no record of what either of them were.
That is the failure this is built around. Not extraction — repetition.
What happens when Mammoth reads a file
Google Sheets, an Excel or CSV upload, and a PDF all go through one flow: Source → Compare → Save. Same three steps regardless of what you gave it.
First it renders the source faithfully, rather than quietly parsing it out of sight. A spreadsheet comes back with its formatting artefacts and stacked blocks intact. A PDF comes back as the page, with the table regions it detected outlined on top of it. If there are several tables in the document, it says so and gives you a jump list.
The point of showing you the source as it actually is, rather than a cleaned-up guess, is that you can see what it thinks before you agree to it.
Scanned and image-only PDFs go down the same road. A printed document that was photographed or scanned, and never existed digitally, does not need a different process from one that did.
Then a structural classifier looks at the shape of what it found and routes it down one of three paths.
Clean
A single rectangular table, a detected header row, no merges, columns that hold one type each. There is nothing to decide, so it does not ask. The file imports as-is with a short confirmation, and you move on.
Messy
Stacked blocks, merged cells, dirty rows, or several tables with different shapes. The AI interprets it automatically and shows you the result — not a spinner and a promise, the actual output next to the source.
The prompt that produced that reading is shown as a label, not an input box. You can open and edit it, but it is presented as something that already happened rather than a blank field asking you to be clever. If you disagree with the reading, you change the prompt and it re-runs.
For a PDF with several tables, each one detected becomes a card you can include or exclude. Tables that share a schema get stitched into one dataset. Tables that do not become separate datasets. You pick.
Ambiguous
Several plausible readings, or a document with no clear table in it at all — an invoice is the obvious case. There is no honest default here, and the AI does not guess.
The prompt block opens empty with a dashed border and a couple of suggestions, and the "Looks right" button stays disabled until you have actually run something. It would be easy to have it produce an answer. An answer you did not ask for, on a document where it had no basis to choose, is worse than a blank box.
The prompt is the recipe
This is the part that matters, and it is easy to skim past.
When you commit, you are not saving a file. You are saving the reading — the prompt and the resolved field mappings — as a recipe. Next time the same source arrives, that recipe replays deterministically. Same judgements, same columns, without anyone remembering what they were.
The committed schema becomes the contract. A new week of data, or an extra block appended to the bottom, adds rows rather than changing the shape.
What happens when the shape changes
Eventually the shape does change, and this is where most pipelines fail quietly.
A refresh that cannot reproduce the committed schema is rejected. Not coerced, not partially applied, not filled with blanks. The last good data stays exactly where it is, and the reason surfaces in the Workflow Monitor for you to resolve once — after which the recipe re-baselines and carries on.
This is fixed behaviour, not a setting somebody could have turned off. The alternative — accepting a mismatched refresh and letting it through — is how a dashboard ends up quietly wrong for six weeks.
If you have automated collection running, the same file dropped twice does not produce two runs. Dedup is by file content hash, so a re-send or a duplicated drop is recognised rather than double-counted.
One thing it does not do
The classifier reads table shape, not cell values.
That has a specific consequence worth knowing before it bites you. A structurally perfect file whose numbers use a European decimal comma routes down the clean path and commits without a prompt — because the clean path has no gate, and the shape genuinely was fine. Value-level parsing assumes US/UK convention, so 1,234 is read as one thousand two hundred and thirty-four rather than as 1.234.
Nothing rejects it and nothing warns you. It is a silent-corruption case, not an error case, which makes it the one to check by eye on the first import of any European source.
We would rather write that down than have you find it in a board pack.
What this costs
The interpreter is available wherever its source is, and file upload and Google Sheets are on Free and up — there is no separate paywall on reading a file properly.
Re-uploading a new version of the same file, and one-time PDF extraction, work on every plan. Collect and watch — a watched folder, scheduled collection, automated recurring file processing — is Pro and above, because that is the point where this stops being a tool you visit and becomes something that runs without you.
Start with the file on your desk
If you just need this one PDF turned into rows, use the free converter and get on with your day — PDF to CSV, or image to CSV if it is a photograph or a screenshot.
If you already know this file is going to arrive again next month, the conversion was never the interesting part. Recording how you read it is.
And once it is in and correct, it has to end up somewhere — which is its own problem, and a more common place for projects to stall than getting the data in ever was.