Appearance
Invoice Workflow
Invoices live in a status workflow. Each status has transitions leading to other statuses, and each transition can fire actions (emails, webhooks, notifications) and evaluate conditions.
Default statuses
Out of the box, FoxCLM ships with:
| Status | Meaning |
|---|---|
| Draft | Being composed; not yet sent |
| Sent | Delivered to the client, waiting for payment |
| Pending Payment | Client has initiated checkout but not confirmed |
| Paid | Full payment received |
| Overdue | Due date passed without payment |
| Cancelled | Void - not billed |
You can add, rename, or remove statuses. Common additions:
- Submitted for Approval / Approved - for multi-user workflows where invoices need review
- Partially Paid - for split payments (FoxCLM does not currently compute partial balances automatically; this is a manual status)
- Refunded - after a refund is processed
Transitions
A transition connects two statuses. You build them at Settings -> Workflows & Statuses, filtering by type Invoice.
Each transition can have:
- Label - shown as the button text on the invoice (e.g. "Send", "Approve", "Cancel")
- Condition - optional - must be satisfied before the transition fires
- Actions - fire when the transition runs (e.g. send email, call webhook)
See Workflows & Statuses for the full reference.
Auto-advance
Two built-in auto-advance jobs run on invoices:
Overdue detection
Every few minutes, FoxCLM checks for invoices where:
- Status is
Sent(or any non-terminal status) due_dateis in the pastoverdue_notified_atis null
These are moved to Overdue, firing any actions you've configured on that transition (typically a send_overdue_notice email action). The flag prevents the email from being resent.
Workflow-driven auto-advance
Any transition can have a date-column condition - e.g. "auto-move to Overdue if due_date < $NOW". The cron checks these and fires the transition when the condition is true.
Approval lock
Settings -> Automation has a master toggle: Invoice Approval Lock.
When enabled:
- An invoice in status
Submitted for ApprovalorApprovedcannot be edited. - Only admins (workspace owner or
admin-level collaborators) can revert toDraftto unlock editing. - This applies across all users including the invoice creator.
Leave it off if your business does not require multi-person approval.
Common workflows
Simple billing flow
Draft -> Sent (action: send_invoice_email)
Sent -> Paid (action: send_paid_confirmation)
Sent -> Overdue (condition: due_date < $NOW, action: send_overdue_notice)
Overdue -> Paid (action: send_paid_confirmation)Approval flow
Draft -> Submitted for Approval
Submitted for Approval -> Approved (action: send_invoice_email)
Submitted for Approval -> Draft (rejection - no action)
Approved -> Paid (action: send_paid_confirmation)
Approved -> OverdueReminder cadence
Sent -> Reminder Sent (condition: issued_date < 7 days ago, action: send_custom_email)
Reminder Sent -> Overdue (condition: due_date < $NOW)
Overdue -> Final Notice (condition: due_date < 14 days ago)Workflow actions for invoices
Action types specific to invoices:
| Action | What it does |
|---|---|
send_invoice_email | Sends the invoice to linked client emails |
send_overdue_notice | Overdue reminder email |
send_paid_confirmation | Payment receipt |
share_invoice / unshare_invoice | Creates or revokes the public share link |
send_custom_email | Any custom subject/body |
create_notification | In-app notification |
call_webhook / call_api | Fire an HTTP request to an external system |
See Workflow Actions for the full list.
Next steps
- Payments - how
Paidfires when Stripe confirms payment - Workflow Actions - configure what fires on each transition
