Job to paid
| Step | Operation | Who |
|---|---|---|
| Start the job | jobs.create | Agent |
| Add photos | media.requestUpload, then PUT the bytes | Agent |
| Write the quote from the worker's lines | quotes.create | Agent |
| Owner checks it, then send | quotes.send | Agent, after the owner says go |
| Customer signs | quotes.sign | Customer, hosted page |
| Make the invoice | invoices.createFromQuote | Agent |
| Idaho jobs: subcontractor statement | subcontractors.prepare, then the owner signs | Agent, then owner |
| Send the invoice | invoices.send | Agent |
| Customer pays by card or bank (ACH) | invoices.pay | Customer, hosted page |
| Or paid by cash or check | invoices.markPaidOutside | Owner or office, own sign-in |
| Customer confirms the work | jobs.requestConfirmation | Agent sends the link |
| Show the signed record | jobs.record | Agent |
Quote lines
Each line has a description, a quantity and a unit price in cents (unit_price_minor). Take these from the worker word for word. If a price is missing, ask. Read the total back before sending.
Bank payments
A bank (ACH) payment takes a few business days to clear. While it clears, the invoice isn't paid yet, and paying again answers payment_pending. Tell the owner: "The customer paid by bank. It takes a few business days to clear." When it clears you get invoice.paid. If it fails you get invoice.payment_failed, the owner gets an email, and the same pay link works again.
Waiting
Signing and paying happen when the customer gets to it. Subscribe to webhooks such as quote.signed and invoice.paid, or check with the read operations, then tell the owner.