Flxpoint Parser Rules — Authoritative Reference

Flxpoint Parser Rules — Authoritative Reference

This page documents the Flxpoint parser's actual behavior. It is the authoritative source for what Flxpoint accepts, rejects, or quietly ignores.

This is Flxpoint's implementation guidance for exchanging documents with Flxpoint — not a reproduction of the X12 standard. X12 is a registered trademark of X12 Incorporated; the underlying EDI standards are copyrighted by X12 and available at x12.org.

Use this page to answer the two most common partner questions:

  1. "Will Flxpoint accept my file?"
  2. "Is this rule a generic X12 requirement or a Flxpoint-specific one?"

1. Envelope Layer (ISA / GS / ST)

Envelope validation is delegated to the core EDI library. Flxpoint's Accept vs. Reject behavior on envelope fields is as follows:

Supported Versions (GS08 / ISA12)

VersionFlxpoint behavior
004010VICSPreferred — X12 Retail VICS. Accepted.
004010 (no VICS)Accepted + warning. Not hard-rejected even when VICS-specific segments are present. Partners should ideally switch to 004010VICS.
005010Accepted.
Anything elseWarning. Processing depends on whether the segment structure still parses.

Hard rejection on version strings only happens when the segment structure itself fails to parse — not the version literal.

ISA06 / ISA08 — Sender / Receiver IDs

  • Must be exactly 15 characters, right-padded with spaces when the ID is shorter.
  • Missing padding → the internal parser fails to find the segment terminator → hard reject.

GS01 — Functional Identifier Code

CodeTransaction
IB846 Inventory
SH856 Ship Notice
PO850 Purchase Order
PR855 PO Acknowledgement (standard X12 code; AD is tolerated as a legacy alias)
IN810 Invoice
FA997 Functional Acknowledgement
PI832 Price/Sales Catalog
RS870 Order Status Report

GS01 for the 855 is PR per every authoritative spec on file and the Confluence EDI V2 page. The production parser does not actually validate GS01 for the 855, so it never rejects on it; Flxpector treats GS01 as informational for the 855 and accepts PR or AD. A GS01/ST01 mismatch for the other transaction types is a hard reject.

Control Numbers

  • ISA13 must be unique within a 24-hour window from the same Sender ID. Duplicate ISA13 from the same sender is rejected.
  • GS06 ↔ GE02 must match; mismatch is rejected.
  • ST02 ↔ SE02 must match; mismatch is rejected.

ISA15 — Usage Indicator

  • T (Test) and P (Production) are both processed.
  • Test files are badged in the Flxpoint UI as "Test Mode" to prevent accidental real-world fulfillment.

2. 997 Functional Acknowledgement

Flxpoint treats 997 as an acknowledgement only. The payload is not run through content validation. Flxpector mirrors this — it parses the envelope but does not enforce a content schema on 997.


2b. 870 Order Status Report — cancellations only

The 870 is supported for item cancellations exclusively (code-verified 2026-07-08 against the production standard parser): every PO1 loop must carry ISR*IC; any other ISR01 rejects the file (Illegal ISR segment, ISR01 <X>). Structure enforced by production: BSR*2*PP immediately followed by REF*IA*<vendor#>; HL levels O/I only (any other level code rejects); each order HL = one PRF + REF*CO + REF*VN (both with values, or the order can't be identified and the file rejects as unmapped); each item HL = PO1 + ISR pairs, with PO106 restricted to UP/EA (other qualifiers crash the job) and integer PO102. Flxpector mirrors all of this (schema + FLX-870-001..004).

3. 832 Price / Sales Catalog (GIP)

As of mid-2026 the 832 is a supported catalog-import document ("GIP" — Get Inventory & Price) for integrations specifically configured for it (currently the two pharma catalog integrations). ⚠️ There is no generic 832 parser yet: the Standard EDI V2 integration rejects any 832 with Unmapped doc type 832 (code-verified 2026-07-08; the generic GIP-832 is approved and in the engineering pipeline as of Jul 2026 — this section flips when it ships). The structure below is therefore the target spec for the Standard rollout (the standard GIP spec draft) — the currently-enforced behavior is the pharma parsers': items keyed on NDC qualifiers, multiple CTPs/PIDs per LIN, unknown CTP02 codes silently ignored (no whitelist), and the "LIN identifier priority" chain is spec-only (not in code today). It decouples catalog data (SKUs, descriptions, pricing) from the live-quantity 846 feed.

Defined segment structure:

