Price-book sync
Open Settings → Integrations → Pricebook Sync in Thermal →
What it's for
Price-book sync connects an external catalogue source and reviews its
changes before they touch your live price book. Every refresh — manual or on
its own schedule — produces a frozen preview (creates, updates, skips,
conflicts) that an owner reviews and explicitly approves before anything is
imported into pricebook_items. Nothing is ever auto-applied from a preview.
Only the in-repo demo fixture source is wired up today; the first live
source will be a price-book content provider or a supplier feed, a later
unit of the same epic. Competing field-service systems (ServiceTitan,
Jobber, Housecall Pro, and similar) are a data import source, not a
live-sync source — bring their data in through the Data Import wizard
instead. Reach this screen from Settings → Data and connections →
Integrations, at /settings/integrations/pricebook-sync.
Tabs
This screen has no tabs. It's a single page: a Connections panel above a Sync runs table.
Panels and controls
Connections
Connect fixture appears when the org has no active demo-fixture connection; it stores the demo catalogue (labor, a part, a material, and a fee) as that connection's credentials and marks it connected. Each connected row shows the source name, a connected/error/disconnected status badge, and its account reference. Manual refresh starts a new preview run against that connection's adapter. Disconnect (behind a confirmation) clears the connection's stored credentials and disables its schedule — it never rolls back items already imported.
Sync runs
Every run for the org, newest first: source, trigger (manual/scheduled), status, a diff summary (creates/updates/skips/conflicts) once a preview exists, and started/finished times. A row awaiting review gets an Approve & import action; a failed row gets Retry, which reuses the same run instead of starting a new one. A run's error message is shown, never the raw upstream error text.
What it accepts
| Field | Format | Required | Rule |
|---|---|---|---|
| Connection to refresh/retry | An existing connection id on this org | Yes | "Missing connection id." if absent; a connection from another org resolves as not found |
| Run to approve/retry | An existing run id on this org | Yes | "Missing run id."/"Missing run or connection id." if absent |
Starting a refresh while one is already active for that connection is refused: "A sync is already running for this connection." Approving or importing a run that has since moved on is refused: "That run has already moved on — refresh the page and try again." A connection or run that no longer exists (or belongs to a different org) reads as "That connection or run no longer exists."
How to configure it
- Nothing in Settings changes how this screen behaves — it is the source of truth for its own connections and runs, not a view onto configuration held elsewhere.
- What it configures downstream: an approved and imported run's diff is
the only thing that writes to
pricebook_items— every classified item (added, changed, unchanged, conflicting) also gets one append-onlypricebook_sync_auditrow, so an import's provenance is always traceable back to its run. - A scheduled refresh (when a connection's schedule is enabled) drives the exact same preview/import lifecycle as Manual refresh on this screen — it just runs on a cron instead of a click, and still requires the same manual approve step before anything imports.
Who can see it
This screen sits behind the Integrations area.
Owners can open it. Office managers and dispatchers and technicians cannot. The gate is checked on the server, not just hidden in the sidebar, so a direct link does not get around it.
The full role matrix is on Roles & permissions.