SolidInvoice 3.1 is out. Most of this release is about the invoice itself: when it is due, what each line says, what it looks like, and which currency it is in. A few of the bug fixes matter just as much, especially if you bill clients on a recurring schedule.
Here is what changed and what it means for getting paid.
Payment terms that set the due date for you
Pick a payment term on an invoice and SolidInvoice calculates the due date from the invoice date. You can choose Due on receipt, Net 7, Net 14, Net 15, Net 30, Net 45, Net 60, Net 90, End of month, End of next month, or Custom when you want to set the date by hand.
- Company default. Set the term most of your clients get under Settings → Invoice. It starts at Net 30.
- Per-client terms. Give a client their own term and it is preselected on every new invoice for them. The client who always pays on Net 15 gets Net 15 without you thinking about it.
- Live due dates. Change the invoice date and the due date moves with it.
The term appears next to the due date on the invoice view, the PDF and the email (for example, "Mar 2, 2026 · Net 30"), so your client sees exactly what you agreed. To avoid confusion, the free-text "Terms" box is now called "Terms & Conditions".
Existing invoices are set to Custom during the upgrade, so none of your current due dates change. If you are unsure which term to use, our guide to invoice payment terms compares them, and the Net 30 guide covers the most common one in detail.
Recurring and converted invoices now go overdue
This is the fix worth upgrading for if you bill retainers with recurring invoices.
Before 3.1, invoices generated from a recurring schedule or converted from a quote were created without a due date. An invoice without a due date can never be overdue, so it never showed up as late and never triggered a payment reminder. A client could leave one unpaid for months and SolidInvoice would stay quiet.
From 3.1, those invoices get a due date from their payment terms. They go overdue on time, and on Pro and Business plans they receive automatic payment reminders like every other invoice.
Invoices created before the upgrade keep the due date they had. If you have open recurring or converted invoices from earlier, check them and add a due date by hand so they are tracked too.
Designer templates for invoices and quotes
Business plan customers now have a Design section in settings with a template gallery and live previews. Choose from Classic, Compact, Editorial, Friendly, Modern, Monochrome, Photographer and Studio. One choice applies to both invoices and quotes, everywhere your client sees them: the PDF, the email and the web view.
The PDFs themselves got a readability pass across every template:
- A clear status line shows whether a document is paid, overdue or due, and the status watermark prints in your language instead of an internal code.
- Labels, table headers and overdue colours have more contrast, so they stay legible on paper.
Line items with names, descriptions and drag-to-reorder
Each line on an invoice, recurring invoice or quote now has a short name and an optional description. The name is what your client scans; the description holds the detail. The description field stays tucked away until you open it, so a simple one-line item still takes one field.
You can also drag lines into any order. The order sticks: it is the same in the app, on the PDF and through the API.
Your existing invoices keep working. During the upgrade, each line gets a name taken from the first line of its description, and nothing is deleted.
Quantities are now stored as exact decimals, so 1.5 hours stays 1.5 hours on every total.
Issued invoices keep their currency
In earlier versions, an invoice looked up its currency from the client every time it was displayed. If you changed your default currency, or a client's currency, every past invoice for them changed too. An invoice that said $1,000 would suddenly say €1,000 for the same number, including invoices the client had already paid.
From 3.1, an invoice or quote locks its currency the moment it is issued. Drafts still follow the client's currency until you send them. Online payments also charge in the invoice's locked currency.
Amounts also respect each currency's decimal places, which fixes formatting for currencies like the Japanese yen that do not use cents.
Easier Stripe and PayPal setup
Connecting a payment gateway used to mean filling in a bare form of keys with no explanation. The Payments → Payment Methods screen has been rebuilt so you can set it up without a developer:
- Gateways are grouped into Online and Offline & manual, with older gateways moved under More gateways.
- Each gateway has a plain-English summary, plus a "Not sure which one to choose?" comparison for Stripe Checkout vs Stripe.js and PayPal Express vs Pro.
- A Get your API keys link takes you straight to the right page in your Stripe or PayPal dashboard.
- Every credential field explains what it is and shows the expected format, such as
pk_live_....
The sooner a gateway is connected, the sooner your clients can pay an invoice online with a card.
Smaller improvements
- Team invitations expire. Invites are valid for 7 days. Resending one renews it, and you can delete pending or expired invites from the list.
- Resend verification emails. If a verification email gets lost, you can request a new one.
- Refreshed UI. The app now runs on Tabler 1.5, with updated designs on several pages.
Bug fixes you may have noticed
- Changing the client on an existing invoice or quote works again.
- Phone numbers and custom field values on contacts now save correctly.
- The Add Credit button on the client page works again.
- The discount field no longer throws an error when it is empty or contains text.
- Invoices and quotes for archived clients stay listed and viewable.
- The recurring invoices list no longer crashes for some schedules.
- Sending a quote that was already sent no longer causes an error.
For self-hosters and API users
- Symfony 8.1. SolidInvoice now runs on Symfony 8.1.
- Smoother installs and upgrades. The install script and the migration step during upgrades are fixed, and the full migration chain now runs cleanly on MySQL, MariaDB and PostgreSQL.
- Proxmox VE. The docs have a new Proxmox VE install guide, replacing the Snap page.
- Reverse proxies. FrankenPHP accepts
--domaintogether with--disable-https, for running behind a proxy that handles TLS. - API authentication change. REST API requests must send the token in the
X-API-TOKENheader. The?token=query-string fallback has been removed, so update any scripts or integrations that still use it before upgrading. - MCP. The
create_invoiceandcreate_recurring_invoicetools acceptpayment_terms, so your AI assistant can set terms when it drafts an invoice.
How to get 3.1
SolidInvoice Cloud. The update is live. If you have a trial or an active subscription, you are already on 3.1.
Self-hosted. Download the latest release from the downloads page. Back up your database first, then run the migrations. The upgrade adds payment terms, line names and positions, and the locked currency column.
New to SolidInvoice. Start your 14-day trial of SolidInvoice Cloud. No credit card required.
SolidInvoice is invoicing software for freelancers and small businesses. The source code is on GitHub, and you can follow along or ask questions in GitHub Discussions.