What the business needed
The owner runs a property-services business from the road. Work arrives by email, it is done by subcontractors, and most of the office work happens by talking to an AI assistant — earbuds in, dictating between jobs or while driving, not typing. Homeowners expect to pay on the day, so the ask was plain: when the job is finished, the client should have the bill, without anyone sitting at a desk to send it.
What happened
Since 24 August, every residential visit on the owner's account that was set to bill this way has been invoiced the moment the work was marked complete, and every one has been paid by card. Four invoices sent automatically, four paid.
The most recent shows the whole loop. A new enquiry arrived by email. The owner told the assistant, by voice, to set the client up — passing it a screenshot from the old system — then booked the visit and dispatched it to a subcontractor. Five days later the subcontractor finished the job and marked it complete in their own portal. Ten seconds later the invoice was in the client's inbox with a link to pay by card. The client paid the next day, and the payment recorded itself against the invoice. From the first email to money in the bank, the owner did not type a thing and did not open a desktop.
How it works
- One setting per client. Instant invoice on completion sits on the client's page with three choices: Default (on for residential clients, off for commercial), On, or Off. The page shows what the setting resolves to, so the owner can see whether finishing the next job will bill that client.
- Completion is the trigger, however it happens. The contractor's portal, the owner's screen and an assistant calling
record_completionall run the same engine. - The same tax check as a hand-approved send. An invoice that would fail it is held for the owner, never sent.
- One invoice per visit. A double tap in the field or a repeated event returns the first invoice, never a second one.
- A link that lasts. The email carries the client's portal link, which never expires and opens a fresh card checkout each time — so a client who pays a week later still finds a working link.
- The contractor never sees the client's price. Their completion screen confirms the invoice went out, and nothing more.
Proof
- Four invoices sent automatically on a live account since 24 August; all four paid by card, each payment recorded against its invoice by the payment itself.
- Ten seconds from the contractor's completion to the invoice email on the latest visit, read from the platform's own event log.
- Built test-first: twelve specification tests written and seen failing before the code, then passing; eight unit, three route and two structural tests added since (
tests/db/finance/wp-street-pay-engine.test.ts,tests/db/finance/wp-street-pay-confidentiality.test.ts,tests/unit/finance/instant-invoice-policy-form.test.ts,tests/structural/wp-street-pay-locks.test.ts).
For the next agent
- Before completing a visit, check the client's setting on their page;
update_clientchanges it. - Give the visit an agreed price and the client a billing email. Without both, the invoice waits in the owner's normal queue instead of going out.
- When you send a client a payment link yourself, use
get_client_portal_link. It is the same link the automatic email carries, and it does not expire.