estimating
A Measurement Nobody Can Export Gets Retyped
Every hand-retyped quantity is a chance to transpose a digit into the one document everybody later compares against. Export format is an accuracy feature.
A takeoff ends up in at least three other places: an estimate, a purchase order, and a customer-facing proposal. How the numbers get there decides how often they arrive intact.
If the answer is "somebody reads them off the screen and types them in", the numbers will occasionally arrive wrong, and the error will be invisible because the transposed figure is just as plausible as the right one.
Three exports, three jobs
The document for the file. A PDF with the diagram, the facet table and the provenance. It is read by people, attached to claims, and sent to customers. It needs to be complete and self-contained, including the capture date and the method notes, because it will be opened a year from now with no access to the tool that made it.
The data for the estimate. Machine-readable quantities, every facet, every linear item, with stable field names. This is the one that prevents retyping, and it is the one most often missing.
The format the receiving system wants. Estimating platforms have their own import formats. A tool that produces one saves its user the entire translation step. A tool that does not has made its output somebody else's data-entry task.
If it is CSV, make it a real one
CSV is the lowest common denominator and most of the pain around it comes from implementations that treat the format as "join with commas".
RFC 4180 specifies the format that nearly everything expects: fields containing a comma, a quote or a newline are enclosed in double quotes, and a literal quote inside a quoted field is doubled. Those three rules are the entire specification of the hard part, and skipping them is how an address with a comma in it shifts every subsequent column by one.
Three more practical requirements beyond the RFC.
A header row with stable names. If the column order changes between releases, every integration built against it breaks silently, because position-based readers do not error, they just read the wrong column.
Units in the header, or a units column. "Area" is ambiguous. "area_sq_ft" is not. A quantity without a unit is a number waiting to be misread.
One row per facet, not a summary. The summary can be derived from the rows. The rows cannot be derived from the summary.
JSON for anything structured
For anything more than a flat table, JSON with a documented shape beats CSV, because a roof is not flat data: facets have pitches, edges have types, and the relationships matter.
Two things make a JSON export usable rather than merely present. A version field, so a consumer can tell which shape it is reading. And nulls that mean something: a pitch that was inferred rather than measured should be distinguishable from one that was measured, which usually means a confidence or method field alongside the value rather than a magic number.
The PDF has readers too
The document version is read by people, and some of those people use screen readers, which makes a few things worth getting right.
Text as text rather than as an image of text. A scanned-looking PDF cannot be searched, copied or read aloud, and copying is exactly what somebody will try to do with the quantities.
A logical reading order, and tables marked up as tables. WCAG 2.2 covers what this means in practice and most of it is a property of how the PDF is generated rather than extra work.
Alt text on the diagram, describing what it shows. "Roof diagram with nine labelled facets" is enough and is considerably better than nothing, which is what most generated reports carry.
The test that finds the problem
Export a measurement. Open the data file in a spreadsheet.
Does every facet appear? Are the units unambiguous? Does an address containing a comma land in one cell? Can you sum the facet areas and get the reported total?
Then take the PDF and try to select the total as text.
Four checks, five minutes. Whatever fails is a number somebody in your business is currently retyping by hand, several times a week, with a small chance of error each time.