squareetlabs/laravel-verifactu
Laravel package for Veri*factu-compliant invoicing. It helps generate invoice records, QR codes, hashes and XML, and integrates Spanish anti-fraud invoicing requirements into Eloquent models and Laravel apps.
Compliance roadmap for Spanish invoicing. VeriFactu (Reglamento RD 1007/2023, the successor regime to the SII/"Ley Antifraude" framework) is a mandatory obligation for Spanish businesses and for any vendor selling invoicing software into Spain, with phased deadlines landing across 2026–2027. This package is a compliance dependency, not a feature — the decision it really supports is "how do we reach VeriFactu conformance without derailing the roadmap?"
IdSistemaInformatico — the identifier of the producing software system, which VeriFactu records must carry — configurable rather than fixed. That is a prerequisite for the two deployment shapes we actually sell: one codebase serving many tenants/environments, and separate staging vs. AEAT test instances. Previously this was a likely blocker for a SaaS-shaped offering; now it is a configuration concern.Consider it when all of these hold:
IdSistemaInformatico now supports. (Confirm per-tenant vs. per-deployment semantics with the maintainer before designing around it; a globally configurable value may still not be a true per-tenant setting.)Look elsewhere when:
For executives: Spain's VeriFactu mandate becomes enforceable for our customer base in the 2026–2027 window. Non-compliance blocks sales in that market and creates penalties and audit exposure for customers — so this is a revenue-gating requirement, not a nice-to-have. This MIT-licensed Laravel package gives us a head start on the compliance layer at near-zero licensing cost: it is a focused, low-coupling dependency that lets us ship a credible "VeriFactu-ready" capability in weeks rather than quarters, and it maps directly to the largest near-term opportunity in our pipeline. The newest release (v1.0.2) removes a concrete blocker for our business model — the software-system identifier in each invoice record is now configurable, so one build can serve multiple tenants and AEAT test environments — and it is the first release with outside contributors, a small but real sign the project is not a single-person side project. The trade-off remains maturity: small star count, no production adopters we can point to, and no support contract, so we should treat it as an accelerator behind our own interface, budget for independent fiscal review before any customer-facing compliance claim, and keep an exit path. Recommendation: approve a short spike (1–2 sprints) to validate coverage against the regulation and our invoice flows — with v1.0.2 the spike can now cover multi-instance config and test-environment submission — then decide on adopting it as an internal, wrapped dependency versus funding a commercial alternative.
For engineering: This is a Laravel 10–12 package covering VeriFactu invoice record management/registration — the plumbing layer, not the whole product. v1.0.2 makes IdSistemaInformatico configurable (PR #7) to support multiple test instances, plus an integration fix (PR #10); treat it as a minor, non-breaking release, but read the diff and pin the version — the config change may alter where and how that identifier is resolved, and if we assume per-tenant granularity we may need a thin resolver on our side. Both changes come from first-time external contributors, which is a good maintenance signal but also means new code paths with limited battle-testing. Plan to wrap it behind a VerifactuGateway-style interface so we can swap implementations, and expect to own the hard parts ourselves: certificate lifecycle and signing, submission retries and AEAT rejection/correction handling, idempotency, immutable audit trails, and long-term retention. It is MIT with zero dependents, so legal and blast-radius risk are low, but do not let it leak into domain models — keep invoice aggregates clean of regulatory detail, and build a spec-driven test suite around the regulation so we are validating against the law rather than against the library's behaviour.
How can I help you explore Laravel packages today?