DevelopersWebhooks

Event catalog

Every event ServFlo sends to webhooks, grouped by area, with the fields of its data.

ServFlo sends 107 kinds of event. Each delivery's body is the event envelope with the fields below in data. Event data carries ids, statuses, amounts and dates only: never names, addresses, notes, secrets or costs. Read the full record with the API when you need it (the record's id is data.recordId).

Subscribe to any of these by name when you create a webhook endpoint, or leave the list empty to receive every event. The same list is available from the API: List event types.

Common to every event:

Field in dataTypeDescription
recordIdstringThe record the event is about. Its type is the event's prefix: invoice.paid carries an invoice id.
identifierstring (optional)The record's number when it has one, such as INV-12 or JOB-4.

Customers

customer.created

A customer (or lead) was created.

Field in dataTypeDescription
typeenumOne of RESIDENTIAL, COMMERCIAL.
statusstring
leadSourceIdstring (optional)

customer.updated

A customer's details changed. fields names what changed (never the values).

Field in dataTypeDescription
fieldsarray of string

A customer portal link was created or replaced.

Field in dataTypeDescription
customerIdstring

portal.session_revoked

A customer's portal session ended early: they signed out, staff signed them out, or sign-in was turned off. recordId is the session.

Field in dataTypeDescription
customerIdstring
reasonenumOne of SIGNED_OUT, STAFF, SIGN_IN_DISABLED, REPLACED.

portal.signed_in

A customer signed in to their portal with a code or a one-tap email link. recordId is the customer session.

Field in dataTypeDescription
customerIdstring
methodenumOne of EMAIL_CODE, SMS_CODE, EMAIL_LINK.

portal.viewed

A customer opened their portal.

Field in dataTypeDescription
customerIdstring

Requests and quotes

booking.confirmed

A slot booked online became a job: by staff, or at once with automatic confirmation.

Field in dataTypeDescription
jobIdstring
scheduledDatestringYYYY-MM-DD in the business's calendar.
automaticboolean

quote.approved

A quote was approved (by the customer, or by staff for them).

Field in dataTypeDescription
byStaffboolean (optional)

quote.changes_requested

The customer asked for changes to a quote.

Field in dataTypeDescription

quote.converted

An approved quote became a job or an invoice.

Field in dataTypeDescription
jobIdstring (optional)
invoiceIdstring (optional)

quote.created

A quote was created.

Field in dataTypeDescription

quote.declined

The customer declined a quote.

Field in dataTypeDescription

quote.sent

A quote was sent to the customer.

Field in dataTypeDescription

request.archived

A request was archived.

Field in dataTypeDescription

request.assessment_scheduled

An on-site assessment was booked for a request.

Field in dataTypeDescription
jobIdstring

request.converted

A request became a job.

Field in dataTypeDescription
jobIdstring

request.created

A service request came in (by staff, online booking or the portal).

Field in dataTypeDescription
sourceenumOne of MANUAL, ONLINE_BOOKING, PORTAL, FIELD, PHONE.

Jobs and visits

agreement.signed

A pre-service agreement on a job was signed.

Field in dataTypeDescription
jobIdstring
customerIdstring
byStaffbooleanRecorded by staff on site rather than signed from the link.

form.submitted

A job form was submitted.

Field in dataTypeDescription
jobIdstring

job.cancelled

A job was cancelled.

Field in dataTypeDescription
technicianIdstring (optional)
customerIdstring

job.completed

A job (or visit) was completed.

Field in dataTypeDescription
technicianIdstring (optional)
customerIdstring
visitIdstring (optional)
completedAtstring (optional)ISO 8601 time (UTC).

job.created

A job was created.

Field in dataTypeDescription
customerIdstring
propertyIdstring (optional)
technicianIdstring (optional)
serviceTypeIdstring (optional)
scheduledDatestring (optional)YYYY-MM-DD in the business's calendar.
statusstring

job.scheduled

A job (or one of its visits) got a new date, time or technician.

Field in dataTypeDescription
visitIdstring (optional)
scheduledDatestring (optional)YYYY-MM-DD in the business's calendar.
scheduledTimestring (optional)
technicianIdstring (optional)
previousTechnicianIdsarray of string (optional)Technicians taken off the job or visit by this change (they are told).

job.signed

The customer signed off a job.