AreaSegmentsNotes
HeaderST, BCT (BCT01 = PC Price Catalog), REF, DTMREF qualifiers: ACC, FL, 2K, X9
PartiesN1*VN (Vendor), N1*BY (Buyer)
Item ID (LIN loop)LINIdentifier qualifier priority: VNUPNDMGSKVCEAUN
ProductPID (descriptions), PO4 (packaging, e.g. 1 case / 100 each)
Validity datesDTM*092 (start), DTM*093 (end)
PricingCTPPrice-type qualifiers below
AdditionalG53, TD4, G39, CTT

CTP price-type qualifiers (CTP02): AWP (Average Wholesale Price), CON (Contract), LPR (List), WHL (Wholesale), RTL (Retail), MSR (MSRP). These are industry/pharma-specific.

CTP03 price handling (per the standard GIP spec draft, mid-2026):

  • Blank CTP03 → the item is kept and its quantity is updated; the price is simply not saved (it does not skip/archive the item).
  • Invalid (non-numeric) CTP03Invalid CTP03 value: CTP03 (price) must be numeric → the item errors and is skipped.

Generic envelope + X12 validation still applies; full GIP-832 schema validation in Flxpector is incremental as the standard finalizes.


4. Enum Whitelists

These are the exact values the parser checks against. When the inspector says "invalid ___", partners can use this table to pick a valid value.

SCAC Codes (TD503)

  • Flxpoint does not maintain an exhaustive list. New carriers are added constantly.
  • Validation is format-only: 2 to 4 alphanumeric characters (e.g. UPSN, FDXE, USPS).
  • Flxpector warns when a SCAC is not in the common-carrier list, but the file still processes.

DTM Qualifiers (DTM01)

856 (inbound ASN dates):

QualifierMeaning
011Shipped
017Estimated Delivery
002Delivery Requested

850 (outbound PO dates — Send Fulfillment Requests, live May 2026): mappable per-template. 001 (Cancel After) is always sent (defaults to order date + 7 days when unmapped); 002 (Delivery Requested), 010 (Requested Ship), 037 (Ship Not Before), 038 (Ship No Later), 063 (Do Not Deliver After) are sent only when their field is mapped.

Unit of Measure — 850 PO103 (outbound)

Defaults to EA (Each). Configurable per Send-FR template to other unit codes (e.g. CA Case, CT Carton); falls back to EA when unmapped. Existing EA mappings are unaffected.

ACK01 — 855 Line Item Status Codes

Verified against the production parser + the Confluence "Flxpoint Standard EDI V2" status-determination logic (May 2026). The parser does not hard-reject on ACK01 — meaning is resolved at the process layer by two lists:

ResultACK01 codes
Accepted (line acknowledged)AA, AC, AR, IA, IQ, DR, IP, IC
Canceled (line rejected)IR, R1, R2, R4

Any code in neither list is a silent no-op (line neither acknowledged nor canceled). Note R2/R4 are valid (cancel) — they are not errors.

There is no ACK01 whitelist. The base class (the production parser) maps only the 4 cancel codes above (IR/R1/R2/R4); everything else is left unmapped, not rejected. Vendors routinely send a much broader set — one high-volume vendor sends ~25 codes including ROS, IB, CC, R3, R7. Flxpector therefore does not validate ACK01 against an allowed-values list — doing so would false-positive on those legitimate vendor codes (same class as the N103=ZZ false positive). Only structural checks apply (2-char ID, present). When a partner needs a human-readable cancel reason, the vendor-specific parser can map its full code set and write it to an FR-item custom field (CancellationReason = "{CODE} - {description}", shipped for one high-volume vendor via an internal ticket).

