Certificate of analysis
nutrab2b.quality.coa_issued.v2 · Quality & compliance
- Purpose
- Lot test results against specification, multi-method, signed by QA; includes USP <2232> daily-dose evaluation and allergen declaration.
- When to send
- Lot released by QA.
- Sender → receiver
- Supplier or lab → Buyer
- Expected responses
- ACK
- Equivalent standards
- X12: 863 (Report of Test Results) · EDIFACT: QALITY · GS1: - · EPCIS: ObjectEvent inspecting (ilmd)
- Scenarios using it
- Full order-to-cash · Partial acceptance with back-order · Quantity change after acknowledgement · Cancel race after shipment · Split shipment, two lots · Over-shipment beyond tolerance · Multi-pallet, multi-lot SSCC hierarchy · Release against blanket contract · Failed CoA blocks shipment · CoA marked PASS but over USP <2232> · Out-of-spec lot ships under deviation · Hold blocks shipment until release · Undeclared allergen · Organic certificate expired before shipment · Remaining shelf life too short · Cold-chain excursion · Out-of-order events are parked and released · Dropped event, gap detected, replay · Three-way match failures · Short receipt settled with credit note
Fields and mappings
| Field | Type | Req | Description | Code list / format | EDI / GS1 / SAP mapping |
|---|---|---|---|---|---|
| coa_id | string | yes | CoA id | ||
| lot_number | string | yes | Lot / batch | ||
| item_id | string | yes | Item | ||
| ingredient | string | Ingredient | ingredient | ||
| mfg_date | date | yes | Manufacture dateNB-R007 | ||
| expiry_date | date | yes | Expiry / retestNB-R007 | ||
| lab_gln | string | Testing laboratory GLN | |||
| lab_scheme | string | Lab accreditation | quality_scheme | ||
| daily_dose_g | number | Daily dose used for USP <2232> evaluation (g)NB-R013 | |||
| results | array<object> | yes | Results | ||
| analyte | string | yes | Analyte | analyte | |
| method | string | yes | Method | method | |
| value | number | Numeric result | |||
| text_value | string | Text result (e.g. 'Absent', 'Conforms') | |||
| uom | string | yes | Unit | uom | |
| min | number | Spec min | |||
| max | number | Spec maxNB-R013 | |||
| lod | number | Limit of detection | |||
| status | string | yes | Result statusNB-R003 | result_status | |
| allergens_declared | array<string> | Allergens declared present (allergen codes)NB-R009 | |||
| released_by | object | yes | QA release | ||
| name | string | yes | Name | ||
| at | datetime | yes | Released at |
Business rules
- NB-R003 Lot without passing CoA, every shipped lot needs a CoA with all results PASS/ND/BLQ.
- NB-R007 Expiry before manufacture, expiry date must be after manufacture date.
- NB-R009 Allergen not declared, an allergen in the product master is missing from the CoA / label declaration.
- NB-R013 Heavy metal over USP <2232>, ppm × daily dose exceeds permitted daily exposure.
Implementation notes
- Report every test in the PRODUCT specification; results below LOD use status ND with lod set.
- Attach the signed PDF as attachments[doc_type=COA] with its SHA-256; the structured results are authoritative for rules.
- Set daily_dose_g to the finished product's maximum daily intake so USP <2232> can be evaluated (NB-R013).
Example
{
"specversion": "2.0",
"id": "evt-coa-ASH-26-118-1",
"type": "nutrab2b.quality.coa_issued.v2",
"source": "urn:gln:4012345000009:erp",
"subject": "ASH-26-118",
"time": "2026-11-02T09:00:00Z",
"datacontenttype": "application/json",
"dataschema": "https://nutrab2b.org/schemas/2.0/COA.json",
"sender": {
"gln": "4012345000009"
},
"receiver": {
"gln": "0614141000012"
},
"correlationid": "CONV-RFQ-1001",
"idempotencykey": "COA:ASH-26-118:1",
"sequence": 1,
"env": "test",
"data": {
"coa_id": "COA-ASH-26-118",
"lot_number": "ASH-26-118",
"item_id": "ASH-KSM-5",
"ingredient": "ASHWAGANDHA",
"mfg_date": "2026-10-01",
"expiry_date": "2029-09-30",
"lab_gln": "8901234000006",
"lab_scheme": "ISO_17025",
"daily_dose_g": 0.6,
"results": [
{
"analyte": "ASSAY",
"method": "HPLC",
"value": 5.3,
"uom": "P1",
"min": 5,
"status": "PASS"
},
{
"analyte": "PB",
"method": "USP_2232",
"value": 0.21,
"uom": "59",
"max": 0.5,
"status": "PASS"
},
{
"analyte": "AS",
"method": "USP_2232",
"value": 0.1,
"uom": "59",
"max": 1.5,
"status": "PASS"
},
{
"analyte": "SALM",
"method": "USP_2022",
"text_value": "Absent in 10 g",
"uom": "C62",
"status": "PASS"
},
{
"analyte": "IDENTITY",
"method": "HPTLC",
"text_value": "Conforms",
"uom": "C62",
"status": "PASS"
}
],
"allergens_declared": [],
"released_by": {
"name": "Dr. A. Menon",
"at": "2026-10-20T10:00:00+05:30"
}
}
}Mapping checklist
- Every required field populated from your system of record
- Coded fields mapped to the Bodylia OpenB2B code lists
- GLN, GTIN and SSCC check digits validated
- Rules above pass in the validator
- Idempotency key and per-subject sequence generated
- Expected responses, including rejections, handled