Field in dataTypeDescription

job.started

Work on a job (or visit) started.

Field in dataTypeDescription
technicianIdstring (optional)
customerIdstring
visitIdstring (optional)
startedAtstring (optional)ISO 8601 time (UTC).

service_report.assistant_applied

A person accepted a change the inspection assistant proposed for a report (status, describe answers, findings, notes or a new section); it was applied through the normal report edits.

Field in dataTypeDescription
jobIdstring
proposalIdstring
kindenumOne of ITEM, SECTION.
findingsintegerFindings added (marked AI-assisted).

service_report.published

A service report (inspection, service or test report) was published as a new version.

Field in dataTypeDescription
jobIdstring
customerIdstring
versioninteger

service_report.released

A published service report opened for its client (by its release rule: published, paid, agreement signed, or a manual unlock).

Field in dataTypeDescription
jobIdstring
customerIdstring
versioninteger

service_report.viewed

Someone opened a service report from their link for the first time.

Field in dataTypeDescription
jobIdstring
accessIdstring
roleenumOne of CLIENT, BUYER_AGENT, LISTING_AGENT, OTHER.

service_report_template_draft.ready

A report template drafted by AI from a business's standards document finished reading (ready to review) or failed. recordId is the draft.

Field in dataTypeDescription
statusenumOne of REVIEW, FAILED.
pagesinteger (optional)
sectionsinteger
itemsinteger
commentsinteger

technician.on_my_way

A technician is on the way to a job.

Field in dataTypeDescription
technicianIdstring (optional)
customerIdstring
visitIdstring (optional)
onMyWayAtstringISO 8601 time (UTC).

visit.cancelled

A visit of a job was cancelled (its reminders are withdrawn).

Field in dataTypeDescription
jobIdstring
customerIdstring

Invoices

invoice.created

An invoice was created (usually as a draft).

Field in dataTypeDescription
customerIdstring
jobIdstring (optional)
membershipIdstring (optional)
progressBillingIdstring (optional)The progress billing it belongs to, if any.
statusstring
totalCentsintegerInteger cents.
dueDatestring (optional)YYYY-MM-DD in the business's calendar.

invoice.overdue

