# PEPPOL-EN16931-R044: Mark the price-level adjustment as a discount, or move a surcharge out of the price

Only a discount may sit in `cac:Price/cac:AllowanceCharge`, so its `cbc:ChargeIndicator` must be `false`. A surcharge goes in the net price or a line charge.

- Layer: Peppol BIS Billing
- Severity: fatal (the document is invalid)
- Topics: Lines and prices, Allowances and charges
- Official definition: https://docs.peppol.eu/poacc/billing/3.0/rules/ubl-peppol/PEPPOL-EN16931-R044/
- Explanation last updated: 2026-09-24

## The short answer

`PEPPOL-EN16931-R044` fails when the `cac:AllowanceCharge` inside a line's `cac:Price` has a `cbc:ChargeIndicator` other than `false`. That element exists only to carry the item price discount and the gross price. If the entry is a discount, set the indicator to `false`, as the corrected invoice does.

A genuine surcharge on the unit price cannot be sent there. Remove the price-level element and either include the surcharge in the net price or send it as a charge on the line with its own reason.

## What the rule checks

Each `cac:Price/cac:AllowanceCharge` is checked, on invoice and credit note lines. After trimming, its `cbc:ChargeIndicator` must read exactly `false`.

`true` fails, and so does `0`. When tried, the schema accepted `0` in the price-level element but this rule rejected it, because it compares text rather than boolean values; `1` was rejected the same way.

The amounts are not examined here. The failing invoice still satisfies `PEPPOL-EN16931-R046`, which subtracts the amount from the gross price whatever the indicator says.

Entries directly on the line or under the document root, where charges are allowed, are outside this rule; their spelling is checked by `PEPPOL-EN16931-R043`.

| Term | Meaning | UBL element |
|---|---|---|
| - | Price allowance indicator | `cac:InvoiceLine/cac:Price/cac:AllowanceCharge/cbc:ChargeIndicator` |
| BT-147 | Item price discount | `cac:InvoiceLine/cac:Price/cac:AllowanceCharge/cbc:Amount` |
| BT-148 | Item gross price | `cac:InvoiceLine/cac:Price/cac:AllowanceCharge/cbc:BaseAmount` |

## How an integration ends up here

Possible causes, from the shape of the rule rather than from measured usage:

- The indicator is set from the sign of a price adjustment, and a positive adjustment is read as a charge.
- A shared routine that writes every `cac:AllowanceCharge` is passed the wrong flag for the price-level one.
- The source price list holds a base price and a mark-up, and the mapping models the mark-up as a charge on the price.
- Booleans are written as `1` and `0` throughout the document.

## How to fix it

1. Open the line named in the finding and look at `cac:Price/cac:AllowanceCharge`.
2. If `cbc:Amount` takes the gross price in `cbc:BaseAmount` down to the net price in `cbc:PriceAmount`, it is a discount. Write `false` and change nothing else.
3. If it is an addition to the price, delete the price-level `cac:AllowanceCharge`. Then either send the net price with the surcharge included in `cbc:PriceAmount`, or keep the base price and add a `cac:AllowanceCharge` directly inside the line with `cbc:ChargeIndicator` of `true`, a reason, and the surcharge amount for the whole line.
4. With the line charge, recompute `cbc:LineExtensionAmount` as quantity times price plus the charge, which `PEPPOL-EN16931-R120` checks. When tried on the recorded line, a price of 10, a quantity of 2 and a line charge of 5.00 for a line net amount of 25.00 validated cleanly.

## Before and after

These are fragments, not complete documents. The complete synthetic documents they come from are linked below.

Fragment of the failing invoice: the price discount of 2.5 is flagged as a charge

```xml
<cac:Price>
  <cbc:PriceAmount currencyID="GBP">12.5</cbc:PriceAmount>
  <cbc:BaseQuantity unitCode="C62">1</cbc:BaseQuantity>
  <cac:AllowanceCharge>
    <cbc:ChargeIndicator>true</cbc:ChargeIndicator>
    <cbc:Amount currencyID="GBP">2.5</cbc:Amount>
    <cbc:BaseAmount currencyID="GBP">15</cbc:BaseAmount>
  </cac:AllowanceCharge>
</cac:Price>
```

