# Simplified vs standard (F1 vs F2)

When BeeL. issues a simplified invoice (F2) or a standard invoice (F1), the rules of the RD 1619/2012 behind them, and what BeeL. enforces at the API boundary.

The simplified invoice (F2) is the "ticket" of the Spanish tax system: less data, but limited in amount and use case (article 4 of the RD 1619/2012). This page is the decision aid plus the exact rules BeeL. applies before the registro reaches AEAT.

> **Not legal or tax advice.** This page describes how BeeL. works. It is not legal or tax advice: confirm your own obligations, and those of the businesses you invoice for, with your tax advisor.

<Callout type="warn">
  **A simplified invoice in BeeL. never identifies its recipient.** If the customer's NIF or a foreign identifier goes on the invoice, BeeL. issues it as a **standard** invoice (`type: STANDARD`), whatever the amount, and rejects a `SIMPLIFIED` invoice that carries one. This is a BeeL. rule: article 7.2 of the RD 1619/2012 does provide for a simplified invoice that states the recipient's NIF and address when a business recipient requires it, and BeeL. covers that case with a standard invoice. Invoices generated from Stripe apply the same rule in their own way, described [below](#on-the-f2-path).
</Callout>

## The decision in one table

| Situation | Type | Why |
|---|---|---|
| You identify the customer (NIF or `alternative_id`) — at **any** amount | **F1** (`type: STANDARD`) | BeeL. issues identified invoices as F1 |
| Consumer you don't identify, total **≤ 3,000 €** (VAT included) | **F2** (`type: SIMPLIFIED`) allowed | Quickest path, no NIF — but see [SIM-002 · Above 400 €, a simplified invoice needs an art. 4.2 activity](/rules/simplified#sim-002) |
| Total **> 3,000 €** | **F1** | F2 is not allowed above the cap |
| Customer is a company / self-employed person / business buyer that wants its NIF on the invoice | **F1** | BeeL. issues identified invoices as F1 (the RD 1619/2012, art. 7.2, would also allow a simplified invoice with the NIF) |
| Customer is a business in another EU country | **F1** | BeeL. rejects intra-EU supplies of goods and operations not subject in Spain on F2 — see [International customers](/verifactu/international-customers) |
| Customer asks for an identified invoice | **F1** | BeeL. issues identified invoices as F1, regardless of amount; after a ticket, [exchange it](#upgrading-an-f2-to-f1-the-canje-case) |
| You're going to apply IRPF withholding | **F1** | BeeL. rejects IRPF on F2 — see [Why no IRPF on F2](#why-no-irpf-on-f2) |

**SIM-002 · Above 400 €, a simplified invoice needs an art. 4.2 activity**

`Required` · Law · Impact: high · Responsibility: the issuing business.

Do not issue a simplified invoice above 400 €, VAT included, unless the operation is one of those listed in art. 4.2 (retail sales, hospitality, passenger transport and the rest of the list) or the invoice is a corrective.

Full rule: [SIM-002](/rules/simplified#sim-002)

> **Rules that apply here:** [SIM-001 · A simplified invoice never exceeds 3,000 €](/rules/simplified#sim-001)

## What BeeL. enforces

### On the F2 path

- **No identified recipient.** `recipient` must not carry `nif` or `alternative_id`, and must not point, through `customer_id`, at a customer that has one. Otherwise the request answers `422` [`SIMPLIFIED_INVOICE_FORBIDS_IDENTIFIED_RECIPIENT`](/errors/SIMPLIFIED_INVOICE_FORBIDS_IDENTIFIED_RECIPIENT) when you create the invoice, when an edit changes its type or its recipient, when you issue it — one by one, in bulk or on schedule — and when you write a recurring invoice template. Pass `recipient: {}`, or just a name for your own records
- `total` (VAT included) **must be ≤ 3,000 €** — rejected above it with `400` [`SIMPLIFIED_INVOICE_EXCEEDS_LEGAL_LIMIT`](/errors/SIMPLIFIED_INVOICE_EXCEEDS_LEGAL_LIMIT), when you create the invoice, when an edit takes it over the cap (new lines, or `type` changed to `SIMPLIFIED`) and when you issue it
- IRPF lines are not allowed on F2 — [`SIMPLIFICADA_FORBIDS_IRPF`](/errors/SIMPLIFICADA_FORBIDS_IRPF); see [Why no IRPF on F2](#why-no-irpf-on-f2). The rate is **not** silently coerced to 0: send no `irpf_rate` at all, or `irpf_rate: 0`
- The equivalence surcharge is not allowed either — [`SIMPLIFICADA_FORBIDS_SURCHARGE`](/errors/SIMPLIFICADA_FORBIDS_SURCHARGE): a retailer in that regime must receive an identified F1
- Reverse charge is not allowed — [`SIMPLIFICADA_FORBIDS_ISP`](/errors/SIMPLIFICADA_FORBIDS_ISP): an anonymous recipient cannot self-assess
- Intra-EU supplies of goods (`EXENTA_ART_25`) and operations not subject by place of supply (`NO_SUJETA_LOCALIZACION`) are not allowed — [`SIMPLIFICADA_FORBIDS_CROSS_BORDER`](/errors/SIMPLIFICADA_FORBIDS_CROSS_BORDER), when you create the invoice, edit it and issue it. The OSS regime (`regime_key: "17"`) is allowed
- Apart from those, line semantics work as on F1: IVA rates, regime keys, exemption reasons, etc.

Whatever the recipient block holds, AEAT receives an F2 **without** recipient data — see [What AEAT receives](/verifactu/what-aeat-receives).

A simplified invoice issued before this check may still carry a `nif` or `alternative_id` when you read it. A draft in that state can still be edited — notes, dates, lines — but it is rejected when you issue it until it is changed to `STANDARD` or loses the identifier.

<Callout type="info">
  **Invoices generated from Stripe payments pick their type from the customer's data, not from the amount.** A customer with a NIF and a complete address always receives a standard invoice. Without them, the payment gets a simplified invoice up to 3,000 €; above that, BeeL. saves a draft to complete. Like every F2 in BeeL., a simplified invoice never identifies its recipient. The connection's `simplificada_threshold` is deprecated and no longer has any effect (see [Connection settings](/stripe/connection-settings#simplified-threshold-deprecated)).
</Callout>

> **Rules that apply here:** [SIM-001 · A simplified invoice never exceeds 3,000 €](/rules/simplified#sim-001) · [SIM-004 · A simplified invoice still carries its minimum contents](/rules/simplified#sim-004) · [SIM-005 · The record of a simplified invoice carries no recipient](/rules/simplified#sim-005) · [SIM-006 · An identified customer gets a standard invoice (F1)](/rules/simplified#sim-006)

### On the F1 path

- `recipient.nif` **or** `recipient.alternative_id` is required — request rejected if both are missing
- For Spanish NIFs (DNI / NIE / CIF), the **NIF and name must match the AEAT census** when the invoice goes to AEAT — BeeL. checks it before submission (the same check as the [NIF Validation API](/nif-validation/validateNif)) and rejects a mismatch with `422 NIF_NOT_IN_CENSUS`
- For foreign customers, use [`alternative_id`](/verifactu/international-customers#identifying-foreign-customers) instead of `nif`

<Callout type="info">
  **3,000 € is IVA-included.** A line at 2 600 € + 21 % IVA = 3 146 € totals over the threshold → must be F1.
</Callout>

> **Rules that apply here:** [CNT-002 · A business customer always gets an invoice, identifying it when asked](/rules/contents#cnt-002) · [CNT-003 · A full invoice names both parties by their legal name](/rules/contents#cnt-003) · [CNT-005 · A full invoice identifies the recipient by NIF](/rules/contents#cnt-005) · [CNT-006 · A full invoice shows the address of both parties](/rules/contents#cnt-006) · [SIM-006 · An identified customer gets a standard invoice (F1)](/rules/simplified#sim-006)

## Edge cases the law handles

### Operations where F2 is not allowed

Article 4.4 of the RD 1619/2012 lists operations for which «no podrá expedirse factura simplificada», among them intra-EU supplies of goods exempt under article 25 of the VAT law and certain distance sales of goods. On top of the law, BeeL. applies its own rules. Together, BeeL. rejects these on F2, from the line data:

- Intra-EU supplies of goods exempt under art. 25 LIVA (`EXENTA_ART_25`), and operations not subject because they are located outside Spain (`NO_SUJETA_LOCALIZACION`, art. 4.4.d) → [`SIMPLIFICADA_FORBIDS_CROSS_BORDER`](/errors/SIMPLIFICADA_FORBIDS_CROSS_BORDER)
- Operations under reverse charge (*inversión del sujeto pasivo*) → [`SIMPLIFICADA_FORBIDS_ISP`](/errors/SIMPLIFICADA_FORBIDS_ISP)
- Lines carrying the equivalence surcharge → [`SIMPLIFICADA_FORBIDS_SURCHARGE`](/errors/SIMPLIFICADA_FORBIDS_SURCHARGE)
- Lines carrying IRPF withholding → [`SIMPLIFICADA_FORBIDS_IRPF`](/errors/SIMPLIFICADA_FORBIDS_IRPF)

The other cases of article 4.4 depend on the operation itself: for them, issue a `STANDARD` invoice.

> **Rules that apply here:** [SIM-003 · Some operations can never go on a simplified invoice](/rules/simplified#sim-003)

### Why no IRPF on F2

A withholding is made and reported by the payer, who is identified. A simplified invoice issued through BeeL. never identifies its recipient, so BeeL. does not accept IRPF on it. If your customer is a business that withholds from your invoice, issue an **F1**, whatever the total.

> **Rules that apply here:** [SIM-011 · No equivalence surcharge or IRPF withholding on a simplified invoice](/rules/simplified#sim-011)

### Exchanging simplified invoices for a full invoice [#upgrading-an-f2-to-f1-the-canje-case]

Sometimes a customer asks for an identified invoice *after* you already issued a ticket. That is not a correction — nothing in the ticket is wrong — so it is not an `R5` corrective: exchange it. [Exchange simplified invoices for a full invoice](/invoices/createCompanySimplifiedExchange) issues a `STANDARD` invoice with the lines of one or more simplified invoices and the customer's data (RD 1619/2012, art. 15.6):

```bash
curl -X POST "https://app.beel.es/api/v1/companies/{company_id}/invoices/simplified-exchanges" \
  -H "Authorization: Bearer $BEEL_API_KEY" \
  -H "Idempotency-Key: exchange-ticket-0042" \
  -H "Content-Type: application/json" \
  -d '{
    "simplified_invoice_ids": ["{simplified_invoice_id}"],
    "recipient": { "customer_id": "{customer_id}" }
  }'
```

- **The full invoice** is numbered in `series_id` or in the company's default standard series, and lists the invoices it replaces in `replaced_invoice_ids`. It cannot be voided afterwards ([`EXCHANGE_INVOICE_NOT_VOIDABLE`](/errors/EXCHANGE_INVOICE_NOT_VOIDABLE)).
- **Each simplified invoice** becomes `VOIDED` with `void_cause: EXCHANGED`, in the same act. Its registration is not cancelled: the full invoice replaces it.
- **Same company, same environment.** Every simplified invoice must belong to the company in the path and to the environment (Test or Live) of your API key.

#### With VeriFactu: recorded as F3 [#exchange-with-verifactu]

When the company has VeriFactu enabled, the full invoice is recorded as `F3` (*factura emitida en sustitución de facturas simplificadas*, an invoice issued in place of simplified invoices), identifying each simplified invoice it replaces by number and issue date. The simplified invoices keep their accepted registration: they are exchanged, not cancelled, so no cancellation record is sent for them.

An `F3` can only replace simplified invoices the AEAT already has. Before issuing anything, BeeL. checks the registration of each simplified invoice in `simplified_invoice_ids`:

| The simplified invoice's registration | What happens |
|---|---|
| Accepted (`verifactu.submission_status: ACCEPTED`) | It can be exchanged |
| Still pending (`PENDING`) | `422` [`EXCHANGE_SIMPLIFIED_NOT_YET_ACCEPTED`](/errors/EXCHANGE_SIMPLIFIED_NOT_YET_ACCEPTED): wait until the AEAT accepts it and send the exchange again |
| Rejected (`REJECTED`) | `422` [`EXCHANGE_SIMPLIFIED_RECORD_REJECTED`](/errors/EXCHANGE_SIMPLIFIED_RECORD_REJECTED): fix or resubmit it first, then exchange it once it is accepted |
| None: it was issued without VeriFactu | `422` [`SIMPLIFIED_EXCHANGE_NOT_RECORDABLE`](/errors/SIMPLIFIED_EXCHANGE_NOT_RECORDABLE): it is not on file with the AEAT, so an `F3` cannot replace it |

If any of them fails, nothing is issued and the simplified invoices stay as they were. The [exchange](/invoices/createCompanySimplifiedExchange) is all or nothing.

<Callout type="warn">
  **An exchange invoice recorded as `F3` cannot be corrected yet.** A corrective on it answers `422` [`EXCHANGE_INVOICE_NOT_CORRECTABLE`](/errors/EXCHANGE_INVOICE_NOT_CORRECTABLE), and it cannot be voided either. Check the recipient and the lines before you send the exchange; if an `F3` has an error, contact support.
</Callout>

#### Rejections [#exchange-errors]

| Case | Error | Status | Why |
|---|---|---|---|
| An id in `simplified_invoice_ids` that is not a simplified invoice | [`EXCHANGE_REQUIRES_SIMPLIFIED`](/errors/EXCHANGE_REQUIRES_SIMPLIFIED) | `422` | One of `simplified_invoice_ids` is not a simplified invoice. Only simplified invoices are exchanged. |
| A simplified invoice not issued, already voided, exchanged or corrected, or from another company or environment | [`SIMPLIFIED_NOT_EXCHANGEABLE`](/errors/SIMPLIFIED_NOT_EXCHANGEABLE) | `422` | One of `simplified_invoice_ids` cannot be exchanged: it is not issued, it was already voided, exchanged or corrected, or it belongs to another company or environment (Test or Live) than the request. |
| The same simplified invoice listed more than once in `simplified_invoice_ids`: list each one once | [`EXCHANGE_DUPLICATED_SIMPLIFIED`](/errors/EXCHANGE_DUPLICATED_SIMPLIFIED) | `422` | The same simplified invoice appears more than once in `simplified_invoice_ids`. The message names it. Nothing was issued or numbered. |
| With VeriFactu: a simplified invoice whose registration is still pending | [`EXCHANGE_SIMPLIFIED_NOT_YET_ACCEPTED`](/errors/EXCHANGE_SIMPLIFIED_NOT_YET_ACCEPTED) | `422` | The exchange invoice is recorded with VeriFactu as `F3`, which only replaces simplified invoices the AEAT has accepted, and the record of one of `simplified_invoice_ids` is still pending. Nothing is issued. |
| With VeriFactu: a simplified invoice whose registration was rejected | [`EXCHANGE_SIMPLIFIED_RECORD_REJECTED`](/errors/EXCHANGE_SIMPLIFIED_RECORD_REJECTED) | `422` | The exchange invoice is recorded with VeriFactu as `F3`, which only replaces simplified invoices the AEAT has accepted, and the record of one of `simplified_invoice_ids` was rejected, so that invoice is not on file with the AEAT. Nothing is issued. |
| With VeriFactu: a simplified invoice issued without VeriFactu | [`SIMPLIFIED_EXCHANGE_NOT_RECORDABLE`](/errors/SIMPLIFIED_EXCHANGE_NOT_RECORDABLE) | `422` | The exchange invoice is recorded with VeriFactu as `F3`, which only replaces simplified invoices already on file with the AEAT, and one of `simplified_invoice_ids` was issued without VeriFactu. Nothing is issued. |
| Voiding the exchange invoice afterwards | [`EXCHANGE_INVOICE_NOT_VOIDABLE`](/errors/EXCHANGE_INVOICE_NOT_VOIDABLE) | `422` | The invoice was issued in exchange for simplified invoices, which it replaced. It cannot be voided. |
| Correcting an exchange invoice recorded as `F3` | [`EXCHANGE_INVOICE_NOT_CORRECTABLE`](/errors/EXCHANGE_INVOICE_NOT_CORRECTABLE) | `422` | The invoice was issued in exchange for simplified invoices and recorded with VeriFactu as `F3`. Correcting an `F3` exchange invoice is not available yet. |

Without VeriFactu, the exchange invoice is not recorded, and it is corrected like any other invoice if it has an error.

> **Rules that apply here:** [SIM-007 · Exchanging a simplified invoice for a full one](/rules/simplified#sim-007) · [SIM-009 · A customer who asks to be identified gets an invoice that identifies it](/rules/simplified#sim-009)

## Canonical request shapes

### F2 (no identified recipient)

```json
{
  "type": "SIMPLIFIED",
  "recipient": {},
  "lines": [
    {
      "description": "Computer repair service",
      "quantity": 1,
      "unit": "service",
      "unit_price": 300,
      "discount_percentage": 0,
      "main_tax": { "type": "IVA", "percentage": 21, "regime_key": "01" }
    }
  ],
  "payment_info": { "method": "CASH" }
}
```

### F1 (Spanish customer identified)

```json
{
  "type": "STANDARD",
  "recipient": {
    "legal_name": "Comercial Martínez SL",
    "nif": "B12345674",
    "address": {
      "street": "Avenida de la Constitución",
      "number": "45",
      "postal_code": "41001",
      "city": "Sevilla",
      "province": "Sevilla",
      "country": "España"
    }
  },
  "lines": [
    {
      "description": "Business strategic consulting",
      "quantity": 8,
      "unit": "hours",
      "unit_price": 125,
      "discount_percentage": 0,
      "main_tax": { "type": "IVA", "percentage": 21, "regime_key": "01" }
    }
  ],
  "payment_info": { "method": "BANK_TRANSFER", "iban": "ES9121000418450200051332", "payment_term_days": 30 }
}
```

## Related

<Related>

- [Invoice types](/verifactu/invoice-types) — the full F1/F2/R catalogue
- [Tax classification](/verifactu/tax-classification) — IVA rate, exempt operations, ISP
- [International customers](/verifactu/international-customers) — when F2 is never appropriate
- [Create an invoice](/invoices/createCompanyInvoice) — full request schema

</Related>

---

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