Highlights
A persistent customer CRM. SetSale now has a dedicated customer-management workspace built around reusable customer and service-address records. You can import and search customers, manage their details and addresses in one place, and quote creation is now anchored to those customer entities.
Draft quotes. Salespeople can mark incomplete quotes as Draft. Draft quotes stay editable, pause follow-up emails, and keep customer presentation and share links unavailable until the quote is shared or moved back to Open.
A company audit log. Owners and admins can review a record of high-risk activity in Settings: quote edits with before-and-after detail for systems, option pricing, equipment, address, status, and owner, plus quote creation, sharing, homeowner checkout, and quote closures, as well as public API, webhook, and billing events. The log is append-only, records allowlisted fields only, and leaves customer contact details and integration noise out.
Bulk management and spreadsheet imports. Select multiple services, supplies, and upgrades to delete in bulk, and export price-list spreadsheets that match the existing import format. Contractor owners can also bulk-import rebates from a structured spreadsheet with a preview of new, updated, unchanged, and invalid rows.
Better new-team onboarding defaults. Fresh contractor teams now start with gross-margin job costing plus refreshed repair and add-on catalogs with richer content, media, pricing, and auto-add rules.
Improvements
Flat-dollar commission rules. A commission rule can now pay a fixed dollar amount instead of a percentage of revenue. Switch any rule between dollars and percent directly in Commission settings.
Warranty coverage for every ductless head. Multi-head ductless systems previously covered only the outdoor unit and the first indoor head. SetSale now prices, carries through checkout, and registers an additional-head warranty for every extra indoor unit against its own serial number. All agreements for a quote group under a single Warranty agreements button that lists the main system, Head 2, Head 3, and so on with each agreement number.
More precise auto-add rules. Auto-add rules for supplies, add-ons, and rebates can now be targeted by system size, ductless BTU, and system configuration.
Services Included on the signed agreement. Newly generated customer agreement PDFs now list the services bundled into a replace option under Equipment Details, matching what already appears in the proposal PDF and at checkout. Rows stay lean, and repair quotes continue to show Repair Services only.
Custom checkout confirmation next steps. Companies can customize the install-scheduling copy homeowners see after checkout and in purchase confirmation emails, so the message matches each contractor's process.
Richer proposal equipment displays. Proposal carousels now support accessory equipment such as TXVs, heat kits, generators, switches, whole-house fans, humidifiers, and dehumidifiers when images are available, and the furnace slide now compares Single-Stage, Two-Stage, and Modulating furnaces.
Narration on the opening slide. Hero-slide audio now gets the same manual playback and caption controls available through the rest of Slides mode, so narration added in the editor is reachable in the Present flow. Hero stays clean when it has no audio, and Scroll mode is unchanged.
Stronger API integration contract. Webhook payloads now include versioning, contractor won-quote webhooks include internal quote notes, API key tables show who created each key, and key creation and revocation are captured in the activity trail.
Faster quote configuration for labor hours. A new Copy across tiers button next to labor hours copies the value to your other tiers, matching the shortcut already available for discounts, add-ons, and services.
Quote lists can be filtered by owner, and quote creation supports choosing the right service address earlier, including from the empty quote-list flow.
Distributor template-set assignments are easier to roll out. Distributors can explicitly save newly assigned contractors, review who will be notified, and personalize a message for each contractor before sending it.
ServiceTitan deep links for Enterprise Hub. Teams can set their own ServiceTitan tenant portal URL in integration settings so "View in ServiceTitan" links open on their tenant host instead of the default go.servicetitan.com.
Clearer ServiceTitan sync guidance. SetSale surfaces safe, actionable messages for common ServiceTitan setup or permission issues instead of exposing raw integration errors.
Smaller touches. More descriptive, localized browser page titles across the app; clearer scroll cues in the customer activity feed; and adding a customer tag now prefills the tag name from what you searched.
Fixes
Closing (declining) a quote now requires the emailed share link or a signed-in team member, so quotes can no longer be marked lost by anyone who knows the internal id. Old decline links show a clear "link no longer valid" message.
Cash, Installment, and Palmetto customer totals now stay consistent on quotes that use a margin override, and the Cash Original Price no longer mixes pre-discount revenue with post-discount tax. Closed and won quotes keep their stored totals.
Palmetto financing accounts resync when customer or service-address details change on the customer pages, including after a customer or address merge. Won quotes now freeze the customer and address captured at signing, so the quote page, contract PDF, reporting, and webhooks show the signed details and historic deals are no longer patched.
The homeowner Palmetto credit-application link is no longer included on public pages, and the credit-application email button renders with correct spacing.
Financing is no longer offered on a tier set to "No installment plan" — the phantom plan card is gone and checkout refuses an installment plan the tier never captured. Cash and promotional checkouts are unaffected.
Changing install supplies or upgrades no longer saves the quote form and refreshes state twice.
Uploading an empty PDF now shows an actionable message instead of failing as a server error.
Two more ServiceTitan failures now name the remedy instead of a generic error: an unmanaged technician, and a missing Cost of Sale account that can be selected in SetSale's ServiceTitan integration settings. Unknown failures still use the safe generic message, and vendor stack traces stay private.
Signed agreement PDFs now render formatted checkout terms correctly, including headings, lists, tables, numbered sections, and encoded characters.
Deleting a quote now shows a clearer permanent-action warning in both the quote editor and the dashboard list.
Sharing a quote to an invalid phone number now shows actionable, localized guidance instead of a generic error.
Large ServiceTitan equipment mappings no longer fail; requests are batched to stay within URL-length limits.
Distributor price sync now updates the distributor-managed equipment record when duplicate equipment models exist, and system-template matchup selections no longer reset the table to the first page.
Customer forms now make the email-or-phone requirement explicit instead of labeling each field as optional, and adding a new service address while editing a quote keeps you on the quote and selects and persists the new address.
Fixed a bug that was preventing editing equipment model lines.
Maintenance
We also completed behind-the-scenes work: reduced quote-creation contention for faster, more reliable quoting; safer distributor price imports; financing page polish; equipment model-line image processing moved to background jobs so content managers can keep working; faster distributor dashboard queries and equipment import status fixes; new internal operations, enterprise contract, and reporting APIs; expanded logging and tracing; dependency and security patches; and build stability and security-review automation.
