Payloads
Every event has the same envelope, described in Requests and signatures. This page lists what goes in data.attributes for each record type, and the extra fields some events add.
- Money is integer cents, tax exclusive unless the field says it includes tax (
total_centsincludes tax,total_excluding_tax_centsdoes not). - Timestamps are ISO 8601 in UTC with six decimal places. Dates are
yyyy-mm-dd. - Ids are Drum ids, the same ones the REST API uses.
- A field with no value is
null. Fields are not left out. - Drum may add attributes. Ignore ones you do not know.
Project and opportunity events
project.created, project.updated, project.completed, opportunity.won and opportunity.lost:
{
"id": 12345,
"name": "Office Renovation",
"project_number": "PRJ-2026-001",
"project_type": "project",
"start_date": "2026-01-15",
"end_date": "2026-06-30",
"completed_date": null,
"currency": "AUD",
"total_budget_cents": 15000000,
"total_invoiced_cents": 5000000,
"costs_to_date_cents": 3500000,
"team_id": 42,
"client_id": 789,
"status": "In Progress",
"complete_status": false,
"client_name": "Acme Corporation",
"team_name": "Engineering",
"opportunity_id": 12001,
"opportunity_number": "OPP-2026-014",
"deal_won_date": null,
"deal_lost_date": null,
"lead_score": null,
"sales_status_type": "standard",
"created_at": "2026-01-15T10:30:00.000000Z",
"updated_at": "2026-01-15T10:30:00.000000Z"
}
| Attribute | Meaning |
|---|---|
project_type |
project or opportunity |
status |
The name of the current status, or null |
complete_status |
true when the status is a complete status. null with no status |
sales_status_type |
standard, won or lost |
opportunity_id, opportunity_number |
On a project converted from an opportunity, that opportunity. Otherwise null |
lead_score |
The lead score’s name, or null |
The payload never includes an opportunity’s deal value or deposit.
Invoice events
invoice.created and invoice.updated:
{
"id": 5678,
"invoice_number": "INV-2026-001",
"project_id": 12345,
"project_number": "PRJ-2026-001",
"status": "approved",
"currency": "AUD",
"total_cents": 550000,
"total_excluding_tax_cents": 500000,
"amount_paid_cents": 0,
"issued_date": "2026-01-15",
"due_date": "2026-02-14",
"paid_date": null,
"reference": "Progress Claim #1",
"description": "January progress claim",
"created_at": "2026-01-15T10:30:00.000000Z",
"updated_at": "2026-01-15T10:30:00.000000Z"
}
status is the status in Drum: draft, awaiting_approval or approved.
Cost events
cost.created and cost.updated:
{
"id": 9012,
"name": "Steel materials",
"project_id": 12345,
"project_number": "PRJ-2026-001",
"task_id": 456,
"status": "approved",
"billing_status": "unbilled",
"currency": "AUD",
"total_cents": 110000,
"total_excluding_tax_cents": 100000,
"issued_date": "2026-01-10",
"due_date": "2026-02-10",
"paid_date": null,
"invoice_number": "SUP-12345",
"reference": "PO-2026-042",
"description": "Structural steel for level 2",
"supplier_id": 789,
"supplier_type": "Company",
"created_at": "2026-01-15T10:30:00.000000Z",
"updated_at": "2026-01-15T10:30:00.000000Z"
}
| Attribute | Meaning |
|---|---|
status |
draft, final, approved or planned |
billing_status |
unbilled, partial or billed |
supplier_type |
Company for a supplier, or AccountUser for a cost incurred by a member of staff. supplier_id is then the member id |
company.merged
Sent once after a merge. data is the company that was kept. The body also has merged_company_ids (the archived companies), merge_activity_id, and moved (counts of the records moved, by kind).
{
"event": "company.merged",
"timestamp": "2026-09-25T10:30:00.000000Z",
"merge_activity_id": 701,
"merged_company_ids": [815, 816],
"moved": {"projects": 4, "invoices": 1, "contracts": 0, "costs": 12, "purchase_orders": 2, "expense_claim_items": 0, "staff_credit_cards": 0},
"data": {
"id": 812,
"type": "Company",
"attributes": {"id": 812, "trading_name": "Acme Pty Ltd", "legal_name": null, "company_type": "both", "discarded_at": null, "created_at": "2025-01-15T10:30:00.000000Z", "updated_at": "2026-09-25T10:30:00.000000Z"}
}
}
Projects and contracts moved by a merge may also send their own update events. Invoices and supplier records moved by a merge do not.
trigger.fired
Sent by an event trigger whose action is Send Webhook. The body adds three fields beside event and timestamp:
{
"event": "trigger.fired",
"timestamp": "2026-10-13T02:14:07.412345Z",
"trigger_model": "task",
"trigger_source": "task",
"trigger_event": "status_completed",
"data": {"id": 456, "type": "Task", "attributes": {}}
}
| Field | Meaning |
|---|---|
trigger_source |
What the trigger is set on, such as opportunity or project_account_user |
trigger_model |
The record type in snake case. project for both projects and opportunities |
trigger_event |
The trigger’s event, such as status_approved |
The values for each kind of trigger are in Events. data.attributes is the record in its shape below. Projects, opportunities, invoices and costs use the shapes above.
Task
{
"id": 456,
"name": "Drainage design",
"status": "completed",
"due_date": "2026-10-20",
"start_date": "2026-10-01",
"completed_date": "2026-10-13",
"estimated_duration": "40.0",
"budget_cents": 800000,
"currency": "AUD",
"project_id": 12345,
"project_number": "PRJ-2026-001",
"created_at": "2026-09-30T23:00:00.000000Z",
"updated_at": "2026-10-13T02:14:07.000000Z"
}
status is not_started, in_progress, completed, not_applicable or blocked. estimated_duration is in hours, as a decimal string.
Timesheet
{
"id": 3301,
"status": "approved",
"start_date": "2026-10-05",
"end_date": "2026-10-11",
"employee_id": 57,
"approved_by_id": 12,
"created_at": "2026-10-04T22:12:44.000000Z",
"updated_at": "2026-10-12T22:59:58.512301Z"
}
employee_id and approved_by_id are member ids. status is draft, finalised (submitted for approval) or approved, or drum_only or xero_conflict for timesheets linked to Xero.
Expense claim
{
"id": 77,
"name": "September travel",
"status": "approved",
"currency": "AUD",
"total_cents": 33000,
"total_excluding_tax_cents": 30000,
"issued_date": "2026-09-30",
"due_date": "2026-10-14",
"reference": "EXP-077",
"employee_id": 57,
"approver_id": 12,
"created_at": "2026-09-30T05:00:00.000000Z",
"updated_at": "2026-10-13T02:14:07.000000Z"
}
status is draft, pending, approved or rejected. employee_id and approver_id are member ids.
Progress claim
{
"id": 88,
"name": "Claim 3",
"project_id": 12345,
"project_number": "PRJ-2026-001",
"status": "approved",
"currency": "AUD",
"requested_total_cents": 1200000,
"approved_total_cents": 1150000,
"start_date": "2026-09-01",
"end_date": "2026-09-30",
"issued_date": "2026-10-01",
"approved_date": "2026-10-10",
"reference": "PC-03",
"created_at": "2026-10-01T00:00:00.000000Z",
"updated_at": "2026-10-10T03:00:00.000000Z"
}
status is draft, submitted, approved or rejected.
Quote
{
"id": 61,
"quote_number": "Q-2026-061",
"project_id": 12001,
"project_number": "OPP-2026-014",
"status": "accepted",
"currency": "AUD",
"total_cents": 1650000,
"total_excluding_tax_cents": 1500000,
"title": "Stage 2 design",
"expiry_date": "2026-11-01",
"sent_at": "2026-10-02T01:00:00.000000Z",
"created_at": "2026-10-01T00:00:00.000000Z",
"updated_at": "2026-10-13T02:14:07.000000Z"
}
status is draft, awaiting_approval, approved, sent, cancelled, accepted or declined.
Project role assignment
data.type is ProjectAccountUser: one member’s role on one project or opportunity.
{
"id": 905,
"project_id": 12345,
"project_number": "PRJ-2026-001",
"account_user_id": 57,
"project_role_id": 3,
"role_name": "Project Manager",
"created_at": "2026-10-13T02:14:07.000000Z",
"updated_at": "2026-10-13T02:14:07.000000Z"
}
account_user_id is the member id.
Purchase order
{
"id": 140,
"name": "Survey subcontract",
"purchase_order_number": "PO-2026-140",
"project_id": 12345,
"project_number": "PRJ-2026-001",
"task_id": 456,
"status": "approved",
"currency": "AUD",
"total_cents": 550000,
"total_excluding_tax_cents": 500000,
"drawn_cents": 200000,
"remaining_cents": 300000,
"issued_date": "2026-10-01",
"delivery_date": "2026-10-31",
"reference": "Survey",
"description": "Feature and level survey",
"supplier_id": 789,
"supplier_type": "Company",
"created_at": "2026-10-01T00:00:00.000000Z",
"updated_at": "2026-10-13T02:14:07.000000Z"
}
status is draft, final (awaiting approval), approved or closed. drawn_cents is the amount already drawn down by costs, and remaining_cents is total_excluding_tax_cents less drawn_cents. supplier_type works as it does on costs.