Data

Building products & industrial supply
Sample data. Every figure, product and customer name is invented to show the shape of the tool. Real numbers appear once your own data is loaded.
Quality score
58 / 100
22 issues found · blocking −15, serious −5, advisory −1
Files
22
all ingested
Tables
15
32,997 rows landed with real types

Rows landed per table

Top 12 of 15 tables, from your structured uploads.

crew_hours14Kjob_costs8,383estimate_lines4,256po_lines1,963job_activity1,912leads706invoices_ar570purchase_orders442vendor_price_list416change_orders221jobs218inventory118
CategoryValue
crew_hours14K
job_costs8,383
estimate_lines4,256
po_lines1,963
job_activity1,912
leads706
invoices_ar570
purchase_orders442
vendor_price_list416
change_orders221
jobs218
inventory118

Files by type and status

Every status is on the chart — a failed file is a fact, not an embarrassment.

csv13pdf5docx2txt1xlsx1
CategoryValue
csv13
pdf5
docx2
txt1
xlsx1

Sources

Files can arrive by upload or straight from a cloud drive. Synced files run through the identical pipeline — re-syncing an unchanged file is detected and skipped.

22 uploaded by hand

Data quality

Found by reading your rows, not by a rule you configured. Issues that corrupt grouping also ride the charts they affect.

serious: 5 advisory: 17

SeverityColumnKind RowsWhat it means
seriouschange_orders.statusmissing values4444 of 221 rows (19.9%) are blank with no pattern explaining which ones.
seriousinvoices_ar.invoice_numberduplicate identifiers4invoice_number is named like a unique key and is 99.3% unique, but 4 row(s) share a value with another row. Joining on it multiplies rows and double-counts money.
seriousjob_costs.invoice_numberduplicate identifiers364invoice_number is named like a unique key and is 95.7% unique, but 364 row(s) share a value with another row. Joining on it multiplies rows and double-counts money.
seriousjob_costs.job_idorphan references251251 rows (3.0%) reference a job_id that does not exist in jobs. Examples: J-241782, J-241790, J-241994. Any total grouped through jobs silently excludes them.
seriousjob_costs.cost_categorycasing drift03 value(s) differ only by capitalisation, so they group as separate categories: Equipment / equipment; Material / material; Subcontractor / subcontractor
advisorychange_orders.approved_dateconditional column100Blank on 100 rows (45.2%), but that is expected: it is blank exactly when status is 'Pending', 'Rejected', 'Verbal'. Filter on status rather than treating the blanks as missing data, and use the non-blank subset as the denominator.
advisoryinventory.descriptionpossible spelling variants01 pair(s) of near-identical values that may be the same thing typed differently: 2x10x16 #2 SYP / 2x6x16 #2 SYP
advisoryinvoices_ar.paid_datemissing values4747 of 570 rows (8.2%) are blank with no pattern explaining which ones.
advisoryjob_activity.notepossible spelling variants05823 pair(s) of near-identical values that may be the same thing typed differently: Crew pulled to Angier for the morning / Crew pulled to Dunn for the morning; Crew pulled to Angier for the morning / Crew pulled to Micro for the morning; Crew pulled to Benson for the morning / Crew pulled to Dunn for the morning
advisoryjob_costs.tradevalues outside the reference list519519 rows (6.2%) carry a trade that subcontractors does not list: General conditions. Usually fine — only a problem if you expected subcontractors to be exhaustive.
advisoryjob_costs.trademissing values419419 of 8,383 rows (5.0%) are blank with no pattern explaining which ones.
advisoryjobs.actual_complete_dateconditional column41Blank on 41 rows (18.8%), but that is expected: it is blank exactly when status is 'In production', 'Signed, mobilising'. Filter on status rather than treating the blanks as missing data, and use the non-blank subset as the denominator.
advisoryjobs.townpossible spelling variants02 pair(s) of near-identical values that may be the same thing typed differently: Wilson's Mills / Wilsons Mills; Wilson's Mills / wilsons mills
advisoryleads.won_job_idconditional column519Blank on 519 rows (73.5%), but that is expected: it is blank exactly when outcome is 'Lost', 'No response', 'Quoted, no decision'. Filter on outcome rather than treating the blanks as missing data, and use the non-blank subset as the denominator.
advisoryleads.first_contact_atconditional column144Blank on 144 rows (20.4%), but that is expected: it is blank exactly when outcome is 'No response'. Filter on outcome rather than treating the blanks as missing data, and use the non-blank subset as the denominator.
advisoryleads.response_minutesconditional column144Blank on 144 rows (20.4%), but that is expected: it is blank exactly when outcome is 'No response'. Filter on outcome rather than treating the blanks as missing data, and use the non-blank subset as the denominator.
advisorypo_lines.descriptionpossible spelling variants01 pair(s) of near-identical values that may be the same thing typed differently: 2x10x16 #2 SYP / 2x6x16 #2 SYP
advisorypurchase_orders.received_datemissing values2121 of 442 rows (4.8%) are blank with no pattern explaining which ones.
advisorypurchase_orders.promised_datemissing values66 of 442 rows (1.4%) are blank with no pattern explaining which ones.
advisoryvendor_price_list.skupossible spelling variants09 pair(s) of near-identical values that may be the same thing typed differently: DCK-54X6-12 / DCK-54X6-16; LMB-2X10-16 / LMB-2X12-16; LMB-2X4-12 / LMB-2X4-16
advisoryvendor_price_list.descriptionpossible spelling variants011 pair(s) of near-identical values that may be the same thing typed differently: 1x4 D boards KD / 1x6 D boards KD; 2x10 #2 SYP KD / 2x12 #2 SYP KD; 2x10 #2 SYP KD / 2x4 #2 SYP KD
advisoryvendor_price_list.dimensionpossible spelling variants01 pair(s) of near-identical values that may be the same thing typed differently: 1x6x16 / 1x6x6

