# PPN Code

> Source: https://docs.barcoder.ai/docs/standards/ppn-code
> research date 2026-06-04 · extracted at 2026-10-03
> Publisher: Barcoder — encyclopedia of QR, barcode and payment-code standards

Specifications:
- [IFA PPN / securPharm Barcode — Neodynamic](https://www.neodynamic.com/barcodes/IFA-PPN-securPharm-Barcode.aspx)
- [IFA FAQ (PPN / PZN / NTIN) — IFA](https://www.ifaffm.de/en/faq.html)
- [PPN — Barcode Guide (Seagull Scientific)](https://barcodeguide.seagullscientific.com/Content/Symbologies/PPN.htm)
- [Check Digit Calculations PZN/PPN/UDI — IFA](https://www.ifaffm.de/mandanten/1/documents/04_ifa_coding_system/IFA-Info_Check_Digit_Calculations_PZN_PPN_UDI_EN.pdf)

## 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](https://docs.barcoder.ai/docs/standards/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 <sup>[1][1]</sup> <sup>[2][2]</sup>.

The PPN is carried in a **[Data Matrix](https://docs.barcoder.ai/docs/standards/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](https://docs.barcoder.ai/docs/standards/gs1-datamatrix)** with GS1 Application Identifiers <sup>[2][2]</sup> <sup>[3][3]</sup>.

## History

The PPN is an IFA standard developed in Germany to express the long-established [PZN](https://docs.barcoder.ai/docs/standards/pzn) (Pharmazentralnummer) in an internationally unique form <sup>[2][2]</sup>. 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** <sup>[2][2]</sup>.

## Technical specification

**PPN structure.** The PPN consists of three parts <sup>[1][1]</sup> <sup>[3][3]</sup>:

1. **PRA-Code (Product Registration Agency Code)** — a two-digit prefix. The value **`11`** is the fixed PRA code managed by IFA, reserved for the German [PZN](https://docs.barcoder.ai/docs/standards/pzn).
2. **National product number** — the unmodified 8-digit [PZN](https://docs.barcoder.ai/docs/standards/pzn) (PZN8). The leading zero must not be omitted.
3. **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 <sup>[3][3]</sup> <sup>[4][4]</sup>.

**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 <sup>[1][1]</sup>.

**Accompanying data elements.** A FMD-compliant pack encodes four mandatory elements — product code, serial number, batch, expiry — using IFA data identifiers <sup>[1][1]</sup> <sup>[2][2]</sup>:

| 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](https://docs.barcoder.ai/docs/standards/pzn)) <sup>[2][2]</sup>. 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) <sup>[1][1]</sup>. The carrier is Data Matrix ECC200 with Reed–Solomon error correction per ISO/IEC 16022 <sup>[2][2]</sup>.

**GS1 vs IFA coding.** German manufacturers may choose between the **PPN** (IFA coding system, `9N` data identifier, [Data Matrix](https://docs.barcoder.ai/docs/standards/data-matrix)) and the **NTIN/GTIN** (GS1 coding system, `8P`/AI 01, [GS1 DataMatrix](https://docs.barcoder.ai/docs/standards/gs1-datamatrix)); both embed the same 8-digit [PZN](https://docs.barcoder.ai/docs/standards/pzn), and pharmacy scanners process either format transparently <sup>[2][2]</sup>.

## 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 <sup>[1][1]</sup> <sup>[2][2]</sup>.

## Implementations

An open-source Python parser exists ([Ashafix/ppn_parser](https://github.com/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 <sup>[1][1]</sup> <sup>[3][3]</sup> <sup>[4][4]</sup>.

## 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](https://docs.barcoder.ai/docs/standards/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](https://docs.barcoder.ai/docs/standards/pzn) under IFA's own `11` PRA-code scheme with a modulo-97 check, flagged by data identifier `9N` rather than a GS1 AI <sup>[2][2]</sup> <sup>[3][3]</sup>. For FMD compliance the two are interchangeable carriers of the same underlying [PZN](https://docs.barcoder.ai/docs/standards/pzn) plus serial/batch/expiry <sup>[2][2]</sup>.

## 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 <sup>[2][2]</sup>.

## Sources

[1]: https://www.neodynamic.com/barcodes/IFA-PPN-securPharm-Barcode.aspx
[2]: https://www.ifaffm.de/en/faq.html
[3]: https://barcodeguide.seagullscientific.com/Content/Symbologies/PPN.htm
[4]: https://www.ifaffm.de/mandanten/1/documents/04_ifa_coding_system/IFA-Info_Check_Digit_Calculations_PZN_PPN_UDI_EN.pdf

[1] [IFA PPN / securPharm Barcode](https://www.neodynamic.com/barcodes/IFA-PPN-securPharm-Barcode.aspx) — Neodynamic
[2] [IFA FAQ (PPN / PZN / NTIN)](https://www.ifaffm.de/en/faq.html) — IFA (Informationsstelle für Arzneispezialitäten)
[3] [PPN — Barcode Guide](https://barcodeguide.seagullscientific.com/Content/Symbologies/PPN.htm) — Seagull Scientific
[4] [Check Digit Calculations PZN/PPN/UDI](https://www.ifaffm.de/mandanten/1/documents/04_ifa_coding_system/IFA-Info_Check_Digit_Calculations_PZN_PPN_UDI_EN.pdf) — IFA

## Deployments

_No country reports mention this standard by name._

## Regions / aggregations not mapped to a single country

- Universal
