Quotes
Quotes are proposals sent to contacts before work begins. They share the same underlying invoices table as sales invoices (with invoice_type = 'quote') and follow a parallel lifecycle.
Lifecycle
draft → sent → accepted → converted
→ declined
- draft — editable, can be deleted
- sent — delivered to the contact, no longer editable
- accepted — contact has agreed, eligible for conversion
- declined — contact rejected the quote
- converted — an invoice has been created from this quote
Only accepted quotes can be converted to invoices. Only draft quotes can be edited or deleted.
Conversion
Converting a quote creates a new draft invoice copying all line items, contact, notes, and terms. The quote is marked as converted with a link to the new invoice. The invoice gets a new invoice number from the standard numbering sequence.
Amounts
All monetary values are in minor units (pence). Line-level calculations use Decimal.js for precision. Quote totals are computed server-side from line items.
Numbering
Quotes use the pattern QT-{year}-{sequence} (e.g. QT-2026-0001). The prefix and next number are configurable via organisation settings.
Expiry
Quotes have a validUntil date. Expired quotes (where validUntil < today and status is sent) are tracked in the stats but not automatically transitioned — the status remains sent.
Endpoints
https://app.speybooks.com/api/v1/quotes/ List quotes POST https://app.speybooks.com/api/v1/quotes/ Create a new quote POST https://app.speybooks.com/api/v1/quotes/preview Preview quote calculations GET https://app.speybooks.com/api/v1/quotes/{id} Get quote details PUT https://app.speybooks.com/api/v1/quotes/{id} Update a quote DELETE https://app.speybooks.com/api/v1/quotes/{id} Delete a draft quote POST https://app.speybooks.com/api/v1/quotes/{id}/convert Convert quote to invoice PATCH https://app.speybooks.com/api/v1/quotes/{id}/status Update quote status