An unpaid invoice passed its due date (the scheduler's overdue sweep).

Field in dataTypeDescription
customerIdstring
dueDatestring (optional)YYYY-MM-DD in the business's calendar.
balanceDueCentsintegerInteger cents.

invoice.paid

An invoice was paid in full.

Field in dataTypeDescription
amountPaidCentsintegerInteger cents.
balanceDueCentsintegerInteger cents.

invoice.partially_paid

A payment left part of an invoice due.

Field in dataTypeDescription
amountPaidCentsintegerInteger cents.
balanceDueCentsintegerInteger cents.

invoice.sent

An invoice was issued to the customer (status SENT).

Field in dataTypeDescription
customerIdstring
totalCentsintegerInteger cents.
balanceDueCentsintegerInteger cents.
dueDatestring (optional)YYYY-MM-DD in the business's calendar.

invoice_batch.completed

A batch action on invoices finished (batch create from jobs, batch send, reminders or mark sent); recordId is the batch key.

Field in dataTypeDescription
actionenumOne of create, send, remind, mark_sent.
requestedinteger
succeededinteger
skippedinteger
failedinteger
invoiceIdsarray of stringInvoices created or acted on.

progress_billing.completed

A progress billing has billed its whole contract and released any retainage.

Field in dataTypeDescription
customerIdstring
contractCentsintegerInteger cents.

progress_billing.created

A quote or job was set up for progress billing (milestones or percent complete).

Field in dataTypeDescription
customerIdstring
quoteIdstring (optional)
jobIdstring (optional)
methodenumOne of MILESTONES, PERCENT_COMPLETE.
contractCentsintegerInteger cents.
retainagePercentnumber

progress_billing.invoiced

A progress, final or retainage-release invoice was made from a progress billing.

Field in dataTypeDescription
customerIdstring
invoiceIdstring
roleenumOne of PROGRESS, FINAL, RETAINAGE_RELEASE.
billedCentsintegerContract work billed on it, before retainage and tax.
retainageCentsintegerRetainage held (positive) or released (negative).
billedToDateCentsintegerInteger cents.
contractCentsintegerInteger cents.

Payments

payment.disputed

A customer's bank opened a dispute (chargeback) on an online payment.

Field in dataTypeDescription
invoiceIdstring (optional)
amountCentsintegerInteger cents.
statusstring
reasonstring (optional)

payment.failed

An online payment failed: declined, the bank asked for authentication on an automatic charge, a bank debit bounced, or the checkout page expired unpaid.

Field in dataTypeDescription
customerIdstring (optional)
invoiceIdstring (optional)
quoteIdstring (optional)
amountCentsintegerInteger cents.
tipCentsinteger (optional)Integer cents.
reasonstringStripe's code (card_declined, authentication_required…) or checkout_expired / checkout_replaced / bank_debit_failed.
channelenum (optional)One of PORTAL, INVOICE_LINK, QUOTE_PAGE, STAFF, AUTOPAY.

payment.recorded

Money was received: against an invoice, or a quote deposit.

Field in dataTypeDescription
customerIdstring (optional)
invoiceIdstring (optional)
quoteIdstring (optional)
depositboolean (optional)
amountCentsintegerInteger cents.
tipCentsinteger (optional)Integer cents.
methodenumOne of CASH, CHECK, CARD, BANK_TRANSFER, OTHER.
notifyCustomerboolean (optional)
processorenum (optional)STRIPE for an online payment settled by Stripe; MANUAL (or absent) when staff recorded it. One of MANUAL, STRIPE.

payment.refunded

A payment was (partly) refunded.

Field in dataTypeDescription
refundIdstring
amountCentsintegerInteger cents.
invoiceIdstring (optional)
quoteIdstring (optional)

payments.account_updated

The business's Stripe account changed standing: connected, charges or payouts enabled or paused, details submitted, or disconnected.

Field in dataTypeDescription
stateenumOne of NOT_CONNECTED, ONBOARDING, RESTRICTED, ACTIVE.
chargesEnabledboolean
payoutsEnabledboolean
detailsSubmittedboolean

Memberships

membership.billed

A membership billing period was invoiced.

Field in dataTypeDescription
invoiceIdstring
periodStartstringYYYY-MM-DD in the business's calendar.
periodEndstringYYYY-MM-DD in the business's calendar.

membership.cancelled

A membership was cancelled.

Field in dataTypeDescription
finalInvoiceIdstring (optional)

membership.created

A customer signed up to a membership plan.

Field in dataTypeDescription
customerIdstring
planIdstring

membership.expired

A membership's term ended without renewal.

Field in dataTypeDescription

membership.paused

A membership was paused.

Field in dataTypeDescription
pausedUntilstring (optional)YYYY-MM-DD in the business's calendar.

membership.renewed

A membership started a new term.

Field in dataTypeDescription
termNumberinteger
manualboolean

membership.visit_due

An included member visit's window opened; its job waits to be scheduled.

Field in dataTypeDescription
membershipVisitIdstring
jobIdstring (optional)
dueMonthstring
dueDatestring (optional)

Team

chat.message_sent

Someone wrote in team chat (the team, a direct message or a job's conversation).

Field in dataTypeDescription
conversationIdstring
kindenumOne of TEAM, DIRECT, JOB.
jobIdstring (optional)

payroll.closed

A pay period was closed for payroll: its time entries are locked until it is reopened. recordId is organizationId:periodStart.

Field in dataTypeDescription
periodStartstringYYYY-MM-DD in the business's calendar.
periodEndstringYYYY-MM-DD in the business's calendar.
peopleinteger
unapprovedEntriesinteger

payroll.reopened

A closed pay period was reopened so its time can change. recordId is organizationId:periodStart.

Field in dataTypeDescription
periodStartstringYYYY-MM-DD in the business's calendar.
periodEndstringYYYY-MM-DD in the business's calendar.

technician.linked

A technician record was linked to a ServFlo account.

Field in dataTypeDescription
userIdstring
viaenumOne of member, email.

time.clocked_in

Someone clocked in.

Field in dataTypeDescription
userIdstring
technicianIdstring (optional)

time.clocked_out

Someone clocked out.

Field in dataTypeDescription
userIdstring
technicianIdstring (optional)
minutesinteger

timesheet.approved

A weekly timesheet was approved.

Field in dataTypeDescription
userIdstring
weekStartstringYYYY-MM-DD in the business's calendar.
entriesinteger

timesheet.rejected

A weekly timesheet was sent back.

Field in dataTypeDescription
userIdstring
weekStartstringYYYY-MM-DD in the business's calendar.
entriesinteger

timesheet.submitted

A weekly timesheet was submitted for approval.

Field in dataTypeDescription
userIdstring
weekStartstringYYYY-MM-DD in the business's calendar.
entriesinteger

Inventory and purchasing

expense.recorded

An expense was recorded.

Field in dataTypeDescription
amountCentsintegerInteger cents.
jobIdstring (optional)

inventory.low_stock

An item reached its reorder point at a location.

Field in dataTypeDescription
locationIdstring
onHandnumber
reorderPointnumber (optional)

inventory.negative_stock

An item went below zero at a location.

Field in dataTypeDescription
locationIdstring
onHandnumber
reorderPointnumber (optional)

inventory.transferred

Stock moved between locations.

Field in dataTypeDescription
fromLocationIdstring
toLocationIdstring
linesinteger

parts_request.created

A technician asked for parts (for a job or to restock their truck).

Field in dataTypeDescription
kindenumOne of JOB, RESTOCK.
technicianIdstring (optional)
jobIdstring (optional)

parts_request.status_changed

The office moved a parts request along (on order, ready, done, cancelled).

Field in dataTypeDescription
technicianIdstring (optional)
statusenumOne of REQUESTED, ORDERED, READY, DONE, CANCELLED.

pricebook.imported

A pricebook CSV was imported.

Field in dataTypeDescription
createdinteger
updatedinteger

pricebook.repriced

Markup items were repriced.

Field in dataTypeDescription
itemsinteger

purchase_order.cancelled

A purchase order was cancelled.

Field in dataTypeDescription

purchase_order.received

Items on a purchase order were received.

Field in dataTypeDescription
statusstring
jobIdstring (optional)
linesinteger

purchase_order.sent

A purchase order was sent to its vendor.

Field in dataTypeDescription
vendorIdstring

Commissions

commission.approved

Commission lines were approved.

Field in dataTypeDescription
linesinteger
totalCentsintegerInteger cents.

commission.calculated

Commissions were calculated for a pay period.

Field in dataTypeDescription
periodStartstringYYYY-MM-DD in the business's calendar.
periodEndstringYYYY-MM-DD in the business's calendar.
linesinteger
totalCentsintegerInteger cents.

commission.paid

Commission lines were marked paid.

Field in dataTypeDescription
linesinteger
totalCentsintegerInteger cents.

Messages and automations

automation.disabled

An automation (engagement rule) was turned off.

Field in dataTypeDescription
presetKeystring (optional)
triggerTypeenumOne of EVENT, SCHEDULE, ABSENCE, RELATIVE.

automation.enabled

An automation (engagement rule) was turned on.

Field in dataTypeDescription
presetKeystring (optional)
triggerTypeenumOne of EVENT, SCHEDULE, ABSENCE, RELATIVE.

consent.changed

A contact method's messaging consent changed (STOP / START reply, the unsubscribe page, staff, a bounce).

Field in dataTypeDescription
customerIdstring
channelenumOne of EMAIL, SMS.
purposeenumOne of TRANSACTIONAL, MARKETING.
statusenumOne of OPTED_IN, OPTED_OUT.
sourcestringreply:STOP, reply:START, unsubscribe-page, staff, bounce, complaint.

message.bounced

An email bounced or was marked as spam; its address is suppressed.

Field in dataTypeDescription
customerIdstring (optional)
channelenumOne of EMAIL, SMS.
kindenumOne of BOUNCE, COMPLAINT.

message.delivered

The provider confirmed a message was delivered.

Field in dataTypeDescription
customerIdstring (optional)
channelenumOne of EMAIL, SMS.
ruleIdstring (optional)

message.failed

A message could not be sent (the provider refused it).

Field in dataTypeDescription
customerIdstring (optional)
channelenumOne of EMAIL, SMS.
ruleIdstring (optional)
reasonstringA short code: provider_error, provider_not_configured …

message.replied

A customer replied to a text (logged as an inbound message). Ends cadences that list it as an exit.

Field in dataTypeDescription
customerIdstring (optional)
channelenumOne of EMAIL, SMS.
inReplyToIdstring (optional)
keywordenum (optional)Set when the reply was an opt-out, opt-in or help keyword. One of STOP, START, HELP.

message.sent

A customer email or text was sent (or, in test mode, rendered and logged as SENT_TEST).

Field in dataTypeDescription
customerIdstring (optional)
channelenumOne of EMAIL, SMS.
purposeenumOne of TRANSACTIONAL, MARKETING.
sourceenumOne of AUTOMATION, MANUAL, TEST, INBOUND, CAMPAIGN, SYSTEM.
statusenumOne of SENT, SENT_TEST.
ruleIdstring (optional)
subjectTypestring (optional)
subjectIdstring (optional)
campaignIdstring (optional)

Marketing

campaign.cancelled

A campaign was cancelled before it finished.

Field in dataTypeDescription
channelsarray of enum
statusenumOne of DRAFT, SCHEDULED, SENDING, PAUSED, SENT, CANCELLED.

campaign.completed

Every recipient of a campaign was handled (queued, or skipped with the reason).

Field in dataTypeDescription
channelsarray of enum
statusenumOne of DRAFT, SCHEDULED, SENDING, PAUSED, SENT, CANCELLED.
queuedinteger
skippedinteger

campaign.paused

A sending or scheduled campaign was paused.

Field in dataTypeDescription
channelsarray of enum
statusenumOne of DRAFT, SCHEDULED, SENDING, PAUSED, SENT, CANCELLED.

campaign.resumed

A paused campaign was resumed.

Field in dataTypeDescription
channelsarray of enum
statusenumOne of DRAFT, SCHEDULED, SENDING, PAUSED, SENT, CANCELLED.

campaign.scheduled

A marketing campaign was scheduled for later (a time, or each recipient's local time).

Field in dataTypeDescription
channelsarray of enum
statusenumOne of DRAFT, SCHEDULED, SENDING, PAUSED, SENT, CANCELLED.
audienceCountinteger

campaign.started

A marketing campaign started sending.

Field in dataTypeDescription
channelsarray of enum
statusenumOne of DRAFT, SCHEDULED, SENDING, PAUSED, SENT, CANCELLED.
audienceCountinteger

referral.converted

A referred customer converted (first paid invoice by default); the referrer's reward was issued unless the cap withheld it.

Field in dataTypeDescription
referrerCustomerIdstring
referredCustomerIdstring
rewardWithheldboolean

referral.created

Someone came in through a customer's referral link, or staff recorded a referral.

Field in dataTypeDescription
referrerCustomerIdstring
referredCustomerIdstring (optional)
requestIdstring (optional)
sourceenumOne of LINK, STAFF.

referral.rejected

A referral was refused: self-referral, an existing customer, or by staff.

Field in dataTypeDescription
referrerCustomerIdstring
reasonenumOne of SELF_REFERRAL, EXISTING_CUSTOMER, DUPLICATE, STAFF.

referral.reward_applied

A referral reward was used: a credit line on an invoice, or the gift card was sent.

Field in dataTypeDescription
referralIdstring
customerIdstring
invoiceIdstring (optional)
amountCentsintegerInteger cents.

referral.reward_issued

A referral reward was earned.

Field in dataTypeDescription
referralIdstring
customerIdstring
partyenumOne of REFERRER, FRIEND.
kindenumOne of ACCOUNT_CREDIT, DISCOUNT, GIFT_CARD, NONE.
amountCentsintegerInteger cents.

Website

website.deleted

The business's website was deleted with its pages, addresses and stats (the image library stays).

Field in dataTypeDescription
subdomainstring
wasPublishedboolean

website.domain_activated

A custom domain passed its DNS checks and now serves the website.

Field in dataTypeDescription
hostnamestring

website.published

The business's website was published (or republished).

Field in dataTypeDescription
pageCountinteger

website.unpublished

The business's website was taken down.

Field in dataTypeDescription

Reviews

feedback.submitted

A customer rated their service when paying (stars and a comment, kept in ServFlo). Low ratings are worth a call.

Field in dataTypeDescription
ratinginteger1–5 stars.
customerIdstring
invoiceIdstring
jobIdstring (optional)

review.received

A new Google review arrived (synced from the Business Profile). Low ratings are worth a quick reply.

Field in dataTypeDescription
ratinginteger1–5 stars.
locationIdstring
customerIdstring (optional)The customer it was matched to by name, if one.

review.replied

The business replied publicly to a Google review.

Field in dataTypeDescription
ratinginteger

Phone

call.completed

A call ended: answered (COMPLETED), MISSED, VOICEMAIL or, for an outbound call, FAILED.

Field in dataTypeDescription
directionenumOne of INBOUND, OUTBOUND.
statusenumOne of COMPLETED, MISSED, VOICEMAIL, FAILED.
sourceenum (optional)One of MAIN, WEBSITE, GOOGLE_BUSINESS, CAMPAIGN, QR_CODE, BUSINESS_UNIT, PRINT, OTHER, PERSONAL.
phoneNumberIdstring (optional)
customerIdstring (optional)
durationSecondsinteger (optional)

call.received

An inbound call reached one of the business's numbers (before anyone answered).

Field in dataTypeDescription
directionenumOne of INBOUND, OUTBOUND.
sourceenum (optional)One of MAIN, WEBSITE, GOOGLE_BUSINESS, CAMPAIGN, QR_CODE, BUSINESS_UNIT, PRINT, OTHER, PERSONAL.
phoneNumberIdstring (optional)
customerIdstring (optional)
afterHoursboolean

System

billing.addon_acknowledged

An owner accepted a paid add-on's usage terms (adding it, turning on ServFlo-managed telephony, or after a price change). recordId is the acknowledgement.

Field in dataTypeDescription
addonKeystring
contextenumOne of ADD_ADDON, MANAGED_TELEPHONY, REVIEW.
priceVersionstring
userIdstring

import.completed

A migration import finished. The only event of an import: its records emit no events of their own. recordId is the import run.

Field in dataTypeDescription
sourceenumOne of JOBBER, SERVICETITAN, SPREADSHEET.
createdinteger
updatedinteger

webhook.test

A test event sent from Settings → Developers → Webhooks to one endpoint only. Sent only by Send test event; you cannot subscribe to it.

Field in dataTypeDescription
messagestring

On this page

Customerscustomer.createdcustomer.updatedportal.link_createdportal.session_revokedportal.signed_inportal.viewedRequests and quotesbooking.confirmedquote.approvedquote.changes_requestedquote.convertedquote.createdquote.declinedquote.sentrequest.archivedrequest.assessment_scheduledrequest.convertedrequest.createdJobs and visitsagreement.signedform.submittedjob.cancelledjob.completedjob.createdjob.scheduledjob.signedjob.startedservice_report.assistant_appliedservice_report.publishedservice_report.releasedservice_report.viewedservice_report_template_draft.readytechnician.on_my_wayvisit.cancelledInvoicesinvoice.createdinvoice.overdueinvoice.paidinvoice.partially_paidinvoice.sentinvoice_batch.completedprogress_billing.completedprogress_billing.createdprogress_billing.invoicedPaymentspayment.disputedpayment.failedpayment.recordedpayment.refundedpayments.account_updatedMembershipsmembership.billedmembership.cancelledmembership.createdmembership.expiredmembership.pausedmembership.renewedmembership.visit_dueTeamchat.message_sentpayroll.closedpayroll.reopenedtechnician.linkedtime.clocked_intime.clocked_outtimesheet.approvedtimesheet.rejectedtimesheet.submittedInventory and purchasingexpense.recordedinventory.low_stockinventory.negative_stockinventory.transferredparts_request.createdparts_request.status_changedpricebook.importedpricebook.repricedpurchase_order.cancelledpurchase_order.receivedpurchase_order.sentCommissionscommission.approvedcommission.calculatedcommission.paidMessages and automationsautomation.disabledautomation.enabledconsent.changedmessage.bouncedmessage.deliveredmessage.failedmessage.repliedmessage.sentMarketingcampaign.cancelledcampaign.completedcampaign.pausedcampaign.resumedcampaign.scheduledcampaign.startedreferral.convertedreferral.createdreferral.rejectedreferral.reward_appliedreferral.reward_issuedWebsitewebsite.deletedwebsite.domain_activatedwebsite.publishedwebsite.unpublishedReviewsfeedback.submittedreview.receivedreview.repliedPhonecall.completedcall.receivedSystembilling.addon_acknowledgedimport.completedwebhook.test