Thermal
ReferenceSettings & administration

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

FieldFormatRequiredRule
Connection to refresh/retryAn existing connection id on this orgYes"Missing connection id." if absent; a connection from another org resolves as not found
Run to approve/retryAn existing run id on this orgYes"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-only pricebook_sync_audit row, 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.

On this page