Skip to main content

Lab Report (EDD) format

The Lab Report format is Erde's electronic data deliverable (EDD) shape for laboratory results — the structured, multi-sheet workbook a laboratory or LIMS exports so an entire report (the report header, its samples, analyses, and results) loads in one import. This page is the field-level contract: every sheet, every column, which are required, and how the sheets link to one another.

It documents the import upload columns, not the stored records. For the fields, types, and constraints of the records this import creates — the Lab Report, Lab Analysis, and Lab Result — see the Lab data reference.

Two lab formats — pick the right one

Erde ships two lab import formats:

  • Lab Report (this page) — a multi-sheet EDD for laboratory/LIMS exports. Every sample, analysis, and result carries the lab's sample code, which is how the lab ties the sheets together.
  • Lab Results (Single Sheet) — a single flat sheet for hand-entered or historical/unstructured data. It is more permissive: it can attach results to an existing project sample by field sample code alone (no lab sample code), and it carries two column groups the Lab Report EDD omits — FieldSampleCode/SampleDate on its analysis and result rows (the anchor for those code-only rows) and the inline Val_* validation columns for already-validated historical data. The validated qualifier rides in Val_Qualifier, from which disposition (rejected, estimated, and so on) is derived through the Qualifiers reference data — there are no separate rejected or estimated columns.

If your data is a lab deliverable, use this format. If you are hand-building one wide sheet to attach results to samples already in Erde, use Lab Results (Single Sheet). See Import formats for the full list.

File shape

AspectValue
SheetsLabReport, Sample, Analysis, and Result — all four are required. There is no Batch sheet: batch codes ride in the Analysis sheet's typed batch columns
UploadOne Excel workbook (.xlsx, .xls) with one named sheet per table, or one CSV (.csv, .txt) per sheet — name each CSV after its sheet (matching is case-insensitive)
Header rowThe first row of every sheet is the column headers. Column order does not matter; column names do (use the names in the tables below)
Reports per fileA Lab Report upload describes one report — the LabReport sheet has exactly one row, and every child row belongs to it
Row limit100,000 rows total across all sheets in one import
TemplateUse Download Template on the import create form to get a starter workbook with every sheet and column

Extra columns Erde does not recognize are ignored with a warning; a missing required column (a header that must be present) fails the import up front.

The lab's codes are the glue. A laboratory's EDD already contains these — they are how the lab itself relates a result back to the sample it ran.

  • Report → children. Sample, Analysis, and Result rows may carry a ReportCode column pointing at the LabReport row's ReportCode. In a single-report Lab Report upload you can leave it blank — every child is grouped under the one report automatically.
  • Sample → Analysis → Result. The Lab Sample Code (LabSampleCode) threads the three: a Sample row defines the lab sample, and the Analysis and Result rows for it repeat the same LabSampleCode.
  • Result → Analysis. A Result is matched to its Analysis by a composite key: LabSampleCode + AnalysisMethod + AnalysisDate + Fraction + RunType (+ ColumnNumber when dual-column GC runs are present). These columns must agree between the Analysis row and its Result rows or the result is reported as orphaned.
  • Batches. An Analysis row carries its batch codes in three optional typed columns — LeachateBatchCode, PreparationBatchCode, and AnalysisBatchCode — the shape most LIMS export natively, since the prep and analytical batch are single-valued fields on the test record. The column a code appears in is its type declaration, and any code is legal: at commit, Erde creates one batch per distinct code-and-type on the report and assigns each analysis its typed batches. There is no Batch sheet — a workbook that includes one is rejected with a message telling you to move the codes into the typed columns and remove the sheet.
Lab sample code is required in this format

Every Sample, Analysis, and Result row must carry its LabSampleCode — it is the lab's linking key and the carrier for sample-level metadata (percent moisture, prepared-by, QC classification). A row that leaves it blank is rejected at validation with a clear message. To attach results to an existing project sample by field sample code instead, use the Lab Results (Single Sheet) (flat) format.

Enumerated columns (Report Status, Sample Type, Fraction, Basis, and so on) accept either the code or the name of the value — see Codes and names. The tables below link each enumerated column to its value list in Enumerations and codes.

LabReport sheet (required, one row)

The report header. Exactly one row.

