All docs

Invoicing

Invoice lifecycle

Understanding invoice statuses, transitions, and when you can edit, void, or delete an invoice.

5 min read

Every invoice in Financica moves through a series of states that reflect where it is in the bookkeeping process. This page explains the full lifecycle for both expense (inbound) and revenue (outbound) invoices.

Status badges

The badge on each invoice in the table is derived from a few independent signals — whether the invoice is in your books, whether it has been sent externally, whether it has been voided, and how much has been paid. You never set a status directly; you take an action and the badge follows.

BadgeWhat it meansWhen it shows
DraftAn outbound invoice you are still composing.Created, not yet sent or posted.
SentYou have sent the invoice externally but it isn't in the books yet.Outbound, sent_at is set, not posted.
IssuedThe invoice is in the books and waiting on customer payment.Outbound, posted, unpaid.
UnreviewedAn inbound invoice waiting to be approved into the books.Inbound, not posted.
PaidFully paid (or fully applied for credit notes).payment_status is paid.
Partially paidSome payment applied, balance remains.payment_status is partially_paid.
OverpaidMore applied than owed.payment_status is overpaid.
No chargeA zero-total invoice that needs no payment.total ≈ 0 and paid.
VoidedThe invoice has been invalidated.voided_at is set.

For credit notes the wording shifts to Applied / Partially applied / Unapplied / Overapplied, but the underlying signals are the same.

Typical lifecycle

Expense invoices (inbound)

  1. Upload or receive an invoice. It shows as Unreviewed.
  2. Review the extracted data and correct any errors.
  3. Post the invoice to the books — this creates the journal entries that put the expense on your reports.
  4. Link a bank transaction as payment. The badge updates to Paid.

Revenue invoices (outbound)

  1. Create or upload an invoice. It shows as Draft.
  2. Edit line items, set dates and customer details.
  3. Mark as sent (or send by email / Peppol) when you have sent it to the customer. The badge becomes Sent.
  4. Post the invoice when ready to record it in your books — the badge becomes Issued.
  5. When the customer pays, link the bank transaction. The badge updates to Paid.

You can also link a payment to a draft revenue invoice — the linking flow auto-posts it as part of applying the payment, which is the same as steps 4 and 5 in one click.

For invoices synced from Stripe, the badge tracks Stripe's own state.

What you can do at each step

The actions available at any point depend only on the invoice's current signals; they don't follow a strict ordered workflow.

  • Edit fields — Allowed until the invoice is voided. For revenue invoices, also locked once you've marked the invoice as sent or posted it. (UBL imports and Stripe-synced invoices are also locked from editing because their content is owned by the source document.)
  • Mark as sent — Available for outbound, non-Stripe drafts that haven't been sent or posted yet.
  • Post to the books — Available for any non-voided invoice that isn't already posted.
  • Link a payment — Available for any non-voided invoice that still has a balance due. Linking against a draft auto-posts the invoice.
  • Void — Available for any non-voided invoice. Voiding reverses journal entries and undoes payment consolidation.
  • Unvoid — Available for any voided invoice. Restores it to its pre-voided state for reprocessing.
  • Delete — Available for any invoice. For Stripe-synced invoices, see Deleting an invoice below.

For developers: the canonical implementation of each "what can the user do" check lives in src/lib/invoices/state.ts — see the invoice state docs.

Voiding an invoice

Voiding marks an invoice as invalid without deleting it. This is the preferred approach when you need to keep a record of the invoice for audit purposes.

When you void an invoice:

  • A Voided badge appears.
  • If the invoice was posted, the journal entries are reversed.
  • If a payment was consolidated, the consolidation is undone.
  • The invoice becomes read-only.

You can unvoid an invoice at any time to put it back into circulation.

Deleting an invoice

Deleting permanently removes the invoice and all its associated data (documents, journal entries, payment links). Use this when the invoice was created in error and you do not need to keep a record.

When you delete an invoice:

  • The invoice and its documents are removed.
  • Any posted journal entries are reversed first.
  • Any payment consolidation is undone.

Deleting a Stripe revenue invoice

Deleting a Stripe-synced invoice removes it from Financica only. Stripe itself does not let you delete an invoice once it has been finalized, so the original document continues to exist in your Stripe account. This is a useful escape hatch for cleaning up duplicate imports or test data without touching your Stripe history.

When you click Delete on a Stripe-synced invoice, Financica re-checks the current status with Stripe so the dialog reflects the latest state (a draft synced earlier today may have been finalized in the Stripe dashboard since). What happens next depends on what Stripe reports back:

  • Stripe integration disconnected — the link to Stripe is no longer live, so deletion is a plain local removal.
  • Still a draft on Stripe — you can choose to delete locally only, or also delete the draft on Stripe. Drafts are the only invoices Stripe allows you to delete.
  • Anything else (open, paid, void, uncollectible) — Financica warns you that Stripe will keep the invoice, and the action only removes the local copy.

Deleting from the revenues list

The bulk Delete action on the revenues list always deletes locally. It does not attempt to remove anything on Stripe, even for drafts. Use the invoice detail page when you want the choice of also deleting on Stripe.

Zero-total invoices

Invoices with a total of zero are automatically marked as Paid with a No charge badge. No payment linking is needed. This commonly happens with fully discounted invoices or invoices that net to zero after credits.