Loading
Loading
Most franchisors write brand controls into the FDD and then hope. SalesThumb enforces two of them at the server: lock a franchisee's brand color and the picker is disabled — and the same save is rejected server-side no matter which client sends it; set a network minimum price and a franchisee's quote can never net less than that floor after discounts (the system quietly re-caps the discount rather than rejecting the sale). On top of that, an auditor from either side — HQ or the shop's own staff — runs a structured PASS/FAIL/N-A checklist during a visit, attaches evidence photos, and every FAIL becomes a tracked corrective action with an assignee and due date; once every item has a result, the shop and HQ each sign off independently instead of a single auditor's word closing it out.
Brand settings
Downtown Location · franchisee account
Picker disabled · color is governed by the franchise brand standard.
Price locked · name, description, and taxable flag stay editable.
shop.update({ brandingJson: { primaryColor: "#FF3B30" } })
← FORBIDDEN · brand colors are locked by HQ
catalog.updateService({ defaultPriceCents: 27900 })
← FORBIDDEN · service pricing is locked by HQ
Enforcement runs on the same shop.update call the settings UI uses — there's no separate client-side check to route around.
Features, zoomed in
Three capabilities built specifically for the day-to-day of a working shop.
Deep dive · 01
HQ → Branding → 'FDD Compliance Locks' → 'Lock brand colors.' Once enabled, the shop-settings save endpoint rejects any attempt to change primaryColor/accentColor for that org's shops, regardless of which client sends the request. Logo uploads stay allowed. Toggling the lock writes an audit-log entry; there's no separate violation ledger — the rejection itself is the enforcement.
Brand settings
Downtown Location · franchisee account
Picker disabled · color is governed by the franchise brand standard.
Price locked · name, description, and taxable flag stay editable.
shop.update({ brandingJson: { primaryColor: "#FF3B30" } })
← FORBIDDEN · brand colors are locked by HQ
catalog.updateService({ defaultPriceCents: 27900 })
← FORBIDDEN · service pricing is locked by HQ
Enforcement runs on the same shop.update call the settings UI uses — there's no separate client-side check to route around.
Deep dive · 02
An auditor — HQ or the shop's own staff — picks a scheduled or completed visit and works through that template's checklist item-by-item (Pass / Fail / N/A), attaching a photo as evidence where it matters. Once every item on the checklist has a result, the shop and HQ can each sign off independently — two separate attestations, not a single auditor's word: the shop's own staff sign from their own compliance page, HQ signs from its side, and each signature records who signed, when, and requires that person's direct membership at that location (or, on HQ's side, org-admin access) rather than a broader role standing in for it. Every FAIL still automatically opens a corrective action the whole org can see — with an assignee, a due date, and a status (Open, In Progress, Overdue, Resolved) — instead of a note that only one auditor remembers.
Compliance checklist + independent sign-off + corrective actions
Screenshot coming soon
What's included
Everything that ships on day one. No feature-gating surprises inside a single plan.
See every angle
Every meaningful view, the path through it, and the moments that matter — so you know exactly what you're buying.
Compliance checklist runner
Once every item has a result, the shop and HQ each sign off independently, and every FAIL becomes a tracked corrective action.
Compliance checklist runner
Screenshot coming soon
Who it's for
What it replaces
How it works
Lock brand colors from HQ → Branding if you want them technically enforced. Set minimum price / max discount rules per service category from HQ → Pricing Rules.
Pick the visit, work through the template's items (Pass / Fail / N/A), attach a photo where it matters. Every FAIL opens a corrective action automatically.
The org-wide corrective-actions list shows Open / In Progress / Overdue at a glance. Resolving one requires a note describing what was fixed.
What this looks like in a shop
Illustrative scenario: An HQ auditor visits a location, works through the standard 12-item checklist on her phone, and two items fail — a missing required signage element and a walkaround-photo step the tech skipped. Both automatically become corrective actions assigned to the shop manager with a due date. Meanwhile, on the pricing side, a franchisee tries to discount a ceramic-coating line below the network floor; the system silently caps the discount at the floor instead of letting the sale go through underpriced.
Questions
Explore more
A cron closes the month automatically — sums each shop's invoiced sales (sent, partially paid, or paid in full), applies each shop's rate, generates itemized statements. Collecting the money is a manual step: a Chase NACHA CSV file you originate through Chase Business Online (Chase accounts only), or payments you record by hand.
One screen shows every service across every shop with a coverage bar (X of N shops carry it). Push a service to the shops missing it — a starting point, not a lock — and set network-wide minimum prices or max-discount caps by category.
Whether you're a solo operator or a franchisor with hundreds of locations, every shop rolls up into one HQ view with consolidated KPIs, centralized catalogs, and push-to-shop pricing and templates.
SalesThumb's 82 reports live in a 14-category sidebar in the app; grouped here by the decision they answer, they sort into 6 clusters. The six: cash & revenue, job & service profitability, team & schedule performance, marketing & lead performance, customer retention & risk, and customer obligations — the reports inside each cluster export individually to CSV.