ColumnRequiredDescription
ReportCodeYesThe report identifier, max 50 characters. Unique within the Project. Children point at this with their own ReportCode column.
LaboratoryNoThe laboratory that ran the work (reference lookup). A report with no laboratory warns on save.
ChainOfCustodyNoThe Chain of Custody that delivered the samples (reference lookup, resolved within the report's Project).
ReportStatusNoOne of the Lab Report status values. Defaults to Preliminary on import.
ReportDateNoWhen the lab issued the report.
SampleReceiptDateNoWhen the lab received the samples. Must be on or before the report date.
ReportedByNoFree text, max 100 characters.
ReportNotesNoFree text, max 2000 characters.

Sample sheet (required)

One row per lab sample — both field samples and lab QC samples (method blanks, LCS, matrix spikes, and so on).

ColumnRequiredDescription
ReportCodeNoLink back to the LabReport ReportCode.
LabSampleCodeYesThe lab's sample identifier. The linking key for this sample's analyses and results.
FieldSampleCodeCond.The field Sample code. Required for field samples (so the lab sample resolves to a project sample); omit for lab QC.
SampleDateCond.The field sampling date. Part of the project-sample match (FieldSampleCode + SampleDate) for field samples.
MatrixCond.The sample Matrix (reference lookup). Required for field samples; omit for lab QC.
SampleTypeYesA field Sample type or a Lab QC type classification — this value also decides whether the row is a field sample or lab QC. No default; it must be explicit. The sample origin (Field / Lab) is derived from it.
ParentLabSampleCodeNoThe parent lab sample code, for QC tied to a parent (for example a matrix-spike's source).
IsBatchOnlyQcNotrue/false. Marks QC that belongs to a batch rather than a specific sample.
PreparedByNoFree text.
PercentMoistureNoPercent moisture for the sample, wet (as-received) basis expected — so 0–100. Values above 100 warn but load as reported (dry-basis gravimetric water content can legitimately exceed 100% for peat / organic sediment / sludge). Stored as reported; never computed with.
SampleNotesNoFree text.

Analysis sheet (required)

One row per analysis run. Every row must repeat its sample's LabSampleCode.

ColumnRequiredDescription
ReportCodeNoLink back to the LabReport ReportCode.
LabSampleCodeYesThe sample this analysis ran against — must match a Sample sheet row.
LabAnalysisCodeNoThe lab's own identifier for this analysis run (its LIMS test/run id), preserved so you can cross-reference the exact run when you contact the lab. Reference only — it plays no part in matching results to analyses. Must be unique within the report; max 50 characters.
AnalysisMethodYesThe analytical Method (reference lookup).
LeachateMethodNoLeaching procedure, when applicable (reference lookup). Part of the analysis identity: a total run and a TCLP run of the same method are distinct analyses.
PreparationMethodNoSample preparation procedure, when applicable (reference lookup).
RunTypeNoAnalysis run type. Defaults to IN (Initial). Part of the result-to-analysis match.
FractionYesFraction. Part of the result-to-analysis match.
MatrixTypeYesThe Matrix type.
LeachateDateNoOn or before the preparation and analysis dates.
PreparationDateNoOn or before the analysis date.
AnalysisDateNoWhen the analysis ran. Part of the result-to-analysis match.
DilutionFactorNoPositive. Defaults to 1. A value below 1.0 warns (pre-concentration). Part of the analysis identity: same-day serial dilutions (a 10x and a 100x run) are distinct analyses.
LeachateBatchCodeNoThe leach batch. The lab's batch code, max 50 characters — any code is legal; commit creates the batch on the report when no Leach batch with that code exists yet.
PreparationBatchCodeNoThe preparation batch (digestion / extraction / other prep lot). Same use-or-create behavior; the procedure itself goes in PreparationMethod.
AnalysisBatchCodeNoThe analytical (instrument run / QC) batch. Same use-or-create behavior. The column a code appears in is its batch type — one batch per distinct code-and-type is created at commit.
AnalyzedByNoFree text, max 100 characters.
ColumnNumberNoGC column (1C primary / 2C confirmation). Disambiguates dual-column GC runs.
InstrumentIdentifierNoFree text, max 100 characters.
SubsampleAmountNoPositive. Requires SubsampleUnit.
SubsampleUnitNoUnit for the subsample amount (reference lookup). Requires SubsampleAmount.
FinalVolumeNoPositive. Requires FinalVolumeUnit.
FinalVolumeUnitNoUnit for the final volume (reference lookup). Requires FinalVolume.
CountTimeNoRadiochemistry. Requires CountTimeUnit.
CountTimeUnitNoTime unit (SEC / MIN / HR).
RadReferenceDateNoRadiochemistry reference date.
AnalysisNotesNoFree text, max 500 characters.

Result sheet (required)

One row per analyte outcome. The first several columns repeat the Analysis row's linking key so each result attaches to the right analysis.

ColumnRequiredDescription
ReportCodeNoLink back to the LabReport ReportCode.
LabSampleCodeYesThe sample — must match the parent Analysis row.
AnalysisMethodYesMust match the parent Analysis row (part of the match key).
AnalysisDateCond.Must match the parent Analysis row where set (part of the match key).
FractionYesMust match the parent Analysis row (part of the match key).
RunTypeNoMust match the parent Analysis row (part of the match key). Defaults to IN.
ColumnNumberCond.Must match the parent Analysis row when dual-column runs are present (part of the match key).
LeachateMethodCond.Picks the analysis when a leached and an unleached run otherwise share the match key. Blank matches the run with no leachate method (or the only matching run).
DilutionFactorCond.Picks the analysis when same-day serial dilutions share the match key. Blank inherits from the only matching run; when several runs match, the row must say which — the import rejects the ambiguity.
CasNumberNoThe analyte's CAS number; one way to resolve the analyte.
AnalyteCond.The Analyte (reference lookup — by name, alias, code, or CasNumber). The lab's literal value is captured automatically as the result's lab analyte name (max 200 characters), so there is no separate column. Required for all result types except TIC: for a TIC, put the tentatively-identified compound name here — it links to a catalog analyte when one matches, otherwise it is kept as the lab's label with no link.
ResultTypeYesLab result type (Target / Surrogate / Internal Standard / TIC).
DetectedResultYesDetected result (Y / N).
ReportableResultYesReportable result (Y / N).
BasisYesBasis (As Received / Dry Weight / Wet Weight / Lipid Weight). Every result row must carry a value — a defaulted basis on a dry-weight result is a reporting error, so blank cells are rejected. Wet, dry, and lipid-normalized rows for the same analyte attach to the one analysis as sibling results. For uniqueness, basis counts as dry vs lipid vs non-dry: As Received and Wet Weight describe the same uncorrected measurement, so two rows for one analyte differing only in that wording are rejected as duplicates.
ResultValueCond.The numeric result. Cannot be set together with ResultText. A detected (non-surrogate) result needs a value, text, or EMPC.
ResultTextCond.A text result, max 200 characters. Cannot be set together with ResultValue.
EmpcValueNoEstimated Maximum Possible Concentration. Non-negative.
UnitYesThe measurement unit (reference lookup).
LabQualifierNoThe lab's qualifier flag, max 50 characters.
MDLNoMethod Detection Limit. Non-negative.
MRLNoMethod Reporting Limit. Non-negative; ≥ MDL.
OtherDetectionLimitNoOther detection limit. Non-negative; requires DetectionLimitType.
DetectionLimitTypeNoClassification for the other detection limit (reference lookup). Requires OtherDetectionLimit.
RetentionTimeNoNon-negative. Also discriminates TIC results.
SignificantFiguresNoPositive integer, max 20.
QC_*NoQuality-control columns: QC_OriginalConcentration, QC_SpikeAmount, QC_PercentRecovery, QC_RPD, QC_LCL, QC_UCL, QC_RPDControlLimit. See QC and radiochemistry.
Rad_*NoRadiochemistry columns: Rad_MDC, Rad_MDA, Rad_CriticalLevel, Rad_CountingError, Rad_TPU, Rad_UncertaintyBasis (Uncertainty basis, never defaulted), Rad_CSU, Rad_TracerRecovery, Rad_IsDecayCorrected.
ResultNotesNoFree text, max 500 characters.
"Required" here means per row

A Yes means each data row must carry a value. Required columns (headers that must exist on the sheet) are a separate, stricter check — a missing required header fails the import before any row is read. Cond. marks a value required under the stated condition. The detailed cross-field rules (date ordering, paired amount/unit, detected-vs-non-detect, QC sign constraints) are enforced at validation and catalogued in the Lab data reference.

After upload

Erde organizes the workbook into the report, sample, analysis, and result review tabs, validates every row, and flags anything that needs attention before you commit. The Analysis tab also shows a read-only summary under its grid of the batches commit will create — one line per distinct code and type, with how many analyses reference it. The summary is derived from the grid and recomputes as you edit rows; it is never editable and its lines are never staged as rows. Walk through the review flow in Import data, and see Troubleshoot and roll back imports for reading validation feedback and undoing a commit.