Vendor variants (custom parsers, not generic): the pharma catalog integrations add IS = Accepted with Substitution (substitute identifiers ride in later ACK positions, ACK07/08ACK13/14, qualifiers ND/N4/VC/VN/UP); a pharma distributor treats IW (On Hold) as accepted. IB (Backordered) is not supported by the generic parser or a pharma distributor. The generic parser reads only ACK01 + ACK02 from the ACK segment; product identifiers come from PO1. A cross-dock PO's 855 ack is idempotent — once saved it can't be re-saved (Acknowledged quantity can't be greater than total quantity), and the PO stays in "Processed" status.

PO1 product qualifiers (855)

The generic Standard parser is strict positional and throws on a mismatch: SK@PO106, BP@PO108, EN@PO110, MG@PO112, UP@PO114, VP@PO116 (value in the following element). Pharma vendors (a pharma distributor, a pharma distributor) use VN at PO106 via custom parsers; other vendors vary (a medical-supplies vendor/a pharma distributor VC/VN/VP, one high-volume vendor positional).

SAC02 — 810 Service / Allowance / Charge Codes

The complete production set (verified directly in the parse-time enum, 2026-07-08 — descriptions are production's own):

CodeProduction meaningSAC01 indicator
G821Shipping Charge (primary code)C (charge)
D240Freight ChargeC
AFEEGeneric FeeC
G740Service ChargeC
H750Sales TaxC
D500Handling ChargeC
C310DiscountA (allowance — the amount subtracts)

Any other code — including F050 — rejects the file with SAC01 code <X> not supported. ⚠️ The April spec listed F050 as valid; that was stale — the production whitelist has never included it (corrected 2026-07-08, code- verified). A wrong SAC01 for a known code (e.g. SAC*C*C310) hits the same reject, because production matches the code+indicator pair. SAC05 (amount) is required and is always implied 2-decimal (even with a .).


5. X12-Standard vs. FLX-Custom Rules

When a partner argues "my file is X12 compliant", these are the rows where Flxpoint diverges from the industry standard. Everything else in the inspector is generic X12 syntax.

Segment / RuleRuleSource
BIA01 (846)Must be exactly 00FLX-Custom — X12 allows 05 (Replace)
BIA02 (846)Must be exactly MMFLX-Custom — X12 allows DD (Distributor), DR (Delivery)
REF*IA (846)Mandatory; qualifier must be IAFLX-Custom — X12 marks REF as optional
REF02 (846/850)Vendor number, max 30 chars (raised from 10 in May 2026)Length cap is FLX; the underlying X12 max is 30. Files with vendor IDs of 11–30 chars are now accepted.
LIN ↔ QTY (846)Every LIN must be followed by a QTY segmentX12-Standard — a LIN with no quantity aborts the Flxpoint inventory job (No QTY segment found to match LIN with <qual>*<id>). Flagged by Flxpector as FLX-846-006.
846 quantityOne available quantity per SKU (QTY01=33, one QTY per LIN)X12-Standard — the parser does NOT support per-warehouse / per-location quantity breakdown (no SDQ, no multi-QTY per location); it stores a single total per item even when the file carries warehouse detail. Confirmed vs the production parser + engineering (2026-07-02).
846 LIN qualifiersValidity set UP / EA / SK / EN (every LIN qualifier position)X12-Standard — verified vs the parser; EA (EAN) is valid in all positions.
846 CTPIf present: CTP02 ∈ {WHL,UCP} + numeric CTP03, else the item is skippedCorrected 2026-07 (was documented "ignored"): the parser reads CTP03. Not a reliable price channel — keep pricing in the price feed.
LIN02846: must be UP/EA/SK/EN (EA is valid — EAN). 856: SK/UP/EN/BP. LIN04–07 in the 846 are not validated (unknown qualifiers / half pairs silently ignored, item imports)X12-Standard — corrected 2026-07-08 vs the parser (EA was falsely warned on, BP falsely accepted for 846)
846 loop grammarStrict LIN → [PID] → [CTP] → QTY: a foreign segment inside the loop, a CTP before the PID, or a second QTY under one LIN (per-warehouse pattern) aborts the job the same as a missing QTYX12-Standard — flagged as FLX-846-006 / FLX-ALL-006
846 PID01Must be F — anything else skips the line item (file processes)FLX-Custom — warning FLX-846-007
855 PO1 positional qualifiersStandard parser is strict positional beyond PO106: BP@PO108, EN@PO110, MG@PO112, UP@PO114, VP@PO116 — mismatch rejects the file (Unknown Buyers Qualifier PO108 value X). Vendor-specific parsers differFLX-Custom — warning FLX-855-002 (vendor-variance)
855 ACK per lineStandard parser fails the whole file if any PO1 loop lacks an ACK; a second ACK in one loop is also a rejectFLX-Custom — FLX-855-001 (warning) + FLX-ALL-006 ACK entry
810 invoice numberBIG02 or REF*IV*<number> — blank BIG02 alone is fine when REF*IV exists (No Invoice Number found in BIG segment or REF segment with REF01 = IV)FLX-Custom — FLX-810-009. Corrected 2026-07-08: BIG02 alone was wrongly hard-required
810 IT102Must be a plain integer — decimals (2.0) reject the file (Quantity is expected in IT102 value)FLX-Custom — FLX-810-010
810 SAC01↔SAC02C310 = allowance (SAC01=A, amount subtracts); other mapped codes = charge (SAC01=C). Mismatch rejects. SAC05 required (implied 2-decimal, always)FLX-Custom — FLX-810-012
SN102 (856)Must be a positive integer > 0X12-Standard (ASN business logic)
CTT (846)Ignored by parserX12-Standard (segment optional; Flxpoint skips entirely)
REF*DP (810)The FLX PDF spec marks it mandatory with value 0000 — but the production parser removes all REF segments unread and a file without REF*DP provably processes (2026-07-08 code audit). Flxpector flags it as a warning (spec hygiene), not an errorFLX-Custom (spec-only)
TD5 (856)Required; TD502=2, TD503 SCAC required, TD512 service level required. TD512's VALUE is stored verbatim by production (a real file with TD512=31 processed) — the standard codes D3/ND/SC/SI/SP are recommended (Flxpector warns on others, FLX-856-018) but not enforcedFLX-Custom
Item Tracking Reachability (856)Every item HL must have reachable tracking (REF0L/CN/TN at shipment, or MANCP/GM at pack/item)FLX-Custom (runtime mapper requirement)
HL parent linkage (856)Every HL below the Shipment level must carry HL02 = its parent's HL01 (Order→Shipment, Pack→Order, Item→Pack or Order), and HL02 must reference an existing HL01. Only the root (Shipment) HL leaves HL02 empty — written HL*1**S with the blank separator present.X12-Standard — a blank HL02 on an item HL is a hard reject (Invalid HL segment - HL01 and HL02 must both be present); a blank or dangling HL02 on order/pack HLs breaks linking and fails as Missing orders for shipment / Missing packs for order. Flagged by Flxpector as FLX-856-015 (blank) / FLX-856-016 (broken reference).

Flxpector tags every validation finding with this provenance so the UI can badge FLX-Custom rules distinctly.


5b. Cross-check against the 850 (Flxpector feature)

The inspector can validate an 855/856/810 against the original 850 (paste the PO into the "Cross-check with your 850" panel). Findings are advisory (warnings/info — partial shipments and invoices are legitimate):

RuleChecks
FLX-XCHK-001PO number (856 PRF01 / 810 BIG04 / 855 BAK03) matches the 850 BEG03
FLX-XCHK-002Every item identifier exists on the 850 PO1 lines (exact value, leading zeros matter)
FLX-XCHK-003Shipped / invoiced / acknowledged quantity per item ≤ ordered quantity
FLX-XCHK-004856 TD5 service level echoes the 850's requested service level
FLX-XCHK-005Order lines not covered by the document (warning on the 855 — it must answer every line; info elsewhere)

6. Unmapped Segments & Loops

The Flxpoint parser maps a specific set of segments per transaction type. Any segment or loop it does not map is surfaced in the UI Parsing Error column as:

  • Unmapped segments found in transaction: S: <SEG> — e.g. S: CTT, S: I PMG, S: LS, S: PID
  • Unmapped loops found in transaction: L: <LOOP> — e.g. an unmapped N1 loop in an 810

Support agents reject files on these messages even when the row otherwise processed, so Flxpector mirrors the UI, not the parser internals. Known cases:

CaseBehavior
CTT in 846Surfaced as Unmapped segments found in transaction: S: CTT (warning, FLX-846-005). Partners should send 846 without CTT.
Any other segment in 846 outside BIA/REF/LIN/PID/CTP/QTYGeneralized sweep FLX-846-008 (2026-07-08). A foreign segment before the first LIN = error (production imports ZERO items); trailing leftovers = warning (items import, UI surfaces the message).
Custom loops in 846 (e.g. LS / LE wrappers, I PMG)Surface as unmapped segments; the integration mapping must be extended or the partner must drop them (one vendor, mid-2026).
855 header segments beyond BAK + N1 loop (incl. PER, REF, DTM, ITD)The standard 855 consumes only BAK + N1 loops + PO1 loops + CTT — the rest rejects as unmapped. Flagged as warning FLX-855-003 (vendor-specific integrations differ).
Unmapped N1 loop / FOB / CUR / summary segments before TDS in 810Surfaces as Unmapped loops found in transaction: L: N1 / S: <id>. Flagged as warning FLX-810-013.
Anything in an 832 outside BCT/REF/DTM/N1–N4/LIN/G53/PID/PO4/TD4/CTP/G39/CTTRejects as unmapped in both 832 integrations — warning FLX-832-002.

CTT count validation (when CTT is mapped)

TransactionCTT behavior
850CTT01 must equal the number of PO1 segments. Mismatch is an error (FLX-generated outbound).
855 / 810Production removes CTT without reading CTT01 (fixture-proven, 2026-07-08) — a wrong or blank count processes fine. Flxpector flags a mismatch as a warning only.
856 / 997CTT is not used.


Last reviewed by the Flxpoint Integrations team.

Something unclear?

Ask our AI assistant — it knows this spec and can explain any segment, error, or rule in plain English.