Fragment of the corrected invoice: the same figures with the indicator set to false

```xml
<cac:Price>
  <cbc:PriceAmount currencyID="GBP">12.5</cbc:PriceAmount>
  <cbc:BaseQuantity unitCode="C62">1</cbc:BaseQuantity>
  <cac:AllowanceCharge>
    <cbc:ChargeIndicator>false</cbc:ChargeIndicator>
    <cbc:Amount currencyID="GBP">2.5</cbc:Amount>
    <cbc:BaseAmount currencyID="GBP">15</cbc:BaseAmount>
  </cac:AllowanceCharge>
</cac:Price>
```

Only the indicator in the price-level `cac:AllowanceCharge` differs: `true` in the failing invoice, `false` in the corrected one. The failing document reports only `PEPPOL-EN16931-R044`, because the figures were already those of a discount: 15 less 2.5 is the net price of 12.5. When tried as a real surcharge, with a gross price of 10 and the same 2.5 flagged as a charge, `PEPPOL-EN16931-R046` was reported as well, since it expects 10 minus 2.5.

### What the validator reported

- The failing invoice reports **PEPPOL-EN16931-R044**. The corrected document passes every layer with no findings.
  - [Download the failing XML](https://ironfang.uk/finance/rule-examples/PEPPOL-EN16931-R044-invalid.xml)
  - [Download the corrected XML](https://ironfang.uk/finance/rule-examples/gross-price-valid.xml)

Recorded on phive 12.1.0 / phive-rules-peppol 4.5.6 / Saxon-HE 12.10, the engine behind the free validator, using synthetic data. A recorded result is regression evidence for these documents; it is not a certification.

## Where it applies

- Applies to `cac:InvoiceLine` and `cac:CreditNoteLine`; a credit note with its price discount flagged `true` reported this rule alone when tried.
- This is a Peppol restriction. The EN 16931 layer passed in the recorded example.
- Nothing in the totals depends on the price-level element. The line net amount is calculated from `cbc:PriceAmount`, so removing the element leaves every amount as it was.

## Related rules

- [PEPPOL-EN16931-R046 checks that the net price is the gross price minus the price discount](https://ironfang.uk/docs/finance/rules/PEPPOL-EN16931-R046.md)
- [BR-28 rejects a negative gross price in the same element](https://ironfang.uk/docs/finance/rules/BR-28.md)
- [PEPPOL-EN16931-R120 checks the line net amount once a surcharge moves to a line charge](https://ironfang.uk/docs/finance/rules/PEPPOL-EN16931-R120.md)
- [PEPPOL-EN16931-R043 checks the indicator spelling on document and line entries](https://ironfang.uk/docs/finance/rules/PEPPOL-EN16931-R043.md)

## Scope and source

Written for Peppol BIS Billing 3.0.21 (May 2026), EN 16931 1.3.16, as applied to UBL 2.1 Invoice and CreditNote documents. Other profiles, syntaxes and releases can define this identifier differently. Guidance version 2026-09-24.1: source checked 2026-09-24, explanation last updated 2026-09-24.

[The official definition of PEPPOL-EN16931-R044](https://docs.peppol.eu/poacc/billing/3.0/rules/ubl-peppol/PEPPOL-EN16931-R044/) carries the normative wording and test. This page is our explanation of it, not a copy.

Guidance does not change the engine verdict. Fixing this finding does not mean the document passes every layer, and validation does not certify legal or tax compliance or transmit a document over Peppol.

## Links

- [This rule as a web page](https://ironfang.uk/docs/finance/rules/PEPPOL-EN16931-R044)
- [Free Peppol invoice validator](https://ironfang.uk/tools/peppol-validator)
- [Rule index](https://ironfang.uk/docs/finance/rules.md)
- [Ironfang Finance API docs](https://ironfang.uk/docs/finance)
- The same rule is available to MCP clients as the tool `finance.rule.get` on https://mcp.ironfang.uk/mcp
