Appearance
Quotes
Quotes let you send a pre-sale estimate to a customer with line items, totals, an expiration date, and a public Accept / Decline page — without taking payment. When the customer accepts, you can convert the quote into a draft POS order (Off Rack, Special Order, or Layaway) or into a payable Invoice with a single click.
Find Quotes in the Sales section of the sidebar, between Invoices and Gift Cards.
Quotes List
The main Quotes page shows every quote with search, status filter, and pagination.
| Column | Description |
|---|---|
| Quote # | Unique quote number — QT-{YEAR}-{SEQ} (e.g., QT-2026-0001) |
| Customer | Customer name (links to their profile) |
| Status | Status badge — see Statuses below |
| Total | Quote total |
| Expires | Expiration date, or — if no expiry was set |
| Created | Creation date |
Search matches on quote number or customer first/last name. Status filter drops the list down to a single state: All, Draft, Sent, Accepted, Declined, Expired, or Converted.
Click New Quote in the header to start a fresh quote.
Statuses
Quotes move through six statuses, each with its own colored badge:
| Status | Badge | Meaning |
|---|---|---|
| Draft | Gray | Created but not yet sent |
| Sent | Blue | Emailed to the customer; awaiting response |
| Accepted | Green | Customer clicked Accept on the public page |
| Declined | Red | Customer clicked Decline (or staff cancelled the quote) |
| Expired | Gray | Past the expiration date with no response |
| Converted | Rose | Converted to a POS order |
Expired status is computed live — once the quote's expiration date passes, the public page locks down and the list shows it as Expired even if no scheduler has run.
Creating a Quote
Click New Quote to open the create form. The form is split into two columns.
Left Column — Items + Notes
| Field | Description |
|---|---|
| Customer | Type-ahead search showing "LastName, FirstName — email". Required before you can send. |
| Line Items | One row per item. Each line has Product (optional), Variant (if the picked product has variants), Description (required), Qty, Unit Price, and Discount. Click Add Line to add another row, or the X icon to remove one. |
| Customer Notes | Free-form text shown to the customer on the public quote page |
Product picker behavior: picking a product auto-fills the Description with the product name and style number, sets the Unit Price from the product's selling price, and tags the line type as product. Picking a variant updates the description to include the variant attributes (size / color / length) and adjusts the unit price by any per-variant Additional Cost.
You don't have to attach a product — pure custom lines (just a description + price) are fully supported, which makes Quotes useful for services, custom-order estimates, and mixed packages.
Right Column — Settings + Save
| Field | Description |
|---|---|
| Location | The location this quote is from (only shown if you have multiple locations). Determines the default tax rate. |
| Expiration Date | When the quote expires. Quick-set buttons for 7 days, 14 days, and 30 days are right under the field. Leave blank for no expiry. |
| Tax Rate | Auto-filled from the location, overridable per quote |
| Order Discount | A flat dollar amount off the entire quote (separate from per-line discounts) |
| Internal Notes | Staff-only notes — never shown to the customer |
Two save buttons:
- Create Quote — saves as a Draft. The quote sits in your list until you send it.
- Create & Send — saves the quote AND immediately emails it to the customer. Disabled until a customer is selected.
Quote Detail
Click any quote in the list to open its detail page.
Header
The quote number, status badge, and customer name. A Back to Quotes link returns to the list.
Line Items
A read-only table of every line on the quote with Description, Qty, Unit Price, and Total. Edit by going back to the create form (or by re-creating — quotes are intended to be short-lived documents).
Activity
A live audit log of everything that's happened to the quote, color-coded by event type. Each entry shows a description, timestamp, and (for public actions) the visitor's IP address.
| Event | When It's Logged |
|---|---|
| Quote created by [Staff] | Quote is created |
| Quote emailed to [email] | Quote is sent (or resent) |
| Customer viewed the quote | First time the public page is loaded — IP captured |
| Quote accepted by customer | Customer clicks Accept — IP captured |
| Quote declined by customer | Customer clicks Decline — IP captured |
| Quote converted to [type] [order #] | Staff converts the quote to an order |
Totals (Sidebar)
Subtotal, Discount (if any), Tax, and Total — computed from the lines and the quote's tax rate.
Dates (Sidebar)
| Date | Description |
|---|---|
| Created | When the quote was created |
| Sent | When the quote was first emailed (blank for drafts) |
| Expires | The expiration date (blank if not set) |
| Accepted / Declined | Stamped when the customer responds; shown in the matching color |
Actions (Sidebar)
The Actions card changes based on the quote's status:
| Action | Shown When | What It Does |
|---|---|---|
| Send Quote | Draft | Emails the quote to the customer using the Quote Sent template, sets status to Sent, stamps sent_at, surfaces the Public Link |
| Resend Quote | Sent or Accepted | Re-sends the same email to the customer (useful if they lost the original) |
| Convert to Order | Accepted | Opens the Convert to Order modal |
| Convert to Invoice | Accepted (and not already converted) | Creates a draft Invoice from the quote's line items and links it back to the quote |
| Cancel Quote | Anything except Converted or Declined | Sets status to Declined |
Public Link (Sidebar)
Once a quote has been sent, the Public Link field shows the customer-facing URL with a Copy button. The link is a tokenized URL that the customer can open without logging in — share it via SMS, in person, or anywhere else outside the email channel.
Public Quote Page
Customers receive an email with a View Quote button that opens the public page. The page is unauthenticated, branded with your boutique's logo + accent color, and lives at:
https://app.bridalop.com/{your-booking-uid}/quote/{token}What the customer sees:
- Your boutique's logo and name
- The quote number and "Prepared for [Customer Name]"
- A status banner (Accepted / Converted / Declined / Expired) when applicable
- The line items table with Description, Qty, and Total
- The totals card (Subtotal, Discount, Tax, Total)
- Your customer-facing notes (the Internal Notes are never shown here)
- An expiration reminder if the quote hasn't been responded to yet
- An Accept Quote button (your accent color) and a Decline Quote button (outline, with a confirmation prompt)
Both buttons are hidden once the quote has been Accepted, Declined, Converted, or Expired — the page becomes read-only.
What Happens When a Customer Accepts
- Quote status flips to Accepted and
accepted_atis stamped - The quote creator (the staff member who originally made the quote) gets an email: "Quote QT-2026-0001 accepted by [Customer]"
- Every Owner and Manager also gets the same email
- An in-app notification appears in the BridalOp notification bell for staff
- The activity log captures the acceptance with the customer's IP
The customer is not automatically charged and no order is automatically created — acceptance is a green light for staff to take the next step.
What Happens When a Customer Declines
- Quote status flips to Declined and
declined_atis stamped - An in-app notification is created for staff
- The activity log captures the decline with the customer's IP
Convert to Order
When a quote is Accepted, the Convert to Order button on the detail page opens a small modal asking which kind of order you want.
| Order Type | What It Creates |
|---|---|
| Off Rack Sale | A pos-type draft order — for in-stock items the customer is buying that day |
| Special Order | A special-order-type draft — links into the Special Orders workflow for vendor PO + arrival tracking |
| Layaway | A layaway-type draft — opens directly into the Layaway plan-builder UI in POS |
Pick a type and submit. BridalOp:
- Creates a draft Order of the chosen type
- Copies the customer, location, tax rate, and customer/internal notes from the quote
- Copies every line item verbatim — product, variant, description, qty, unit price, and per-line discount all carry over
- Sets the quote's status to Converted and links the new order via
converted_order_id - Logs the conversion to the quote's activity feed (with the order type and order number)
- Redirects you straight to POS with the new order pre-loaded —
/pos?order={new order id}— so you can take payment, schedule the layaway, or attach the Special Order to a vendor PO without re-entering anything
A quote can only be converted once. After conversion the Convert to Order button is replaced with a link to the resulting order.
Convert to Invoice
The Convert to Invoice button (also shown when a quote is Accepted) creates a draft Invoice instead of an order — useful when the customer wants a payment link they can settle online over time, with a public payment portal, payment schedules, or auto-charge.
The conversion:
- Creates a draft Invoice with the quote's customer, location, tax rate, and notes
- Copies every line item from the quote
- Stores a link from the quote to the new invoice (
converted_invoice_id) so you can navigate back and forth
Unlike Convert to Order, this does not flip the quote's status to Converted — the quote stays Accepted, and the link to the invoice appears on the actions card. This means a quote can be turned into an invoice OR an order — pick the path that fits the deal.
Settings
Two quote-wide defaults live under Settings > Quotes:
| Setting | Description |
|---|---|
| Default Expiration Days | How many days from creation new quotes expire by default. Per-quote override always wins. |
| Default Customer Notes | Boilerplate text pre-filled into the Customer Notes field of every new quote (e.g., return policy, delivery timing, deposit expectations). |
The Quote Sent email template is editable under Settings > Email & SMS Templates — same as every other transactional email.
Permissions & Module
- Module gate: Quotes is controlled by the
quotesmodule under Settings > Modules. Default is on. Disable it to hide Quotes from the sidebar entirely. - Permission: access to the Quotes pages is gated by the existing
orders.viewpermission — staff who can already see Orders can also see Quotes. There is no separate Quotes permission today.
Where Quotes Appear
- Sidebar > Sales — the main Quotes list
- Activity feed entry on the source quote whenever it's converted to an order
- Linked order — every order created from a quote stores its source quote, and the quote stores the resulting
converted_order_id - Linked invoice — same idea for the Convert to Invoice path
- Notification bell — Owners, Managers, and the quote creator get an in-app + email notification when a customer accepts a quote

