Billing
Billing charges each Invoice when it is owed, recovers failed payments, and refunds within Limits.
Outcome
| Part | This Process |
|---|---|
| Outcome | Each Invoice ends paid, refunded, or written off, and its Customer heard why at every step. |
| Reads | Invoice, Order |
| Leaves | Transaction, Invoice, Message, Approval, Evidence, Dispute |
| On time | Within 1 day (business hours); the clock stops while an Action waits on awaitingInput. Late Actions go to the Finance Lead. |
| Runs in | Each Startup |
Accountable
Billing Specialist, Finance Team.
Responsible: Billing Specialist.
Consulted: Finance Lead.
Informed: Customer Lead, Success Manager.
Workflows
| Workflow | Runs | Team |
|---|---|---|
| Dunning | every day | Finance Team |
| Issue a refund | on every Order.refund call | Finance Team |
| Invoice reminders | every day | Finance Team |
| Renewal notice | every day | Finance Team |
| Answer a chargeback | on Dispute.opened | Finance Team |
Who does each step
| Workflow | Step | Role | Calls | Approval |
|---|---|---|---|---|
| Dunning | 1. Retry each unpaid Invoice on the dunning schedule. | Billing Specialist | Invoice.collect | Within a Mandate; waits 1 business hour |
| Dunning | 2. Tell the Customer once per retry, with a link to update payment. | Billing Specialist | Message.create | None |
| Dunning | 3. Pause service only after the last attempt fails. | Billing Specialist | Subscription.pause | None |
| Dunning | 4. Void the Invoice and write it off 30 days after service pauses unpaid. | Billing Specialist | Invoice.void | Asks first; waits 1 business hour |
| Issue a refund | 1. Check the amount against the Billing Specialist’s Limit. | Billing Specialist | ||
| Issue a refund | 2. Refund the Order through Stripe once its delay window passes. | Billing Specialist | ||
| Issue a refund | 3. Tell the Customer the refund is sent. | Billing Specialist | Message.create | None |
| Invoice reminders | 1. Remind the Customer on each send Invoice a week before its due date, with bank details and its purchase order number. | Billing Specialist | Message.create | None |
| Invoice reminders | 2. Remind again the day after it falls past due. | Billing Specialist | Message.schedule | None |
| Invoice reminders | 3. Pause service only after the last reminder past due goes unpaid. | Billing Specialist | Subscription.pause | None |
| Renewal notice | 1. Find Subscriptions and Agreements of a year or longer that renew inside the notice window, 15 to 45 days out by default. | Billing Specialist | Subscription.list | None |
| Renewal notice | 2. Find free trials longer than 31 days that convert to paid inside 3 to 21 days. | Billing Specialist | ||
| Renewal notice | 3. Send one Message with the renewal date, the Price, usage against each Entitlement, and a one-step cancel link. | Billing Specialist | Message.create | None |
| Renewal notice | 4. Send it inside the Customer’s open Thread when a complaint is open, never after the window’s last day. | Billing Specialist | ||
| Renewal notice | 5. Record the notice on the Subscription or Agreement with the date sent. | Billing Specialist | Subscription.update | None |
| Renewal notice | 6. Hand Customers whose usage fell this term to the Success Manager before the renewal date. | Success Manager | Renewal.open | None |
| Answer a chargeback | 1. Gather the Order, its delivery record, the Messages and the terms the Customer accepted as Evidence. | Billing Specialist | Evidence.create | None |
| Answer a chargeback | 2. Accept the Dispute only when the Evidence cannot win it; otherwise answer it. | Billing Specialist | Dispute.accept | Asks first; waits 1 business hour |
| Answer a chargeback | 3. Answer the Dispute through Stripe before its deadline. | Billing Specialist | Dispute.answer | Asks first; waits 1 business hour |
| Answer a chargeback | 4. Send a Customer with a second Dispute to fraud screening. | Risk Analyst | Party.screen | None |
Events
| Direction | When | What happens |
|---|---|---|
| In | Every day | Starts Dunning |
| In | On every Order.refund call | Starts Issue a refund |
| In | Every day | Starts Invoice reminders |
| In | Every day | Starts Renewal notice |
| In | On Dispute.opened | Starts Answer a chargeback |
| In | On Invoice.overdue | Wakes this Process, the first time only. The first retry of a Customer’s payment has failed. |
| Out | Invoice.collected | Raised by step 1 of Dunning |
| Out | Message.created | Raised by step 2 of Dunning |
| Out | Subscription.paused | Raised by step 3 of Dunning |
| Out | Invoice.voided | Raised by step 4 of Dunning |
| Out | Message.scheduled | Raised by step 2 of Invoice reminders |
| Out | Subscription.updated | Raised by step 5 of Renewal notice |
| Out | Renewal.opened | Raised by step 6 of Renewal notice |
| Out | Evidence.created | Raised by step 1 of Answer a chargeback |
| Out | Dispute.accepted | Raised by step 2 of Answer a chargeback |
| Out | Dispute.answered | Raised by step 3 of Answer a chargeback |
| Out | Party.screened | Raised by step 4 of Answer a chargeback |
Plays
No Play names this Process.
Controls
Settings
| Setting | Type | Default | Say | Set with |
|---|---|---|---|---|
dunning.retries | integer | 4 | Retry failed payments four times | Setting.update |
dunning.pauseService | boolean | true | Pause service after the last retry fails | Setting.update |
refunds.limit | money | $100 | Refund up to $100 without asking me | Setting.update |
Failure
A failed step retries; when retries run out, the Action goes to the Finance Lead.
| Step | On failure |
|---|---|
| Dunning 1. Retry each unpaid Invoice on the dunning schedule. | cardExpired: The card on file has expired, so no retry can succeed. Continues at tell. |
| Dunning 3. Pause service only after the last attempt fails. | Remedy: Subscription.resume. |
| Issue a refund 2. Refund the Order through Stripe once its delay window passes. | Goes to the Finance Lead. |
| Invoice reminders 3. Pause service only after the last reminder past due goes unpaid. | Remedy: Subscription.resume. |
| Answer a chargeback 2. Accept the Dispute only when the Evidence cannot win it; otherwise answer it. | contest: The Evidence shows the Order was delivered as sold, so the Dispute is answered. Continues at answer. |
| Answer a chargeback 3. Answer the Dispute through Stripe before its deadline. | Goes to the Finance Lead. |
Loop
| Step | Value |
|---|---|
| Hypothesis | Retrying a failed payment on the Customer’s usual pay day recovers more Invoices and keeps more Customers than retrying daily. |
| Measure | Month-3 retention over 90d, at least 100 observations |
| Learn | The learn step reads the Readout, records Evidence and a Decision, and drafts the next Variant. |
Code
Turn on billingEnable
On by default for SaaS, Headless SaaS, Dataset API, Agent as a Service. Process.pause stops new Actions; Actions in progress finish.
Retry failed payments four timesExample
A dental-reminder SaaS bills 140 offices on the 1st. Dunning recovers 9 of the 11 failed cards by the 14th. The Billing Specialist refunds one double charge of $49, inside its $100 Limit, the same hour.