# How taxes are applied

The Fiscal Mirror rule — BeeL. reflects the Stripe charge exactly, with a clean fallback when Stripe Tax isn't enabled.

When BeeL. generates an invoice from a Stripe payment, it does not recalculate taxes. It **reflects the Stripe charge exactly** — total, breakdown, currency, everything. This is the *Fiscal Mirror* rule. This page is the practical version of that contract; the full mechanics live in [Data conversion](/stripe/data-conversion).

## At a glance

| | |
|---|---|
| **Tax breakdown source** | Stripe (when Stripe Tax is enabled) → your account defaults (otherwise) |
| **Does BeeL. recalculate** | Never. The invoice total = the Stripe charge total |
| **IRPF on Stripe invoices** | Always **0**, regardless of your default IRPF setting |
| **Where to override the fallback** | Settings > Integrations > Stripe (per-connection inclusivity flag) |
| **Where to set your account default** | Settings > Taxes (used only when Stripe Tax is off) |

## How it works

### When Stripe Tax is enabled

Every Stripe charge carries `tax_amounts[]` per line with rate, amount, and inclusivity. BeeL. reads those and emits the invoice with **the exact same numbers** — your account-level tax defaults are not consulted.

Example: Stripe Tax says `21 % IVA, inclusive, on 121 EUR` → BeeL. emits a line with `base 100.00 €`, `IVA 21.00 €`, `total 121.00 €`.

### When Stripe Tax is NOT enabled

The charge has no breakdown — just a total. BeeL. falls back to your defaults:

1. The connection's "Prices include tax" setting (override per Stripe integration)
2. Your **default tax** (IVA / IGIC / IPSI) at the rate configured in Settings > Taxes

It then decomposes the Stripe total as **inclusive of that rate**. The decomposition is exact — no residual rounding.

Example: Stripe charges `121 €`, your default is IVA 21 % inclusive → BeeL. emits `base 100.00 €`, `IVA 21.00 €`, `total 121.00 €`.

## IRPF is always 0 on Stripe invoices

This is a BeeL. rule, not a statement about who must withhold. A withholding would make the invoice total differ from the Stripe charge, which Fiscal Mirror does not allow, so BeeL. never applies your default professional IRPF to a Stripe payment.

If a customer withholds IRPF from what they pay you, a Stripe-generated invoice will not reflect it: issue that invoice through the [Invoicing API](/invoices/createCompanyInvoice) instead.

## Charges at 0 % [#charges-at-0]

A line Stripe charges at 0 % becomes an exempt or non-taxable line, and an invoice needs the reason. Stripe's `taxability_reason` says whether it knows it; when your main tax is IVA, BeeL. completes what Stripe leaves open with the **default exemption reason** you declared in [**Settings > Taxes**](https://app.beel.es/ajustes/impuestos).

| What Stripe reports on the 0 % line | What BeeL. does |
|---|---|
| No reason | Uses your default exemption reason. Without one, the charge waits in **Needs attention** with the reason "0 % rate requires an exemption reason": declare it and retry the event |
| `product_exempt`, `product_exempt_holiday` | Uses your default reason if it is an exemption. Otherwise the same wait |
| `not_subject_to_tax` | Uses your default reason if it is a non-subject one. Otherwise the same wait |
| `not_available` — a **manual tax rate** at 0 %, such as the one some platforms create by default | Treated as a charge with no reason **when the buyer is in the IVA territory**; see below. Otherwise `UNSUPPORTED_STRIPE_TAX_TREATMENT` |
| `zero_rated`, `reverse_charge`, `customer_exempt`, `not_collecting`, `not_supported`, or a reason BeeL. does not know | `UNSUPPORTED_STRIPE_TAX_TREATMENT`: BeeL. does not reflect these treatments |

**The buyer is in the IVA territory** when the buyer's country is Spain **and** the postal code (five digits) is in the peninsula or the Balearic Islands. A postal code starting with 35 or 38 (Canary Islands), 51 (Ceuta) or 52 (Melilla), a buyer from another country, or a payment with no postal code is outside it. A manual 0 % rate does not say why there is no tax, so BeeL. only takes your declared reason for it where the sale carries IVA.

A charge that waits as `UNSUPPORTED_STRIPE_TAX_TREATMENT` is not retried and has no draft: issue that invoice through the [Invoicing API](/invoices/createCompanyInvoice), or correct the tax in Stripe.

