NewStripe: a buyer with a NIF always gets a standard invoice, and the simplified threshold is deprecated
BeeL
Get startedMulti-NIFVeriFactuRulesStripeAPI referenceChangelog

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.

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.

The decision in one table

SituationTypeWhy
You identify the customer (NIF or alternative_id) — at any amountF1 (type: STANDARD)BeeL. issues identified invoices as F1
Consumer you don't identify, total ≤ 3,000 € (VAT included)F2 (type: SIMPLIFIED) allowedQuickest path, no NIF — but see SIM-002 Above 400 €, a simplified invoice needs an art. 4.2 activity
Total > 3,000 €F1F2 is not allowed above the cap
Customer is a company / self-employed person / business buyer that wants its NIF on the invoiceF1BeeL. 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 countryF1BeeL. rejects intra-EU supplies of goods and operations not subject in Spain on F2 — see International customers
Customer asks for an identified invoiceF1BeeL. issues identified invoices as F1, regardless of amount; after a ticket, exchange it
You're going to apply IRPF withholdingF1BeeL. rejects IRPF on F2 — see Why no IRPF on F2

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 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, 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; see 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: a retailer in that regime must receive an identified F1
  • Reverse charge is not allowed — 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, 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.

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.

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).

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) and rejects a mismatch with 422 NIF_NOT_IN_CENSUS
  • For foreign customers, use alternative_id instead of nif

3,000 € is IVA-included. A line at 2 600 € + 21 % IVA = 3 146 € totals over the threshold → must be F1.

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:

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

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.

Exchanging simplified invoices for a full invoice

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 issues a STANDARD invoice with the lines of one or more simplified invoices and the customer's data (RD 1619/2012, art. 15.6):

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).
  • 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

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 registrationWhat happens
Accepted (verifactu.submission_status: ACCEPTED)It can be exchanged
Still pending (PENDING)422 EXCHANGE_SIMPLIFIED_NOT_YET_ACCEPTED: wait until the AEAT accepts it and send the exchange again
Rejected (REJECTED)422 EXCHANGE_SIMPLIFIED_RECORD_REJECTED: fix or resubmit it first, then exchange it once it is accepted
None: it was issued without VeriFactu422 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 is all or nothing.

An exchange invoice recorded as F3 cannot be corrected yet. A corrective on it answers 422 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.

Rejections

CaseErrorStatusWhy
An id in simplified_invoice_ids that is not a simplified invoiceEXCHANGE_REQUIRES_SIMPLIFIED422One 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 environmentSIMPLIFIED_NOT_EXCHANGEABLE422One 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 onceEXCHANGE_DUPLICATED_SIMPLIFIED422The 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 pendingEXCHANGE_SIMPLIFIED_NOT_YET_ACCEPTED422The 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 rejectedEXCHANGE_SIMPLIFIED_RECORD_REJECTED422The 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 VeriFactuSIMPLIFIED_EXCHANGE_NOT_RECORDABLE422The 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 afterwardsEXCHANGE_INVOICE_NOT_VOIDABLE422The invoice was issued in exchange for simplified invoices, which it replaced. It cannot be voided.
Correcting an exchange invoice recorded as F3EXCHANGE_INVOICE_NOT_CORRECTABLE422The 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.

Canonical request shapes

F2 (no identified recipient)

{
  "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)

{
  "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 }
}