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.

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

GS01 for the 855 is PR per every authoritative spec (CHSPEC_855_4010, Palmetto, AmerisourceBergen, 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.


3. 832 Price / Sales Catalog (GIP)

As of mid-2026 the 832 is a supported catalog-import document ("GIP" — Get Inventory & Price). It is built first for pharma sources (AmerisourceBergen, Kinray) and is rolling out on Standard EDI V2. 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 Concept One GIS, 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 (dmx-core EdiGetPOAcknowledgements) + 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 (EdiGetPOAcknowledgements) 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 — RSR EDI alone sends ~25 codes including ROS, IB, CC, R3, R7 (INT-56691, Fernando's dmx-core eval, Jun 2026). 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 RSR via INT-56691).

Vendor variants (custom parsers, not generic): Kinray & AmerisourceBergen add IS = Accepted with Substitution (substitute identifiers ride in later ACK positions, ACK07/08ACK13/14, qualifiers ND/N4/VC/VN/UP); AmerisourceBergen treats IW (On Hold) as accepted. IB (Backordered) is not supported by the generic parser or Kinray. 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 (Kinray, AmerisourceBergen) use VN at PO106 via custom parsers; other vendors vary (Medline/McKesson VC/VN/VP, RSR positional).

SAC02 — 810 Service / Allowance / Charge Codes

CodeMeaning
G821Shipping (primary code per FLX PDF v2)
C310Freight
D240Freight Assistance
F050Other / Miscellaneous Charges

Any other SAC code (e.g. AFEE, G740, H750) will be flagged by Flxpector as "may not be processed".


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 StandardInventory846Parser + 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.
LIN02Must be SK/UP/EN/BPX12-Standard
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)Mandatory; value must be 0000FLX-Custom
TD5 (856)Required; TD502=2, TD503 SCAC required, TD512 service level requiredFLX-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)

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


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.
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 (Land N Sea, mid-2026).
Unmapped N1 loop in 810Surfaces as Unmapped loops found in transaction: L: N1; the 810 loop mapping must include it.

CTT count validation (when CTT is mapped)

TransactionCTT behavior
850 / 855CTT01 must equal the number of PO1 segments. Mismatch is an error.
810CTT01 must equal the number of IT1 segments. Mismatch is an error.
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.