Run a Quote Campaign
Send one priced quote to every customer in a batch — renew last season's book with an increase, or quote a new service to a segment — with a review and a pre-send checklist before anything goes out.
Updated September 14, 2026
A quote campaign sends one priced quote to every customer in a batch. Most companies run one each season to renew their whole book at a new price; some run them to offer a service to a segment. At the end of this playbook you will have a batch built, checked, approved, and sent — and a page that shows how many customers viewed, accepted, or declined.
Before you start
- Prices to carry. A renewal campaign carries what each site paid on its most recent priced contract for the work type. If those contracts were never in OpsVara, price from the rate card or a template instead.
- A renewal increase, if you want one company-wide. Set it per work type under Sales and BillingPricing in the Renewal pricing card. You can also set a figure on the campaign itself, so this is optional.
- Quote email switched on. Under SettingsCustomer Notifications, Quote sent must have email (or SMS) enabled, or the pre-send checks will stop you.
- A default quote template for the work type, under SettingsQuote Templates. The campaign uses its line items, its service term, and its invoice schedule.
1. What & When
Open Sales and BillingCampaigns, stay on Quote Campaigns, and click New Quote Campaign. The builder has five steps; the panel on the right always shows the campaign as it stands, including a live count of matching customers.
Pick the purpose
Renew Last Season's Customers prices from each customer's prior contract and skips anyone without one. Quote A Service To A Segment prices from the template and skips anyone already under contract for the season. The purpose sets the defaults on the next steps; you can change any of them.
Pick the work type and season
The season fills in from the work type's own calendar: once this year's season has opened, the suggestion is next year. The line under the field reads the season's dates. If you choose a different year, the builder offers the suggested one — take it unless you know why not.
Name it
The name auto-fills as Work type, season, renewals and stops changing once you type. Customers never see it.
The season is the most common mistake
A renewal built for the season that is already running skips almost everyone as Already under contract for this season. If the roster comes back nearly empty, check the season first.
2. Who Gets A Quote
The banner at the top shows how many customers match, and updates as you change filters. Filter by customer list, customer type, tags, exclude-tags, and customer years; aquatic companies can also segment by site type. Exclude recently quoted leaves out anyone sent a quote inside a window.
Under Guardrails, Skip Customers Already Under Contract for season YYYY drops anyone who already holds an agreement for the season you are quoting. It looks at that season, not at today, so a contract ending this month never blocks next season's quote. Two skips are always on: customers who already have a draft or sent quote for the season, and customers with no email on file. Skipped customers still appear on the roster with a price, marked with the reason.
3. How To Price It
Choose where each quote's prices come from:
| Option | What it does | Use it for |
|---|---|---|
| Last Season's Price Per Site | Carries what each site paid last term, then applies your increase | Renewals |
| Rate Card At Each Site's Tier | Prices every line from your rate card at the tier the site is on | New business, tiered pricing |
| Template Prices (Same For Everyone) | The template's prices, unchanged | Flat offers |
On Last Season's Price, four more controls appear:
- Renewal Increase — Work Type Default uses the percentage under Pricing; A Percentage For This Campaign or A Dollar Amount Per Site applies to this batch only and leaves Settings alone; No Increase renews at exactly last season's figure.
- Round Each Price — keep cents, or round to the nearest $1, $5, $10, or $25. Applied after the increase, so $1,262.50 can go out as $1,265.
- If A Customer Has No Prior Contract — skip them, or price them from the template or rate card instead.
- Adjust For A Partial Prior Season — when a site's first visit last season was late, raise its carried price to a full-season rate before the increase. See Price a Renewal Campaign From Last Season.
The Example line under the controls shows the arithmetic on a $1,200 site as you change them. Click Price 5 Example Customers to price the first five customers in your audience exactly the way the roster will, with last season, this quote, and the change percent.
Order of operations
A carried price is de-prorated first, then raised by the percentage, then by the flat amount, then rounded. A flat amount lands once per site, on the site's first service line, so a pool with two service lines does not get two increases.
4. Quote & Message
The email customers receive is the reason the quote is arriving. Write a Subject and Message; the chips insert tokens for the customer's first name, your company name, the quote number and total, the accept-by date, the season, and the work type. The preview renders them with sample values. Click Send Me A Test to receive it with a [TEST] banner. Leave both blank to use your standard quote email.
On the quote itself holds the customer notes printed on the PDF and portal quote, the Accept Quote By date (blank means 30 days from the day each quote sends), and, on pond work types, the billing cycle. Invoice Options and Internal Notes are collapsed; expand them when the batch bills differently from your defaults or you want staff-only notes on each quote.
5. Review & Build
Four cards summarize the campaign, each with an Edit link back to its step. Choose whether the batch sends As Soon As I Approve The Roster or On A Date And Time I Choose; either way, nothing sends until you approve. Click Build Quote Roster.
6. Review the roster
The roster prices every customer and lands in review. Read it top to bottom:
- The tiles. Ready To Send with the batch value; on a renewal, Last Term → This Batch with the percent change and the dollar figures across every customer who has a prior price; Needs Attention, which filters the table to rows worth a look; and Left Out.
- Needs Attention. Rows are flagged Up More Than 25%, Lower Than Last Term, $0 Quote, No Prior Price Found, or A $0 Line. Use Show to filter by one flag and Sort by Biggest Increase First.
- Fix prices. Expand a row and type a unit price, or select rows and use Adjust Prices… to change them by a percentage, a dollar amount, a set figure, or a rounding step. Permit and pass-through fees are never moved. Every changed row shows Edited and the built price beneath it; Reset To Built Prices puts it back.
- Drop or add people. Exclude a row, or Include Anyway on a row the roster skipped as already quoted or already under contract.
- Export CSV if you would rather review in a spreadsheet.
7. Approve
Review & Approve runs the pre-send checks and shows them before the button:
| Severity | Check | What to do |
|---|---|---|
| Blocks | Nothing To Send | Include someone, or change the audience and rebuild |
| Blocks | Quote Notifications Are Switched Off | Turn on email under Settings → Customer Notifications |
| Blocks | Accept-By Date Is Before The Send | Move the date on the campaign, or clear it |
| Warns | Customers with no email · $0 quotes · big increases · decreases · fallbacks · less than a week to accept | Show These Rows, fix or exclude, reopen |
| Informs | Excluded and skipped counts · no terms document | Optional |
The dialog also shows the exact subject and message the first customer will read, and lets you send now or keep the scheduled time. Approve locks the roster and books the send.
8. Verify it worked
- The campaign page shows a timeline — Created, Roster Built, Approved, Sent — with times, and How The Quotes Are Doing: sent, viewed, approved, declined, still open, with values.
- Open These Quotes lists them under Sales and BillingQuotes with a chip naming the campaign.
- On the roster, each sent row carries a quote badge (Sent, Viewed, Approved) and a link to the quote.
- If any rows failed, the campaign page offers Retry N Failed, which re-sends only those.
Troubleshooting
| Problem | Cause | Fix |
|---|---|---|
| Roster is nearly empty, everyone Already under contract for this season | The season is the one already running | Edit the campaign, pick next season, Save & Rebuild |
| Everyone fell back to template prices | No priced prior contract for the work type | Check the contracts exist for that work type; otherwise price from the rate card |
| Needs Attention shows dozens of Up More Than 25% | Prorated prior seasons are being grossed up, or the increase is large | Expand a row to read the arithmetic; turn off the partial-season adjustment and rebuild if it reads wrong |
| Approve is disabled | A blocking check | Read the red item in the dialog; each names its fix |
| Customers received the generic quote email | Subject and Message were blank | Fill them on Quote & Message; the campaign email beats the tenant template for that send |
| I changed the increase but prices did not move | Only Save Changes ran | Any pricing or audience change turns the button into Save & Rebuild Roster; confirm the rebuild |
Frequently asked questions
Does building a campaign send anything?
No. Build Quote Roster prices every customer and stages the batch for you. Nothing reaches a customer until you click Approve on the roster and pass the pre-send checks.
Which season should I pick for renewals?
The one you are selling. The builder suggests it from the work type's own season dates — once this year's season has opened, next year — and warns if you pick something else. A renewal built for the current season would skip everyone as already under contract.
Can I raise prices by a different amount for this campaign without changing Settings?
Yes. On How To Price It, choose A Percentage For This Campaign or A Dollar Amount Per Site. Your Pricing settings are untouched. **Work Type Default** uses the percentage configured under Sales and Billing → Pricing.
Why does one quote show Up More Than 25%?
Its total rose more than a quarter over last term, usually because last season was prorated or a price was corrected. Expand the row to read the arithmetic before you approve.
A customer got the quote but the email said the generic "Your quote is ready". Why?
The campaign's Subject and Message on Quote & Message were blank, so the standard quote email went out. Fill them in, or set a tenant-wide template under Settings → Customer Notifications.
Some quotes failed to send. Do I rebuild?
No. Open the campaign and click Retry N Failed. Only the failed rows are re-sent; everyone who already received a quote is left alone.
Where are the quotes a campaign created?
On the campaign page, Open These Quotes goes to Sales and Billing → Quotes filtered to that campaign. Each roster row also links to its quote once sent.
Related guides
- Price a Renewal Campaign From Last SeasonCarry last season's per-site prices into a quote campaign, set the increase and rounding for the batch, correct for customers who signed up late, and read each site's history before you approve.
- Edit a Quote Campaign Before It SendsChange a campaign you have already built — what you can fix without touching the staged prices, and what forces a rebuild.
- Set Invoice Options on a Quote CampaignChoose when the contracts from a quote campaign create invoices, and understand which template the schedule comes from when you have more than one.
- Send a QuoteBuild a draft quote from your price book, send it to the customer, and record a yes from the portal or the phone.
- Automated Quote and Lead Follow-UpsFollow up on every sent, unsigned quote and every new lead automatically, as a note from the rep, until the customer signs, replies, or is quoted.