Integrations tools
Connect Pipedrive or ServiceTitan so leads, deals and appointments arrive as contacts and events.
- connect_integration
- get_integration
- update_integration
- disconnect_integration
- replay_integration_deliveries
connect_integration
Connect Pipedrive (default: admin token) or ServiceTitan (tenant_id, client_id, app_key, client_secret, environment). ServiceTitan polls customers, customer contacts, memberships and invoices read-only; Customer sync creates contacts and seven crm_* string flags without backfill enrollment. On an existing connection, first enable appointment_job_types through update_integration with force; install job types must be in appointment_job_types. deal_source selects sales jobs; bookings emit crm_lead.created with origin=booking. Connector-owned crm_* keys overwrite CSV/agent values at that customer's next recompute. Credentials are encrypted and never returned. Existing active/error/reconfiguring/recent connecting rows return 409. Environment changes require disconnect/reconnect and change the account. Appointments, deals and leads announce only entities created after activation; timed maintenance and membership windows include the existing book. ServiceTitan maintenance_due_days, maintenance_overdue_days and membership_expiring_days are live editable (see config fields). Staff contacts and consent are managed separately.
providerenum- pipedrive | servicetitan
CRM provider; defaults to pipedrive tokenstring- Pipedrive admin API token; Pipedrive only
tenant_idstring- ServiceTitan tenant ID; required for ServiceTitan
client_idstring- ServiceTitan client ID
app_keystring- ServiceTitan app key from the developer-portal app; encrypted, never returned; required for ServiceTitan
client_secretstring- ServiceTitan client secret; encrypted, never returned
environmentenum- production | integration
ServiceTitan environment; connect only, defaults to production configobjectconfig.appointment_sourceobjectconfig.appointment_source.kindliteralrequired- activity | deal_fields
config.appointment_source.activity_typesstring[]required when kind is activityconfig.appointment_source.date_fieldstringrequired when kind is deal_fieldsconfig.appointment_source.time_fieldstringrequired when kind is deal_fieldsconfig.appointment_source.timezonestringrequired when kind is deal_fieldsconfig.advisor_fieldstringconfig.maintenance_due_daysnumber- Maintenance due window in days; default 30. Live editable.
config.maintenance_overdue_daysnumber- Maintenance overdue window in days; default 0 (off). Live editable.
config.membership_expiring_daysnumber- Membership expiring window in days; default 30. Live editable.
config.tag_typesnumber[]- Allowlisted CRM tags; live editable. Omit to disable tag scanning.
config.job_classesobjectconfig.job_classes.salesnumber[]config.job_classes.installnumber[]config.job_classes.servicenumber[]config.job_classes.maintenancenumber[]config.tradesobjectconfig.trades.hvacnumber[]config.trades.plumbingnumber[]config.trades.electricalnumber[]config.trades.generatornumber[]config.default_tradeenum- hvac | plumbing | electrical | generator | other
config.environmentenum- production | integration
config.appointment_job_typesnumber[]- Required to enable ServiceTitan events (bookings emit crm_lead.created with origin=booking). First enablement on an existing connection uses update_integration with force. Install job types must be in appointment_job_types; only entities created after activation are announced.
config.placeholder_techniciansstring[]- Unassigned technician names; defaults to ["ZUNASSIGNED"]. Frozen with appointment_job_types.
config.deal_sourceobject- Jobs matching listed types OR the estimate minimum emit deal events. Frozen from activation.
config.deal_source.job_typesnumber[]config.deal_source.min_estimate_totalnumberteamstringrequired- Brand/team to act on (slug or id) → X-Cadence-Team. Required — your account key authorizes every brand you own, so this picks which one.
get_integration
Get sanitized provider status, config, failed deliveries. ServiceTitan includes last sync, cumulative backfill counters (duplicate_customer means merged duplicate), failed_with_plan and unresolved technician matches; Pipedrive includes last delivery and unresolved staff. provider=all lists both. ServiceTitan labels include timed windows, job_classes, trades, default_trade and tag_types. Suggestions are returned when no classification or tags are configured, or with suggest=true; suggestions are never applied automatically. No credentials returned.
providerenum- pipedrive | servicetitan | all
Defaults to pipedrive suggestboolean- Request ServiceTitan job class, trade and tag suggestions from cached lookups
teamstringrequired- Brand/team to act on (slug or id) → X-Cadence-Team. Required — your account key authorizes every brand you own, so this picks which one.
update_integration
Replace provider config or change owner SMS attestation. Pipedrive appointment_source/advisor_field are frozen after activation; force returns 202 and drains old work before stopping appointment enrollments and switching config. ServiceTitan maintenance_due_days, maintenance_overdue_days, membership_expiring_days, job_classes, trades, default_trade and tag_types update live without force. Classes and trades classify jobs, appointments and deals; allowlisted tags emit crm_tag.added and maintain crm_tags. Use get_integration suggest=true for suggestions, then confirm them before saving. ServiceTitan appointment_job_types, placeholder_technicians (default ZUNASSIGNED) and deal_source are frozen together; first event enablement on an existing connection also requires force. Teardown waits for unfinished plans and preserves deal/lead watermarks. Environment changes require reconnect. Changing attestation resets the ServiceTitan customer pass so unchanged customers converge; clearing stops future grants. Only the owner or master admin can attest. Staff consent is separate.
providerenum- pipedrive | servicetitan
CRM provider; defaults to pipedrive configobjectconfig.appointment_sourceobjectconfig.appointment_source.kindliteralrequired- activity | deal_fields
config.appointment_source.activity_typesstring[]required when kind is activityconfig.appointment_source.date_fieldstringrequired when kind is deal_fieldsconfig.appointment_source.time_fieldstringrequired when kind is deal_fieldsconfig.appointment_source.timezonestringrequired when kind is deal_fieldsconfig.advisor_fieldstringconfig.maintenance_due_daysnumber- Maintenance due window in days; default 30. Live editable.
config.maintenance_overdue_daysnumber- Maintenance overdue window in days; default 0 (off). Live editable.
config.membership_expiring_daysnumber- Membership expiring window in days; default 30. Live editable.
config.tag_typesnumber[]- Allowlisted CRM tags; live editable. Omit to disable tag scanning.
config.job_classesobjectconfig.job_classes.salesnumber[]config.job_classes.installnumber[]config.job_classes.servicenumber[]config.job_classes.maintenancenumber[]config.tradesobjectconfig.trades.hvacnumber[]config.trades.plumbingnumber[]config.trades.electricalnumber[]config.trades.generatornumber[]config.default_tradeenum- hvac | plumbing | electrical | generator | other
config.environmentenum- production | integration
config.appointment_job_typesnumber[]- Required to enable ServiceTitan events (bookings emit crm_lead.created with origin=booking). First enablement on an existing connection uses update_integration with force. Install job types must be in appointment_job_types; only entities created after activation are announced.
config.placeholder_techniciansstring[]- Unassigned technician names; defaults to ["ZUNASSIGNED"]. Frozen with appointment_job_types.
config.deal_sourceobject- Jobs matching listed types OR the estimate minimum emit deal events. Frozen from activation.
config.deal_source.job_typesnumber[]config.deal_source.min_estimate_totalnumberforcebooleandefault falsesms_consent_attestationstring | nullteamstringrequired- Brand/team to act on (slug or id) → X-Cadence-Team. Required — your account key authorizes every brand you own, so this picks which one.
disconnect_integration
Disconnect the selected provider and clear credentials/cache. Pipedrive skips pending deliveries and deletes only Sequence's webhook. ServiceTitan keeps unfinished deliveries/plans, clears pending customer checkpoints and keeps committed feed tokens/events_since for same-account reconnect; a different account clears them. Contacts, flags, links, events and consent remain.
providerenum- pipedrive | servicetitan
Defaults to pipedrive teamstringrequired- Brand/team to act on (slug or id) → X-Cadence-Team. Required — your account key authorizes every brand you own, so this picks which one.
replay_integration_deliveries
Retry failed/skipped deliveries for one provider since an ISO timestamp. Pipedrive uses its current generation; ServiceTitan can explicitly replay same-account failures retained across reconnect. Config cutoff excludes older plan-less ServiceTitan deliveries and older Pipedrive deliveries (not_replayable). Saved recipients/context are reused and recorded lifecycle effects are not reapplied. ServiceTitan saved plans bypass config_changed_at and recover hourly; expired payloads without plans cannot be reconstructed.
providerenum- pipedrive | servicetitan
CRM provider; defaults to pipedrive sincestringrequiredstatusesenum[]default ["failed","skipped"]- failed | skipped
teamstringrequired- Brand/team to act on (slug or id) → X-Cadence-Team. Required — your account key authorizes every brand you own, so this picks which one.