Standards/ppn-code
PPN Code
Overview
The PPN Code (Pharmacy Product Number) is a globally unique article number for healthcare products, defined and maintained by Germany's IFA (Informationsstelle für Arzneispezialitäten GmbH). It embeds a national article number (in Germany, the pzn) inside an internationally unambiguous identifier and is the IFA-side product code used for pharmaceutical serialization in Germany under the EU Falsified Medicines Directive (FMD), via the securPharm verification system [1] [2].
The PPN is carried in a data-matrix symbol (ECC200, per ISO/IEC 16022). Within that symbol the PPN and its accompanying data elements are flagged with data identifiers following ANSI MH10.8.2 (referencing ISO/IEC 15418) — distinguishing PPN-coded packs from GS1-coded packs, which use a gs1-datamatrix with GS1 Application Identifiers [2] [3].
History
The PPN is an IFA standard developed in Germany to express the long-established pzn (Pharmazentralnummer) in an internationally unique form [2]. It became central to German pharmaceutical anti-counterfeiting under the EU FMD framework — Directive 2011/62/EU together with Delegated Regulation (EU) 2016/161 — operationalized nationally through securPharm e.V., Germany's National Medicines Verification Organisation, with data uploads handled by ACS PharmaProtect GmbH. The FMD safety-feature requirements have been in force since 9 February 2019 [2].
Technical specification
PPN structure. The PPN consists of three parts [1] [3]:
- PRA-Code (Product Registration Agency Code) — a two-digit prefix. The value
11is the fixed PRA code managed by IFA, reserved for the German pzn. - National product number — the unmodified 8-digit pzn (PZN8). The leading zero must not be omitted.
- Check digits — a two-digit checksum calculated over the complete data element (i.e. over
11+ the 8-digit PZN).
Check-digit algorithm. The two check digits use a modulo-97 scheme: digit weighting starts at 2 on the left and increases by one per following character (working for numeric and alphanumeric strings); the weighted decimal values are summed and divided by 97, and the remainder (00–99, zero-padded) forms the two check digits [3] [4].
Data identifier. Inside the Data Matrix, the PPN is flagged with the ASC MH10.8.2 data identifier 9N (product code). The 9N identifier is mandatory when multiple data elements are concatenated and optional when only the PPN is encoded [1].
Accompanying data elements. A FMD-compliant pack encodes four mandatory elements — product code, serial number, batch, expiry — using IFA data identifiers [1] [2]:
| Element | Data ID | Format | Length |
|---|---|---|---|
| Product code (PPN) | 9N |
PRA + PZN + 2 check digits | — |
| Product code (GTIN, alt.) | 8P |
numeric | 14 |
| Batch / LOT | 1T |
alphanumeric (0–9, A–Z, -, _) |
1–20 |
| Serial number | S |
alphanumeric (0–9, A–Z) | 1–20 |
| Expiry date | D |
YYMMDD | 6 |
| Manufacturing date | 16D |
YYYYMMDD | 8 |
Multi-country packs may add a fifth element (a national reimbursement number such as the pzn) [2]. Concatenated elements are joined with a separator (IFA documentation illustrates #; in GS1-coded equivalents the variable-length field separator is the FNC1 / <GS> ASCII 29 character) [1]. The carrier is Data Matrix ECC200 with Reed–Solomon error correction per ISO/IEC 16022 [2].
GS1 vs IFA coding. German manufacturers may choose between the PPN (IFA coding system, 9N data identifier, data-matrix) and the NTIN/GTIN (GS1 coding system, 8P/AI 01, gs1-datamatrix); both embed the same 8-digit pzn, and pharmacy scanners process either format transparently [2].
Use cases
The PPN Code is used for pharmaceutical dispensing and verification in Germany and other markets that adopt the IFA coding system — serialized prescription-medicine packs scanned at the point of dispense and verified against the securPharm/EMVS repository under the FMD, plus general pharmacy logistics and reimbursement. IFA also defines PPN-based coding for medical-device UDI [1] [2].
Implementations
An open-source Python parser exists (Ashafix/ppn_parser). Commercial barcode toolkits (Neodynamic, Seagull Scientific/BarTender) support PPN/securPharm Data Matrix generation, and IFA publishes the authoritative PPN-Code specification and check-digit-calculation documents [1] [3] [4].
Comparison
The PPN's product code differs from a plain GTIN and from the NTIN: a GTIN is a GS1 trade-item number; an NTIN is a specific GTIN that encodes a national number (such as the pzn) using a healthcare prefix (4150 for German drugs) so that the GS1 issuing agency, not the manufacturer, controls assignment. The PPN instead encodes the same pzn under IFA's own 11 PRA-code scheme with a modulo-97 check, flagged by data identifier 9N rather than a GS1 AI [2] [3]. For FMD compliance the two are interchangeable carriers of the same underlying pzn plus serial/batch/expiry [2].
Status
Active and mandatory for serialized prescription medicines in the German market under the EU FMD (in force since 9 February 2019), with PPN as one of the two permitted product-code formats verified through securPharm [2].
Sources
1 IFA PPN / securPharm Barcode — Neodynamic 2 IFA FAQ (PPN / PZN / NTIN) — IFA (Informationsstelle für Arzneispezialitäten) 3 PPN — Barcode Guide — Seagull Scientific 4 Check Digit Calculations PZN/PPN/UDI — IFA
Deployments
No country reports mention this standard by name.
Regions / aggregations not mapped to a single country
- Universal