Your documents

Everything uploaded, and what became of it.

ingested: 22
FileTypeSizeStatus
memo-change-order-policy-2026-06.txtcorrespondence0 KBIngested1 passages
master-services-ridgeview-2025.docxother1 KBIngested1 passages
subcontract-meridian-drywall-2026.docxcontract1 KBIngested1 passages
invoice-ridgeview-remittance-2026-0518.pdfinvoice1 KBIngested1 passages
weekly-price-sheet-piedmont-2026-0727.pdfother1 KBIngested1 passages
order-ack-piedmont-2026-0803.pdfother1 KBIngested1 passages
invoice-tarheel-concrete-2026-0402.pdfinvoice1 KBIngested1 passages
invoice-meridian-drywall-2026-0311.pdfinvoice1 KBIngested1 passages
vendor_price_list.csvdata32 KBIngested1 table(s)
subcontractors.csvdata1 KBIngested1 table(s)
purchase_orders.csvdata49 KBIngested1 table(s)
po_lines.csvdata167 KBIngested1 table(s)

Data catalog

Every table found in your files, landed with real column types.

TableRowsCols Key entitiesSource
acme_corporation_export_branch_stock_summary456branch, categoryAcme-Corporation-Export.xlsx / Branch Stock Summary
acme_corporation_export_vendor_scorecard68vendorAcme-Corporation-Export.xlsx / Vendor Scorecard
change_orders2218co_id, job_id, description, statuschange_orders.csv
crew_hours13,7276employee, job_idcrew_hours.csv
estimate_lines4,2568job_id, line_code, trade, descriptionestimate_lines.csv
inventory1189sku, description, category, branchinventory.csv
invoices_ar5709invoice_number, job_id, payer_typeinvoices_ar.csv
job_activity1,9125job_id, author, entry_type, notejob_activity.csv
job_costs8,3839cost_id, job_id, vendor, tradejob_costs.csv
jobs21818job_id, job_type, site_address, branchjobs.csv
leads70611lead_id, source, job_type, outcomeleads.csv
po_lines1,9639po_number, job_id, sku, descriptionpo_lines.csv
purchase_orders44210po_number, job_id, vendor, branchpurchase_orders.csv
subcontractors147sub_name, trade, license_numbersubcontractors.csv
vendor_price_list4166vendor, sku, description, dimensionvendor_price_list.csv

Time coverage

The date range each table actually spans — gaps here mean missing exports.

TableCoverage
change_ordersco_date: 2024-09-09 to 2026-07-28
crew_hourswork_date: 2024-08-26 to 2026-07-31
inventorylast_counted: 2025-07-19 to 2026-07-28
invoices_arinvoice_date: 2024-09-12 to 2026-07-31
job_activitylog_date: 2024-08-30 to 2026-08-03
job_costscost_date: 2024-08-27 to 2026-07-31
jobsstart_date: 2024-08-24 to 2026-07-30
leadsreceived_at: 2024-08-01 to 2026-07-31
purchase_ordersorder_date: 2024-09-09 to 2026-07-30
subcontractorscoi_expiry: 2026-07-27 to 2027-06-16
vendor_price_listweek_of: 2026-02-02 to 2026-07-27