Invoicing
Issue AR invoices to your customers, collect online via Stripe, track aging - without bookkeeping ledger setup.
Overview
- Customers - your end customers' details, payment methods, history.
- Invoices - draft, send, mark paid, refund, write-off.
- Payment Collection - connect Stripe to take card payments on hosted pay pages.
- Recurring - schedule repeating invoices.
- Approvals - maker-checker policies for post/refund/write-off above a threshold.
- AR Aging - outstanding by bucket (0-30, 31-60, …).
Customers
Invoicing → Customers. Add a customer with a display name, email, billing address, default currency, and default payment terms. Edits use optimistic concurrency - if a teammate is editing the same row, you get a clean conflict warning instead of overwriting their changes.
Each customer card shows aggregated AR balance, open invoices, and recent payments. There is no chart of accounts to configure - balances are computed from posted invoices and recorded payments.
Invoices
- New invoice → pick a customer, add line items (description, quantity, unit price, optional tax rate). Add optional discount, shipping, header tax, notes, and terms.
- Save draft to come back later. Drafts are fully editable.
- Post to finalise the invoice number and lock edits. Posting may route through an approval policy if you've configured one.
- Send emails the customer a branded PDF plus the hosted pay link.
- Mark paid records a manual payment (cash, bank transfer, ACH, wire, check, or other) - useful when the customer pays outside of card. Supports partial payments.
Invoice lifecycle
Every invoice moves through these states:
- draft - editable, no invoice number assigned yet.
- sent - posted and emailed to the customer.
- viewed - the customer opened the hosted pay link.
- partially_paid - one or more payments recorded but balance still due.
- paid - balance settled in full. A payment-confirmation email goes out automatically on the first transition into paid.
- overdue - past due date, balance still outstanding. Set nightly by the scheduler.
- void - cancelled. Posted invoices can be voided with an optional reason; void may also route through an approval policy.
- written_off - bad-debt write-off via the approvals engine.
Payment collection
Invoicing → Payment Collection. Click Connect Stripe - opens Stripe Connect Express onboarding in a new tab. Once Stripe approves the account and enables charges, the panel flips green and every new invoice automatically gets a hosted pay link. Payouts go directly to your Stripe-linked bank account on Stripe's schedule. SoftSolz takes a 0% platform fee - we only earn from your monthly Invoicing subscription.
If you'd rather not take card payments, leave Stripe unconnected and pick Bank transfer on each invoice. Add your bank details to the invoice so the customer knows where to send the money, then come back and Mark paid when the funds land.
Customer portal
From any customer's detail page, click Send portal access. SoftSolz issues a short-lived link the customer can use to view their invoice history, download PDFs, and pay outstanding balances - all without creating an account. The token expires automatically and can be reissued at any time.
Get paid from your own website
Beyond invoices, you can let customers pay a custom amount straight from a button on your own website - handy for deposits, ad-hoc charges, "pay what you owe" links, or a simple buy button.
- Connect Stripe first. This only works once you've connected Stripe Connect (see Payment collection above) and finished onboarding. Until then the button won't be able to take payments.
- Your developer adds a Pay button. Using your workspace API key, their code asks SoftSolz to create a secure payment page for the amount you choose.
- The customer pays on a Stripe-hosted page. They're sent to Stripe's checkout, enter their card, and come back to your site afterwards.
- The money lands in your Stripe account. Payments go directly to your connected Stripe account - SoftSolz takes a 0% platform fee. The payment shows up under Payments alongside everything else.
No-code: Payment Links
Don't have a developer? Create a Payment Link right inside SoftSolz - no code, no API key, nothing technical. You get a shareable web address you can paste anywhere: a button on your website, an email, an invoice reminder, a social post, or a QR code.
- Connect Stripe first. Payment Links only work once you've connected Stripe Connect and finished onboarding (see Payment collection above). Until that's done the link can't take payments.
- Create the link in the app. Go to Invoicing, add a Payment Link, give it a title and an optional description. Choose one of two types:
- Fixed amount - e.g. a "Pay £50" button where the price is set by you.
- Let the customer enter the amount - "pay what you want" / "pay what you owe", with an optional minimum you can set.
- Copy and share it. Copy the link and paste it as a normal button or text link on your own site, in an email, or anywhere you like - no script to embed, no developer needed.
- The customer pays on a secure Stripe page. They open your link, see your business name and logo, and pay by card on Stripe's hosted checkout.
- The money lands in your Stripe account. Funds go directly to your connected Stripe account - SoftSolz takes a 0% platform fee. The payment appears under Payments as a website payment, alongside everything else.
Payments
Invoicing → Payments. Shows every successful card payment, manual payment recorded against an invoice, refund, and dispute. Click a payment to see the originating invoice, customer, payment method, and any Stripe charge / payment-intent ids. Payments taken from a button on your own website (or a no-code Payment Link) appear here too.
Refunds
Open any settled payment and click Refund. Pick the amount (full or partial), an optional reason, and submit. The refund flows back through Stripe automatically for card payments, or records as a manual outgoing entry for bank-transfer payments.
Refunding reduces the invoice's amount paid and rolls its status back - paid drops to partially_paid, and a fully-refunded invoice returns to sent or overdue depending on the due date. Refunds above a configurable threshold can be routed through an approval policy.
Credit notes
When you want to reduce a customer's balance without sending money back (a goodwill adjustment, a quantity dispute, a renegotiated price), open the invoice and click Issue credit note. Enter the amount and an optional reason. SoftSolz allocates a sequential CN-#### credit-note number and applies the amount against the invoice's outstanding balance. Credit notes can also route through an approval policy.
Recurring
Invoicing → Recurring. Pick one or more existing posted invoices to use as templates, choose a cadence (weekly, monthly, quarterly, yearly, or a custom cron expression), and set due-in-days. The scheduler generates a fresh draft on each cycle - review and send, or flip the template to auto-send.
Approvals
Define policies under Approvals → Policies. Policies match against resource type (invoice.post, invoice.refund, invoice.write_off, invoice.credit) and an amount threshold, then route the action to one or more approvers in sequence with an SLA. Examples:
- Refunds > £500 need a second approver.
- Write-offs always need the super_admin.
- Posts above £10 000 need finance approval inside 24 h.
- Self-approval is disabled by default.
Pending approvals show up in Approvals → Inbox; you can delegate to a colleague while you're on leave.
AR aging
Invoicing → Reports → AR Aging. Outstanding balance bucketed by days overdue: current, 1-30, 31-60, 61-90, 90+. Click a bucket to drill into the invoices behind it. Pick a custom "as of" date to see how aging looked in the past. Export to CSV for sharing.
Payment reminders
Open an unpaid invoice and click Send reminder to push a follow-up email immediately. The reminder uses your branded template and includes the hosted pay link. Reminder sends are recorded on the invoice's timeline and emit a invoicing.invoice.reminder_sent webhook.
Sandbox
Every live workspace gets a paired sandbox workspace. Toggle between Live and Sandbox in the workspace switcher at the top of the sidebar. Sandbox tenants:
- Have their own data - sandbox invoices never appear in live and vice versa.
- Auto-activate paid services without a Stripe Checkout round-trip so you can test gated routes immediately.
- Never fire real Stripe charges, real customer emails, or real webhooks to your production endpoints.
- Share the member list with the live workspace - everyone who can see live can see sandbox.
Use sandbox to rehearse new approval policies, try recurring schedules, or test API integrations before going live.
Reference
Building a deeper integration? See the developer guide for endpoints and events: