VNTP Facturation
Simple, compliant invoicing for freelancers, e-invoicing included.
- Role
- Founder, solo full-stack design and development
- Period
- Dec 2025 – ongoing · VNTP
- Stack
- PHP 8.5
- Symfony 8
- Doctrine ORM 3
- PostgreSQL
- Symfony Messenger
- Redis
- FrankenPHP
- Stimulus
- Bootstrap 5
- Stripe
- Super PDP
- EN 16931 / UBL
- Dompdf
- Web Push
- ClamAV
- PHPUnit
- PHPStan
- Forgejo CI
- Docker
Context
France's e-invoicing reform requires companies to issue B2B invoices in a structured format, through a certified platform. Existing tools are often heavy or expensive for a micro-entrepreneur. I wanted a simple, compliant application designed for freelancers, especially in home services.
Features
- Quotes with deposits, invoices, credit notes, PDFs, and e-mail sending from the company's own address (per-company SMTP, encrypted credentials).
- Annual tax certificates generated automatically for home-service clients (tax credit).
- Social contributions (URSSAF) and VAT tracking: revenue, contributions, alerts before the VAT exemption thresholds are exceeded, guided regime switch. A regulatory watch checks the rates and thresholds published by official sources and proposes the update.
- E-invoicing: each B2B invoice converted to EN 16931 (UBL, French CTC profile), validated then filed through the Super PDP API, with its lifecycle tracked.
- Accountant space: firm invitation, document export.
- Stripe subscription, Web Push notifications, installable mobile app.
- GDPR: data export, account deletion and anonymisation, purge of unverified accounts.
Architecture
- Symfony 8 on PHP 8.5, served by FrankenPHP in worker mode: services keep no state between requests, and that is tested.
- Multi-company: each company has its own credentials (SMTP, certified platform), encrypted at rest with libsodium; the key is never stored in the database.
- Asynchronous processing with Symfony Messenger (e-mails, e-invoice filing), with automatic retries on network errors and tracking of failed sends.
- Lean front end: Twig, reusable Twig components, Stimulus and AssetMapper, no JavaScript build.
- Uploaded files antivirus-scanned, rate limiting on sensitive forms.
Technical challenges
- EN 16931 mapping: an invoice from a VAT-exempt micro-entrepreneur and one from a VAT-registered company both produce documents validated with zero errors by the platform, checked for real in the sandbox, not just in theory.
- Living with imperfect SDKs: a bug in the official client silently broke the validation call (a header forced on a multipart request). I diagnosed it, worked around it cleanly and documented it.
- Time in tests: all date logic goes through an injectable clock, to test due dates, yearly thresholds and fixed-date reminders.
Quality
PHPUnit unit and functional tests, test database rebuilt and transactions rolled back, PHPStan, PHP-CS-Fixer, and continuous integration on every push to a self-hosted forge. One-command deploys, Doctrine migrations run automatically.