Quotes / estimates
A quote (estimate / proposal) is a pre-sale price summary. Easy Invoice ships a full quote system in the free plugin — separate CPT, separate list, separate numbering, online accept/decline.
What a quote is, technically
- Custom post type:
easy_invoice_quote(registered inincludes/EasyInvoice.php:314–346). - Slug:
easy-invoice-quote/<post-slug>. - Lifecycle: draft → sent → accepted / declined → (optional) converted to invoice.
When to use a quote vs an invoice
| Scenario | Use |
|---|---|
| Client hasn't agreed yet ("send me a quote for…") | Quote |
| You're locking in scope and waiting on approval | Quote |
| Client agreed; you're billing | Invoice |
| Client paid up-front (deposits) | Invoice with deposit (Pro) |
Building a quote
Open Easy Invoice → Add New Quote.
The builder mirrors the invoice builder:
- Quote number — auto-incremented from Settings → Quote → Next quote number. Default prefix
QUO-. - Client — search WP users.
- Quote date + Expiry date (default = today + N days).
- Line items — name, description, quantity, unit price, optional tax/discount per line.
- Currency override (per quote).
- Notes — customer + private.
Click Save Draft to keep it private, or Send to Client when ready.
The accept / decline flow
When the client opens the public quote URL:
- They see the quote on a styled single template.
- Accept and Decline buttons appear at the bottom (free).
- Clicking Accept flips the post status to "accepted" and fires
easy_invoice_quote_acceptedaction. - Clicking Decline flips to "declined" and fires
easy_invoice_quote_declined.
On accept, you (admin) get an email — see Settings → Email → Quote Available / Accepted / Declined.
Convert quote → invoice
Open the accepted quote → click Convert to Invoice:
- A new invoice is created with the same line items, totals, currency, and client.
- The new invoice starts in draft (so you can tweak before sending).
- The original quote stays in the system (not deleted).
The conversion preserves the link via meta — you can always click "Source quote" from the new invoice.
Quote-only settings
Open Easy Invoice → Settings → Quote:
| Setting | Default | What it does |
|---|---|---|
| Quote prefix | QUO- | Visible in the number. |
| Next quote number | 1 | Auto-increments. |
| Default validity | 30 days | Used to compute the expiry date when you create a new quote. |
| Auto-expire | On | Daily cron flips expired quotes to "expired" via easy_invoice_quote_expiration_check. |
Email templates
Quote-related templates live under Easy Invoice → Settings → Email:
- Quote Available — sent on Send to Client.
- Quote Accepted — sent to admin when client accepts.
- Quote Declined — sent to admin when client declines.
Merge tags include {quote_number}, {quote_total}, {client_name}, {accept_url}, {decline_url}. See Email & notifications for the full table.
Public quote shortcode
Linking to a quote inside a page or email body? Use:
[easy_quote_url id="123" text="View your quote"]See Shortcodes for every attribute.
Bulk actions
The quote list supports the same filters and bulk delete as invoices. Pro adds CSV export.
Cron: expiration
Hook: easy_invoice_quote_expiration_check (daily). Marks quotes as expired when:
- The quote is in
sentstatus. - The expiry date is in the past.
- "Auto-expire" is enabled.
If WP-Cron is broken, quotes won't expire automatically — see Troubleshooting.
What's NOT in quotes
- No coupon system.
- No e-signature field (use a separate plugin if you need a legal signature).
- No version history (saving overwrites the previous draft).
Where to go next
- 🧾 Invoices — convert a quote to an invoice and bill.
- 👥 Clients & portal — show clients their quote history.
- ✉️ Email & notifications — customise the quote emails.
- ⚙️ Shortcodes — embed quote links anywhere.