Private preview of the new site. Not live.

Webhooks and events

A developer adds an endpoint with their own sign-in (webhooks.create); the secret is shown once. Deliveries are POSTs with DW-Signature: t=<unix seconds>,v1=<hex HMAC-SHA256 of t.body>. Any non-2xx is retried with backoff. Delivery is at least once, so dedupe on the event id.

EventWhat happened
shop.createdA shop was created.
membership.invitedA person was invited to a shop.
membership.role_changedA worker's role in a shop changed. The old membership ended and a new one started.
quote.revisedAn unsigned quote was replaced by a new version.
quote.withdrawnThe shop took back an unsigned quote; its signing links stopped working.
charge.succeededA payment succeeded.
dispute.closedA payment dispute closed (won, lost or closed).
plan.changedA shop changed plan.
subcontractor_list.signedA shop signed the Idaho 45-525(3) subcontractor list for a job.
subcontractor_list.preparedAn agent prepared the Idaho 45-525(3) subcontractor list for a person to sign.
plan.change_scheduledA shop scheduled a move down; it starts on the first day of effective_period (shop time).
fee.owed_to_shopA fee that was credited against a plan price is owed back to the shop after a refund or lost dispute.
plan.billedNot sent. Doing Work has no plans or monthly fee; kept so old subscriptions stay valid.
membership.startedA person joined a shop.
membership.endedA person's membership in a shop ended.
membership.permissions_changedThe owner changed what a worker may do: see_prices, see_costs, take_money, delete and manage_schedule.
ownership.transfer_startedThe owner started handing the shop to someone else.
ownership.transferredShop ownership moved to a new owner.
ownership.transfer_cancelledAn open hand-off was stopped: the owner cancelled it or the person asked declined.
shop.closedThe owner closed the shop. Everyone lost access and every link stopped; records are kept.
job_subcontractor.addedA subcontractor was added to a job.
job_subcontractor.updatedA subcontractor's contact name, trade or scope note changed.
job_subcontractor.removedA subcontractor was taken off a job; their link stopped.
job_subcontractor.joinedA subcontractor opened their link for the first time, signed in.
job_subcontractor.note_addedA subcontractor left a note on a job.
recovery.openedSomeone asked to take over a shop whose owner cannot be reached.
recovery.decidedA recovery request was decided.
home.claimedA person claimed a home.
home_role.endedA person's role at a home ended.
job.createdA job was started at a home.
job.completedA job was marked done with jobs.complete (W2). override_id is set when the owner overrode open checklist work.
media.uploadedA photo was added to a job.
media.taggedTags on a photo changed.
photo_share.createdA share link for job photos was made. It expires on its own and can be revoked.
photo_share.revokedA photo share link was turned off before it expired.
daily_log.addedA worker wrote a daily log entry on a job.
daily_log.removedA daily log entry was taken out (it stays in history).
job_document.createdCore rendered a PDF for a job (photo report or daily log) and stored it with its sha256.
signature.requestedA shop asked someone to sign a document (contract text or a stored job PDF) on a hosted page.
signature.link_issuedA new signing link was made for an open signature request; earlier links stopped working.
signature.cancelledAn open signature request was cancelled.
document.signedA person signed a document on a hosted page. The signature holds the document sha256, the consent text and its sha256.
change_order.createdA change order was written on a job (draft).
change_order.sentA change order was sent to the customer to approve by signing.
change_order.approvedThe customer signed a change order; it now counts toward the job's revised total.
change_order.cancelledA draft or sent change order was cancelled.
change_order.invoicedAn approved change order was billed on an invoice.
note.addedA note or voice memo transcript was added on a job.
note.updatedA note's words, photos, pin or audience changed.
note.removedA note was taken off its job (kept in history).
report.savedA saved report was made or changed (R3).
report.removedA saved report was removed (R3).
message_template.savedA customer message template was set (H2).
message_template.resetA customer message template went back to the built-in wording (H2).
customer.unsubscribedA customer used the unsubscribe link in a review request email; the address is on the shop's do-not-email list.
shop.hub_link_in_emails_changedThe owner turned the customer hub link in quote and invoice emails on or off.
shop.reopenedThe owner reopened the shop within 90 days of closing it.
shop.purged90 days after closing, working data the shop no longer needs was deleted. Money, tax, signature and job records are kept.
shop.field_costs_changedThe owner let field workers see job costs, or hid them again.
shop.contact_changedThe owner changed the phone or email shown on canceled invoice and quote links.
hub_link.createdA customer hub link was made (H2).
hub_link.revokedA customer hub link was revoked (H2).
visit_change.requestedA customer asked from their hub to move or cancel a visit (H2).
visit_change.withdrawnA customer took back their request to move or cancel a visit (H2).
visit_change.answeredThe shop accepted or declined a customer's request to move or cancel a visit (H2).
form_template.savedA form template was created or replaced.
form_template.archivedA form template was archived.
form.startedA form was started on a job or one visit (a draft).
form.updatedAnswers were saved on a draft form.
form.submittedA form was submitted: its PDF is stored on the job and the form is final.
form.cancelledA draft form was cancelled (kept in history).
time.clocked_inA person's clock started (work on a job, drive, shop or break).
time.clocked_outA running clock stopped; the time waits for approval.
time.addedTime was added after the fact (a manual entry); it waits for approval.
time.editedA time entry that was not approved was fixed.
time.approvedThe owner or office approved a time entry; it is locked.
time.rejectedThe owner or office rejected a time entry; the worker can fix it.
time.voidedA time entry that was never approved was taken back.
time.reopenedThe owner reopened approved time so it can be fixed.
labor_rate.setA labor cost rate was set for a worker or the shop default (the amount is not in the event).
material.addedA material used was recorded on a job.
material.updatedA recorded material's quantity, visit or notes changed.
material.removedA recorded material was removed (kept in history).
checklist_template.savedA checklist template was created or replaced.
checklist_template.archivedA checklist template was archived.
checklist.createdA checklist was put on a job or on one visit.
checklist.items_addedItems were added to a checklist.
checklist.item_checkedA checklist item was ticked or unticked.
checklist.item_removedA checklist item was removed (kept in history, audited).
checklist.overriddenThe owner marked a visit or job done with checklist work left. The reason and the open items are in the audit log.
expense.addedA worker recorded an expense on a job (amount typed by the worker).
expense.updatedAn expense was changed.
expense.removedAn expense was taken off the books (kept in history).
approval_rule.setThe owner required approval before agents run an action.
approval_rule.removedThe owner dropped an approval rule.
approval.requestedAn agent action is waiting for the owner's approval.
approval.decidedThe owner approved or denied a held agent action.
media.markup_savedA new markup layer was saved over a photo. The photo itself is unchanged.
customer.createdA customer was added to a shop.
quote.createdA quote was written.
quote.sentA quote was locked and sent for signing.
quote.signedThe customer signed a quote.
pricebook.item_savedA price book item was added, changed, archived or brought back.
quote_template.savedA quote template was saved, archived or brought back.
quote.declinedThe customer declined a quote on the sign page.
quote.change_requestedThe customer asked for changes to a quote. The quote is back to draft; read the note with quotes.activity.
quote.viewedThe customer opened a sent quote version for the first time.
quote.followup_queuedA follow-up email was queued for a quote the customer has not answered.
shop.quote_followup_changedThe owner changed the quote follow-up delay.
quote.choice_signedThe customer signed a quote with options or optional lines. Says which option and optional lines they picked and the total.
shop.tax_report_basis_changedThe owner chose how the sales tax report counts a period (accrual or cash).
maintenance_plan.tax_changedThe office changed the tax rate a maintenance plan charges from the next term.
shop.tips_changedThe owner turned tips on or off on the pay page.
shop.review_request_changedThe owner changed the review link or the review email delay.
review.request_queuedA review request email was queued for a customer whose invoice was paid.
card.savedA customer saved a card on the shop's payment account.
card.removedA customer's saved card was removed.
customer.autopay_changedAuto-pay was turned on or off for a customer.
invoice.autopay_startedAn invoice was charged to the customer's saved card. invoice.paid follows when the charge succeeds.
invoice.autopay_failedAn auto-pay charge failed. The invoice stays open.
tax_rate.savedA tax rate was added, replaced or archived. A replaced rate is archived and a new one takes its place.
quote.attachment_addedA photo or file was shown with a quote.
quote.attachment_removedA photo or file was taken off a quote.
maintenance_plan.createdA maintenance plan was started. Its first term's invoice was created.
maintenance_plan.price_changedA worker changed a maintenance plan's price. It applies from the next term.
maintenance_plan.cancelledA maintenance plan was cancelled. No more renewal invoices.
maintenance_plan.renewedA maintenance plan started its next term and that term's invoice was created (and sent when auto_send is on).
invoice.createdAn invoice was created.
invoice.batch_createdMany invoices were created at once, and maybe sent.
invoice.sentAn invoice was sent for payment.
invoice.payment_pendingA bank payment was started and is clearing. The invoice is not paid yet.
invoice.payment_failedA bank payment failed after it was started. The payer can pay again.
invoice.paidAn invoice was paid.
invoice.paid_outsideThe shop recorded an invoice as paid outside Doing Work (check, cash, financing, insurance or other). The job record says so and is never marked paid or verified.
invoice.voidedThe shop voided an invoice nobody had paid (X3). Its pay links stop working; the reason is included.
charge.needs_refundMoney arrived that the shop must give back (a paid-twice or void invoice).
charge.refundedA payment was refunded.
dispute.openedA payment was disputed.
processor_account.updatedThe shop's payment setup changed.
record.levelledA job record reached a new level (logged, paid, verified).
confirmation.createdThe customer confirmed a job.
grant.createdAccess was granted.
grant.revokedAccess was revoked.
field_value.setA custom field value was set.
field_definition.createdA shop added a custom field.
customer.updatedA customer's details, contacts, properties or archive state changed.
customer.mergedA duplicate customer was merged into another.
customer.erasedA customer's personal details were erased for a privacy request.
equipment.changedEquipment at a property was added, changed or archived.
job.updatedA job's tags or lead source changed.
request.createdA request for work came in.
request.updatedA request changed stage or details.
request.convertedA request became a job.
visit.scheduledA visit to a job was booked.
visit.updatedA visit moved or its details changed.
visit.assignedThe workers on a visit changed.
visit.cancelledA visit was cancelled.
visit.startedA worker started a visit.
visit.doneA visit was marked done.
visit.series_createdA repeating set of visits was booked.
availability.changedA worker's weekly hours or time off changed.
visit.on_the_wayA worker is on the way to a visit, with an ETA when given.
visit.arrivedA worker arrived at a visit.
visit.notice_queuedA customer notice for a visit (appointment reminder or on my way) was handed to email.
schedule.hours_changedThe shop's booking hours changed.
schedule.settings_changedThe shop's scheduling rules changed (arrival window, buffer, reminders, on-my-way notices, time zone).
invoice.pay_link_ready_queuedOne email was queued telling the customer an invoice can be paid again after its pay link waited on the shop's payments account.
signature.copy_queuedOne email was queued giving a signer their own copy of what they signed (a document, a quote or a subcontractor list).
card.resave_queuedOne email was queued asking a customer to save their card again after the shop's payments account changed.
invoice.reminder_queuedA friendly reminder was queued for an invoice still unpaid a day after it was sent.
shop.invoice_reminders_changedThe owner turned the automatic unpaid-invoice reminder on or off for the shop.
invoice.reminder_changedThe automatic unpaid reminder was turned on or off for one invoice.
request_form.createdA shop turned on or renewed its public request form.
webhook_endpoint.createdA webhook endpoint was added.
webhook_endpoint.deletedA webhook endpoint was removed.
webhook_delivery.retriedAn owner or office worker queued a failed webhook delivery to send again.
webhook_endpoint.creator_leftThe worker who added a webhook endpoint left the shop. The endpoint keeps running; the owner can keep it or remove it.
agent_key.createdThe owner made a named agent key for the shop.
agent_key.revokedThe owner revoked a named agent key. It stops working at once.
platform.createdA developer platform account was created.