<Callout type="info">
  If you create a manual 0 % rate in Stripe for sales to Spanish customers, declare your default exemption reason in BeeL. first; without it, those charges wait in **Needs attention**.
</Callout>

## Equivalence surcharge [#recargo-de-equivalencia]

If your account has the equivalence surcharge (*recargo de equivalencia*) configured and the Stripe charge maps to a B2B retailer (mapping has the right flag), BeeL. applies the surcharge automatically as part of the line classification. See [Equivalence surcharge](/verifactu/equivalence-surcharge).

It only ever lands on a **standard (F1)** invoice: a simplified one cannot carry the surcharge ([`SIMPLIFICADA_FORBIDS_SURCHARGE`](/errors/SIMPLIFICADA_FORBIDS_SURCHARGE)), so a retailer in that regime needs a payment that resolves to F1 — with NIF and address on the Stripe customer.

## Where to change settings

### Connection-level (per Stripe integration)

1. Go to [**Settings > Integrations > Stripe**](https://app.beel.es/ajustes/integraciones?provider=stripe&settings=true)
2. Edit **Prices include tax** — controls the inclusivity flag used in the fallback path
3. Save

### Account-level (default tax)

1. Go to [**Settings > Taxes**](https://app.beel.es/ajustes/impuestos)
2. Choose your **main tax** (IVA, IGIC, or IPSI) and the standard rate
3. Save

Account-level defaults are used **only when Stripe Tax doesn't expose a breakdown** — when Stripe Tax is on, your defaults are bypassed.

<Callout type="info">
  Changes to either set of settings apply to **new invoices only**. Already-issued invoices are immutable once their VeriFactu submission is in flight.
</Callout>

## Worked example

Imagine your Stripe customer pays **100 EUR**:

### Case A — Stripe Tax enabled (21 % inclusive)

Stripe says: line of 100 EUR base + 21 EUR IVA = 121 EUR total. Customer paid 121 EUR.

| Field | Value |
|---|---|
| Taxable base | 100.00 € |
| IVA (21 %) | 21.00 € |
| IRPF | 0 € |
| **Total** | **121.00 €** |

### Case B — Stripe Tax disabled, your default is IVA 21 % inclusive

Stripe says: total of 100 EUR. Customer paid 100 EUR.

BeeL. decomposes inclusively:

| Field | Value |
|---|---|
| Taxable base | 82.64 € |
| IVA (21 %) | 17.36 € |
| IRPF | 0 € |
| **Total** | **100.00 €** |

### Case C — Stripe Tax disabled, your default is IVA 21 % **exclusive**

Stripe says: total of 100 EUR. You turned **Prices include tax** off on the connection. BeeL. treats the 100 EUR as the base and **adds** the IVA on top:

| Field | Value |
|---|---|
| Taxable base | 100.00 € |
| IVA (21 %) | 21.00 € |
| IRPF | 0 € |
| **Total** | **121.00 €** |

The customer paid 100 EUR but the invoice total is 121 EUR — a divergence. **Only use the exclusive mode when your Stripe prices are net** (rare in B2C). Otherwise leave **Prices include tax** on.

## FAQ

### Does BeeL. use Stripe's tax rates?

**Yes**, when Stripe Tax is enabled. BeeL. copies Stripe's breakdown verbatim — that's the Fiscal Mirror rule.

### What happens if I change my default IVA rate?

It only matters when Stripe Tax is **disabled** on that connection. With Stripe Tax enabled, BeeL. uses Stripe's rate, not yours. Either way, the change applies to new invoices only.

### Can I have different taxes per Stripe customer?

The per-connection settings apply uniformly. For genuinely per-customer tax behaviour, enable Stripe Tax (which lets you configure tax codes per product / per customer) — BeeL. will reflect Stripe's decision.

### What about IGIC / IPSI?

If your default tax is IGIC or IPSI, BeeL. uses it in the fallback path. With Stripe Tax enabled, BeeL. uses whatever rate Stripe sends — make sure your Stripe Tax registrations match your invoicing reality.

## Related

<Related>

- [Data conversion](/stripe/data-conversion) — full Fiscal Mirror specification
- [Generated invoices](/stripe/generated-invoices) — F1 vs F2 decision based on amount and customer data
- [VeriFactu submission](/stripe/verifactu-submission) — when the resulting invoice goes to AEAT

</Related>

---

Full OpenAPI spec: https://docs.beel.es/api/openapi