Quotes — price a job and get customer sign-off before the work starts
Who it's for
Owners and managers build and send quotes. Designers may access quotes from the billing tab while pricing design work. Front-desk staff with the Billing & Quotes permission can create quotes from an existing customer record or directly from a job.
Customers interact with quotes entirely from a public link — no login required. They can view itemized pricing and click a single button to approve.
Where it fits
Quotes live between the Lead and Approved stages in your workflow. After a customer inquiry comes in (from a phone call, walk-in, or the public request-a-quote form), you create a quote, fill in materials and labor, and send it. When the customer approves it you convert it to a job and proceed to scheduling, design, and production. See workflow-map.md for the full lifecycle.
Overview
A Wraptor quote is a branded, itemized price sheet with materials, labor, subtotal, tax, and a total. Every quote gets a unique number in the format SO-00001, SO-00002, and so on. When you mark a quote as Sent, Wraptor generates a private public link (no login required) that you can email to the customer. The customer opens the link, reviews the line items, and clicks Approve Quote to accept.
Once approved, you can convert the quote to a job with a single click. Wraptor carries over the customer, vehicle, wrap type, and title, creates a new JOB-XXXX record, and links the quote to it permanently so you can always trace back to the original price.
Quotes also support templates — reusable line-item sets you build once for common jobs (e.g., "Full Wrap — Car," "PPF Front End") and apply with a single click to pre-fill a new quote.
Screens & navigation
Quote list (Billing → Quotes tab, /billing?tab=quotes)
The Billing page has a Quotes tab that lists all quotes for the shop, ordered newest first. Each row shows quote number, status badge, customer, vehicle, wrap type, and total. Click any row to open the quote detail.
New Quote dialog
Click the New Quote button (or use the + in the billing tab) to open the dialog. Select or create a customer, optionally select or create a vehicle, choose a wrap type, add a title, and add notes. The dialog can create a brand-new customer and vehicle on the fly — no need to leave the billing area.
Quote detail page (/quotes/[id])
The full quote editor. It includes:
- Header — quote number, status badge, shop logo (if configured), PDF download button, and the Actions dropdown.
- Quote Builder — the main editing surface. Contains:
- Project fields: title, attention (attn), vehicle description, material type label.
- Materials panel — add materials from your rate card; each material has SKU, name, description, quantity (sq ft), and unit price. A link to inventory lets you associate a material line with an inventory item.
- Labor panel — add labor rows with type, hours, hourly rate, and a comment field.
- Tax zone selector (Standard, UEZ, Tax Exempt).
- Deposit toggle — enable/disable, set deposit percentage.
- Quote theme selector.
- Terms & conditions text box.
- Running totals: subtotal, tax amount, and total.
- AI Price Suggestion panel — click to get an AI-suggested price range and line items based on wrap type, vehicle type, and estimated sq ft, informed by your shop's historical pricing data.
- Material Calculator — a panel-by-panel sq-ft calculator using the vehicle template (if assigned), supporting Full, 3/4, or custom coverage to help you calculate material quantity precisely.
- Quick Add Inventory — if a material on the quote is not yet in your inventory, a button lets you create an inventory item and link it without leaving the quote.
- Template picker — click "Apply Template" to replace the current line items with a saved template.
- Import from PDF/image — upload a quote PDF or image and the AI parser extracts line items automatically. It reconciles the parsed subtotal against the document's stated total and reports any discrepancy.
Actions dropdown (on quote detail)
| Action | Available when |
|---|---|
| Mark as Sent | DRAFT status |
| Mark as Approved | DRAFT or SENT status |
| Mark as Rejected | SENT status |
| View Public Link | Quote has a public token |
| Create Job | APPROVED status and no job yet linked |
| Delete Quote | Any status |
Public quote view (/quote/[publicToken])
A no-login page the customer sees when you share their quote link. Shows the shop logo, quote number, customer name, vehicle, project type, itemized line-item table (description, quantity, unit, unit price, total), subtotal, tax, and grand total. If the quote is in SENT status, an Approve Quote button is shown. After approval, the button is replaced with a confirmation message and the approval date.
Public touchpoint: request-a-quote
Request-a-Quote page (/request-quote)
A fully public form embedded at your shop's /request-quote URL. No login required. Visitors fill in:
- Contact information: name (required), email (required), phone, company.
- Vehicle information: year, make, model, color, vehicle type (Car, SUV, Truck, Van, Trailer, Bus, Boat, Other).
- Wrap type (Full Wrap, Partial Wrap, 3/4 Wrap, Color Change, Commercial Fleet, Lettering, Spot Graphics, Decals, PPF, Window Tint, Chrome Delete, Stripes, Other).
- Project details: free-text description of the project.
When submitted, Wraptor:
- Checks for spam via a honeypot field (silent pass for bots).
- Finds or creates a customer record using the visitor's email.
- Creates a vehicle record (or a placeholder "TBD" vehicle if no make/model provided).
- Creates a Job in
LEADstatus with the visitor's message as a note. - Sends a confirmation email to the visitor with their reference number.
- Sends a notification email to the shop team.
The visitor sees a thank-you screen with a JOB-XXXX reference number. The shop team then opens the lead in the Jobs board and creates a quote against it.
Note: the request-a-quote form does not create a Quote record directly — it creates a Job at LEAD status. The shop staff then builds and sends a quote from that job.
Capabilities
Building quotes
- Create a quote from the Billing tab, from a customer record, or from a job detail panel.
- Set title, wrap type, notes, and attention (contact name) at creation time; edit all of these from the quote builder.
- Add and reorder material line items (SKU, name, description, quantity in sq ft, unit price per sq ft).
- Add and reorder labor line items (type/activity, hours, hourly rate, comment).
- Each line item total = quantity × unit price, rounded to cents.
- Subtotal = sum of all line item totals.
- Tax is calculated based on the selected tax zone: Standard (6.625%), UEZ (3.3125%), or Tax Exempt (0%). If the customer is marked tax-exempt in their customer record, tax is always 0 regardless of the zone.
- A custom tax zone (
"custom") is set automatically when importing from a PDF that carries its own tax rate. - Enable or disable deposit. When enabled, set the deposit percentage (default 50%).
- Choose a quote theme (
"professional"is the default). - Add terms & conditions text (or use the shop's default terms).
Templates
- Create reusable templates from Settings → Quote Templates (or directly from the billing area).
- Each template has a name, optional wrap type and vehicle type hints, and a list of line items.
- Apply a template to a quote to replace all current line items with the template's items. Wrap type is also updated if the template specifies one.
- Edit and delete templates; changes do not affect existing quotes.
AI price suggestions
- Open the AI Price Suggestion panel on a quote, provide the wrap type, vehicle type, and estimated sq ft, and request a suggestion.
- The panel returns a suggested set of line items and a historical price range (min, max, avg) from your shop's completed jobs.
- Suggestions are informational; apply them manually to the quote if desired.
Import from document
- Upload a quote PDF or image (PNG, JPEG, etc.) to auto-fill line items.
- The AI parser extracts each line item's description, category, quantity, unit, and unit price.
- After extraction, Wraptor recalculates the quote totals and reports a reconciliation: whether the parsed subtotal matches the document's stated subtotal, and the difference if not.
- Use this to bring in a supplier quote or a hand-written estimate.
Sending and customer approval
- Mark a quote as Sent from the Actions dropdown. This sets the
sentAttimestamp. - Click "View Public Link" to copy or open the customer-facing URL (
/quote/[publicToken]). - Share the link with the customer by email, text, or any channel.
- The customer opens the link and clicks Approve Quote. This sets status to APPROVED and
approvedAtto the current timestamp. - Staff can also manually mark a quote as Approved from the Actions dropdown (no customer action needed).
Converting to a job
- Once a quote is APPROVED and not yet linked to a job, the Actions dropdown shows Create Job.
- Click it to create a new job. The job inherits the customer, vehicle, wrap type, and title from the quote. If the quote was APPROVED, the job starts in APPROVED status; otherwise it starts as LEAD.
- The quote and job are permanently linked. The job number appears on the quote; the quote appears in the job's Quotes & Invoices tab.
- A vehicle must be assigned to the quote before a job can be created.
PDF download
- Click the PDF button on the quote detail page to download a PDF of the quote (
/api/quotes/[id]/pdf).
Deleting quotes
- Delete a quote from the Actions dropdown. If the quote is linked to a job, the link is cleared (the job is not deleted). This action is permanent.
Default terms
- Set default terms & conditions text in Settings. This text pre-fills the terms box on new quotes. Individual quotes can override it.
Step-by-step tasks
-
Create a quote from scratch
- Go to Billing and click the Quotes tab.
- Click New Quote.
- Select an existing customer from the dropdown, or click the + icon to create a new customer (company name, email, phone, address).
- Optionally select a vehicle linked to that customer, or click + to add a new vehicle (make, model, year, vehicle type).
- Fill in a title (e.g., "Full Wrap — 2023 Ford F-150"), choose a wrap type, and add any notes.
- Click Create Quote. Wraptor opens the quote detail page.
- In the Quote Builder, add materials (sq ft, unit price) and labor (hours, hourly rate).
- Check the totals, adjust the tax zone if needed, and toggle the deposit setting.
- Optionally add terms & conditions.
- Click Save.
-
Apply a template to a quote
- Open a quote in the quote builder.
- Click Apply Template (in the template picker area of the builder).
- Choose a template from the list (e.g., "Full Wrap — Car"). The list shows each template's name, wrap type, and vehicle type.
- Confirm the prompt: applying a template replaces all current line items.
- The quote's line items are replaced with the template's items and totals are recalculated. Edit individual line items as needed for this specific job.
-
Send a quote to a customer
- Open the quote and verify the line items, totals, and customer are correct.
- Click Actions → Mark as Sent. The status changes to SENT and
sentAtis recorded. - Click Actions → View Public Link. The customer-facing URL opens in a new tab.
- Copy that URL and send it to the customer via email, text, or any channel.
- The customer opens the link and reviews the itemized quote. If they are satisfied, they click Approve Quote.
- The quote status changes to APPROVED and a timestamp is recorded.
-
Manually approve a quote and convert it to a job
- Open the quote in the quote detail page.
- Click Actions → Mark as Approved (if you have verbal approval and don't need the customer to click the link).
- Once the status shows APPROVED, click Actions → Create Job.
- Wraptor creates a new job (
JOB-XXXX), links it to the quote, and navigates you to the job detail panel. - From the job, proceed to scheduling, design, and production.
-
Import a supplier quote from PDF
- Open a quote in the quote builder.
- Scroll to the Import from PDF/Image section and click Upload.
- Select the PDF or image file from your computer.
- The AI parser extracts line items. After a few seconds, the results appear: each extracted item is added to the quote with its description, category, quantity, unit, and unit price.
- Review the Reconciliation report. A green "Matched" means the parsed subtotal is within $0.02 of the document's stated total. A red "Mismatch" means you should review the line items manually.
- Edit or remove any items as needed, then save.
-
Create a quote template for a common job type
- Go to Settings → Quote Templates (accessible from the settings menu).
- Click New Template.
- Give the template a name (e.g., "Full Wrap — Sedan"), choose a wrap type and vehicle type to tag it for easy filtering.
- Add line items: description, category, quantity, unit, unit price.
- Click Save Template.
- The template is now available in the template picker on all quotes for this shop.
-
Handle a request-a-quote submission
- A customer visits your
/request-quotepage and fills in their contact info, vehicle, wrap type, and project description. - After submitting, they see a thank-you screen with a
JOB-XXXXreference number. - In Wraptor, open the Jobs board. The new lead appears in the LEAD stage.
- Open the job. The customer's message is saved as a note.
- From the job detail, create a quote: click the Quotes & Invoices tab and use New Quote, or go to Billing → New Quote and select this customer and vehicle.
- Build the quote, send the link to the customer, and wait for their approval.
- A customer visits your
Settings & permissions
Who can access quotes
The billing permission slug ("Billing & Quotes") controls access to the quotes area. It is granted by default to:
- Manager — full access (create, edit, send, approve, delete, manage templates).
- Designer — has
billingpermission; can view and edit quotes. - Production — does not have
billingby default; cannot access the Billing tab. - Installer — does not have
billingby default; cannot access the Billing tab.
Owners always have full access. Custom roles can be granted or denied the billing permission in Settings → Team.
Tax zones Set the shop's default tax rate in Settings → Shop. The default rate is applied to new quotes. Individual quotes can override the zone (Standard, UEZ, or Exempt).
Default quote terms Configure default terms & conditions text in Settings. This pre-fills the terms box on every new quote. Staff can edit the terms on an individual quote without affecting the default.
Quote themes
The quoteTheme field on each quote controls the PDF appearance. The default is "professional". Additional themes may be available depending on your plan.
Plan tiers
Quotes are available on all paid plans (Solo, Starter, Pro, Business, Franchise). The free_claim tier has no access to the operational dashboard including Billing. There are no per-quote count limits enforced by the plan.
Multi-location On plans with multiple locations (Pro and above), quotes are scoped to the shop but the resulting job is assigned to the shop's default location.
Tips & common pitfalls
- Quote number format: Quote numbers are formatted
SO-00001. This is a sales-order style prefix. You can edit the quote number field if you need a custom format, but keep it unique. - Vehicle is required to convert to a job: You can create and send a quote without a vehicle, but you cannot click "Create Job" until a vehicle is assigned. Assign one from the quote builder before sending if you want the conversion to be frictionless.
- Approved ≠ invoiced: Approving a quote does not create an invoice. An invoice is a separate step in Billing → Invoices, typically after the work is done.
- Deleting a quote unlinks it from the job: Deleting a quote removes it permanently but does not delete the job it was linked to. The job simply loses the quote reference.
- Templates replace, not merge: Applying a template deletes all existing line items on the quote and replaces them. Save a copy of your current items somewhere else first if you might want them back.
- PDF import reconciliation: If the reconciliation shows a mismatch, check for items the AI may have missed (e.g., a discount row or a tax line it included as a line item by mistake). The AI is instructed to exclude tax and discount rows from line items, but complex documents may trip it up.
- Request-a-quote creates a job, not a quote: Staff sometimes expect a Quote record to appear in Billing after a web form submission. The web form creates a Job (LEAD status) and a customer + vehicle. Staff must then create the quote manually.
- Tax exempt customers: If a customer record has the tax-exempt flag set, the quote automatically uses a 0% tax rate regardless of the selected tax zone. Check the customer record if tax is not calculating as expected.
- AI price suggestions require historical data: The AI price panel shows richer suggestions once your shop has completed jobs with pricing snapshots. Brand-new shops will get rate-card-based suggestions only.
Related modules
- Jobs — quotes feed into jobs; a quote converts to a job when approved.
- Invoicing & billing — invoices are separate from quotes; creating an invoice is a distinct step after the job is complete.
- Customers — every quote must belong to a customer; customer records show all their quotes.
- Vehicles — vehicles are optionally linked to quotes; required for job conversion.
- Proofs — proofs are sent from a job, not a quote; quote approval comes before proof.
- Inventory — quote line items can be linked to inventory items; material costs inform the AI price panel.
- Workflow map — shows where quotes fit in the lead-to-invoice pipeline.
- Personas — details how managers, designers, and customers interact with the quote flow.