What Is This Reference?

This page is the field-by-field companion to the Webhooks Integration guide. That guide covers setup, retries, and signature verification; this page documents exactly what arrives in every one of Maverick's 33 webhook events — every property name, its JSON type, and what it means. If you have not yet confirmed your webhook connection delivers at all, run the five-minute webhook connection smoke test first.

Maverick's webhook system covers 11 core objects, each with three lifecycle events — created, updated, and deleted — for 11 × 3 = 33 total event types. Every event name follows the same pattern: <object>.<action>, for example project.created or invoice.deleted. Field names match the OData Schema Reference exactly, so if you have already built reporting against the OData feed or a Zapier Zap, the property names below will look familiar.

Two Payload Shapes: Full Record vs. Minimal

Every webhook payload starts with the same event field naming which event fired, but the rest of the body takes one of two shapes depending on the action:

  • created and updated events include every field for that object — the full property table shown in each section below.
  • deleted events always use the minimal { event, id } shape, because by the time the notification is sent, the record no longer exists in the database — there is nothing left to query.

// project.updated — full record { "event": "project.updated", "ProjectID": "b1000002-0000-0000-0000-000000000000", "ProjectName": "Sample Project", "Created": "2026-01-01T08:00:00-05:00", "Modified": "2026-01-15T09:00:00-05:00", "StartDate": "2026-01-01", "FinishDate": "2026-06-30", "Status": "Open", "ClientID": "d1000004-0000-0000-0000-000000000000", "ClientName": "Acme Corp" … every field in the Projects table below }

// project.deleted — minimal shape { "event": "project.deleted", "id": "b1000002-0000-0000-0000-000000000000" }

The id value in a deleted event always matches that object's primary key field — ProjectID for projects, TaskID for tasks, TimeLogID for time logs, and so on, as listed in each section below.

A Naming Gotcha: Event Prefix vs. Object Name

Two of the 11 objects use an event prefix that does not match the name you might expect from the OData feed or the app's UI. Check this table before wiring up a receiver:

Event PrefixObjectNote
task.*ProjectTasksScheduling tasks — not time log entries. Matches the OData ProjectTasks entity set and its TaskID primary key.
timelog.*TimeLogsTimesheet entries. Matches the OData TimeLogs entity set and its TimeLogID primary key.
subproject.*SubprojectsPhases and sub-project nodes. Primary key field is SubsystemID — a legacy field name carried over from the OData feed.

Every other event prefix (project, user, client, category, expense, inventory, invoice, billingrate) matches its object name directly.

Projects (project.*)

Events: project.created, project.updated, project.deleted  ·  Deleted-event id: ProjectID

FieldJSON TypeNotes
ProjectIDStringPrimary key
ProjectNameStringProject display name
CreatedDateTimeOffsetRecord creation timestamp
ModifiedDateTimeOffsetLast-modified timestamp
StartDateDate or nullScheduled project start date
FinishDateDate or nullScheduled project end date
ProjectLaunchDateDate or nullPlanned or actual launch/go-live date
DeliveryDateDate or nullDelivery or handoff date
DescriptionStringFree-text project description
StatusStringProject status (e.g. Open, On Hold, Closed)
PriorityStringPriority level
ActiveBooleanWhether the project is active (non-archived)
ProjectProjectCodeStringCustom project code or number
BillingTypeStringBilling method code
ProjectClientRateDecimal (4 dp)Default hourly client billing rate
ProjectSalaryRateDecimal (4 dp)Default hourly salary/cost rate
ProjectQtyDecimal (4 dp)Custom quantity field
ProjectQtyBuiltDecimal (4 dp)Quantity completed to date
ProjectQuotedCostDecimal (4 dp)Quoted project cost (contract value)
ProjectQuotedDurationIntegerQuoted duration in hours
POStringPurchase order number
UserText1StringCustom field 1
UserText2StringCustom field 2
UserText3StringCustom field 3
ProjectFolderStringFolder hierarchy path for organizing projects
ClientIDStringFK → Clients
ClientNameStringDenormalized client name
ProjectProjectTypeNameStringProject type classification
ManagerUserNameStringLogin name of the assigned project manager
ManagerFullNameStringFull name of the assigned project manager
ProjectAssemblyLineNameStringAssembly line or workflow name

Tasks (task.*)

Scheduling tasks — the ProjectTasks object, not time log entries. See the TimeLogs section below for timesheet events.

Events: task.created, task.updated, task.deleted  ·  Deleted-event id: TaskID

FieldJSON TypeNotes
TaskIDStringPrimary key
TaskNameStringTask display name
CreatedDateTimeOffsetRecord creation timestamp
ModifiedDateTimeOffsetLast-modified timestamp
StartDateDate or nullScheduled start date
FinishDateDate or nullScheduled finish date (CPM-calculated)
TaskDueDateDate or nullDue date (may differ from FinishDate)
CompletedDateDate or nullActual completion date
DescriptionStringFree-text task description
StatusStringTask status
PriorityStringPriority level
PercentCompleteIntegerCompletion percentage, 0–100
CompletedBooleanTask fully complete flag
BillableBooleanWhether time on this task is billable
TaskDurationHoursDecimal (4 dp)Scheduled duration in decimal hours
ActualHoursDecimal (4 dp)Total hours logged from timesheets for this task
RemainingHoursDecimal (4 dp)Estimated remaining hours to complete
TaskCostClientDecimal (4 dp)Budgeted client cost
TaskCostSalaryDecimal (4 dp)Budgeted salary/internal cost
TaskCostClientActualDecimal (4 dp)Actual incurred client cost to date
TaskCostClientRemainDecimal (4 dp)Remaining client cost forecast
TaskCostSalaryActualDecimal (4 dp)Actual incurred salary cost to date
TaskCostSalaryRemainDecimal (4 dp)Remaining salary cost forecast
TaskClientRateDecimal (4 dp)Effective hourly client rate for this task
TaskSalaryRateDecimal (4 dp)Effective hourly salary rate for this task
TaskQuotedCostDecimal (4 dp)Quoted/estimated cost for the task
TaskQtyDecimal (4 dp)Custom quantity field
TaskQtyBuiltDecimal (4 dp)Quantity built/completed to date
UserText1StringCustom field 1
UserText2StringCustom field 2
UserText3StringCustom field 3
ProjectIDStringFK → Projects
ProjectNameStringDenormalized project name
ClientIDStringFK → Clients
ClientNameStringDenormalized client name
SubsystemIDStringFK → Subprojects
SubsystemNameStringDenormalized subproject/phase name
CategoryIDStringFK → Categories
CategoryNameStringDenormalized category name
TaskProjectTypeNameStringProject type classification inherited from the project
TaskAssemblyLineNameStringAssembly line or workflow name

TimeLogs (timelog.*)

Timesheet entries — one row per logged time entry, linking a user to a project, task, subproject, and category.

Events: timelog.created, timelog.updated, timelog.deleted  ·  Deleted-event id: TimeLogID

FieldJSON TypeNotes
TimeLogIDStringPrimary key
StartTimeDateTimeOffset or nullClock-in date and time
EndTimeDateTimeOffset or nullClock-out date and time
CreatedDateTimeOffsetRecord creation timestamp
ModifiedDateTimeOffsetLast-modified timestamp
DateDate or nullCalendar date of the entry, derived from StartTime
TimeLogDurationHoursDecimal (4 dp)Elapsed hours (EndTime − StartTime)
BillableBooleanWhether the time is billable to the client
BilledBooleanWhether an invoice has been issued for this entry
ApprovedBooleanManager-approved flag
TimeLogCostClientDecimal (4 dp)Hours × client rate
TimeLogCostSalaryDecimal (4 dp)Hours × salary rate
TimeLogClientRateDecimal (4 dp)Effective hourly client billing rate
TimeLogSalaryRateDecimal (4 dp)Effective hourly salary/cost rate
TimeLogQtyDecimal (4 dp)Custom quantity field
UserNameStringLogin name of the employee who logged time
TimeLogUserFullNameStringFull display name of the employee
NotesStringFree-text memo entered by the employee
ProjectNameStringDenormalized project name
ClientNameStringDenormalized client name
TaskNameStringDenormalized task name
SubsystemNameStringDenormalized subproject/phase name
CategoryNameStringDenormalized category name
SubsystemIDStringFK → Subprojects
ProjectIDStringFK → Projects
UserIDStringFK → Users
ClientIDStringFK → Clients
ProjectTaskIDStringFK → Tasks (TaskID) — field names differ
CategoryIDStringFK → Categories
LocationStringPhysical location recorded at time of entry
UserText1StringCustom field 1
UserText2StringCustom field 2
UserText3StringCustom field 3

Subprojects (subproject.*)

Phases and sub-project nodes. The primary key field is SubsystemID — a legacy field name carried over from the database and the OData feed.

Events: subproject.created, subproject.updated, subproject.deleted  ·  Deleted-event id: SubsystemID

FieldJSON TypeNotes
SubsystemIDStringPrimary key
NameStringSubproject display name
CreatedDateTimeOffsetRecord creation timestamp
ModifiedDateTimeOffsetLast-modified timestamp
StartDateDate or nullPhase scheduled start date
FinishDateDate or nullPhase scheduled finish date
SubprojectLaunchDateDate or nullLaunch or go-live date for this phase
ExtendedNameStringFull hierarchical name including parent path
DescriptionStringFree-text description
StatusStringPhase status
PriorityStringPriority level
ActiveBooleanActive/archived flag
LevelIntegerDepth in hierarchy — 1 = top-level phase
OrderIntegerDisplay sort order among siblings
SubprojectProjectCodeStringCustom project code for this phase
SubprojectQuotedDurationIntegerQuoted phase duration in hours
SubprojectQuotedCostDecimal (4 dp)Quoted phase cost
SubprojectClientRateDecimal (4 dp)Default client billing rate for this phase
SubprojectSalaryRateDecimal (4 dp)Default salary/cost rate for this phase
SubprojectQtyDecimal (4 dp)Custom quantity field
SubprojectQtyBuiltDecimal (4 dp)Quantity completed
UserText1StringCustom field 1
UserText2StringCustom field 2
UserText3StringCustom field 3
ProjectIDStringFK → Projects (parent project)
ProjectNameStringDenormalized project name
ParentIDString or emptyFK → Subprojects (parent phase); empty at top level

Users (user.*)

Employees, contractors, machines, and material resources. ResourceType distinguishes the three resource kinds.

Events: user.created, user.updated, user.deleted  ·  Deleted-event id: UserID

FieldJSON TypeNotes
UserIDStringPrimary key
UserNameStringLogin/account name
CreatedDateTimeOffsetRecord creation timestamp
ModifiedDateTimeOffsetLast-modified timestamp
HireDateDate or nullHire or onboarding date
FullNameStringFull display name
EmailStringEmail address
ActiveBooleanActive/inactive flag
AdminBooleanAdministrator rights flag
ContractorBooleanExternal contractor flag
ExemptBooleanFLSA-exempt (salaried) flag
WorkgroupStringWorkgroup assignment name
DepartmentStringDepartment name
EmployeeNumStringEmployee ID number
ResourceTypeStringHuman, Machine, or Materials — the three Maverick resource kinds
UserClientRateDecimal (4 dp)Default hourly client billing rate
UserSalaryRateDecimal (4 dp)Default hourly salary/cost rate
UserMileageRateDecimal (4 dp)Mileage reimbursement rate per mile/km
SkillsStringFree-text skills list
UserRoleStringRole code
ManagerIDString or emptyFK → Users (reporting manager); empty at org top
UserText1StringCustom field 1
UserText2StringCustom field 2
UserText3StringCustom field 3
UserRoleNameStringRole display name
ParentNameStringWorkgroup parent name in the resource tree

Clients (client.*)

Client companies and internal organizations. ThisCompany marks the account holder's own organization.

Events: client.created, client.updated, client.deleted  ·  Deleted-event id: ClientID

FieldJSON TypeNotes
ClientIDStringPrimary key
CompanyNameStringClient company name
CreatedDateTimeOffsetRecord creation timestamp
ModifiedDateTimeOffsetLast-modified timestamp
ActiveBooleanActive/inactive flag
ThisCompanyBooleanMarks the account holder's own company record
DescriptionStringFree-text description
StatusStringClient status
PriorityStringPriority level
ClientTermsStringPayment terms (e.g. "30" for Net 30)
WebStringClient website URL
ClientInvoiceNoteStringDefault note printed on invoices for this client
ClientTaxRateDecimal (4 dp)Default tax rate used when generating invoices
TaxIDStringTax identification number (EIN/VAT)
MainContactStringPrimary contact person name
MainContactPhoneStringPrimary contact phone
MainContactMobileStringPrimary contact mobile
MainContactFaxStringPrimary contact fax
MainContactEmailStringPrimary contact email
MainAddress1StringMain address line 1
MainAddress2StringMain address line 2
MainCityStringMain address city
MainStateStringMain address state/province
MainZipStringMain address postal code
MainCountryStringMain address country
BillingContactStringBilling contact person name
BillingContactPhoneStringBilling contact phone
BillingContactMobileStringBilling contact mobile
BillingContactFaxStringBilling contact fax
BillingContactEmailStringBilling contact email
BillingAddress1StringBilling address line 1
BillingAddress2StringBilling address line 2
BillingCityStringBilling address city
BillingStateStringBilling address state/province
BillingZipStringBilling address postal code
BillingCountryStringBilling address country
CurrencyIDStringCurrency code (e.g. USD, EUR)
ClientFolderStringFolder path for organizing clients

Categories (category.*)

Work categories used to classify time log entries and expenses. Categories can optionally be scoped to a specific project, phase, or user.

Events: category.created, category.updated, category.deleted  ·  Deleted-event id: CategoryID

FieldJSON TypeNotes
CategoryIDStringPrimary key
NameStringCategory display name
CreatedDateTimeOffsetRecord creation timestamp
ModifiedDateTimeOffsetLast-modified timestamp
ActiveBooleanActive/inactive flag
CategoryClientRateDecimal (4 dp)Client billing rate override for this category
CategorySalaryRateDecimal (4 dp)Salary/cost rate override for this category
DescriptionStringFree-text description
ProjectIDString or emptyFK → Projects — when set, category is scoped to this project only
SubsystemIDString or emptyFK → Subprojects — when set, category is scoped to this phase only
UserIDString or emptyFK → Users — when set, category is scoped to this user only
CategoryFolderStringFolder path for organizing categories

Expenses (expense.*)

Expense reports — receipts, mileage, and reimbursements submitted by employees.

Events: expense.created, expense.updated, expense.deleted  ·  Deleted-event id: ExpenseID

FieldJSON TypeNotes
ExpenseIDStringPrimary key
CreatedDateTimeOffsetRecord creation timestamp
ModifiedDateTimeOffsetLast-modified timestamp
ExpenseDateDate or nullDate the expense was incurred
BillableBooleanWhether the expense is billable to the client
BilledBooleanWhether an invoice has been issued for this expense
ReimbursableBooleanWhether the employee is to be reimbursed
ReimbursedBooleanWhether reimbursement has been paid
CompanyPaidBooleanPaid with a company credit card or account
ApprovedBooleanManager-approved flag
ExpenseAmountDecimal (4 dp)Total expense amount
PriceDecimal (4 dp)Unit price (for quantity-based expenses)
ExpenseQtyDecimal (4 dp)Quantity (for quantity-based expenses)
TaxDecimal (4 dp)Tax amount on the expense
ExpenseMileageRateDecimal (4 dp)Per-mile/km reimbursement rate for mileage entries
DistanceDecimal (4 dp)Distance traveled (for mileage entries)
OdometerBeginDecimal (4 dp)Starting odometer reading
OdometerEndDecimal (4 dp)Ending odometer reading
POStringPurchase order number
PayeeStringMerchant or payee name
CheckNumStringCheck number if paid by check
DescriptionStringExpense description
LocationStringLocation where the expense was incurred
UserText1StringCustom field 1
UserText2StringCustom field 2
UserText3StringCustom field 3
UserNameStringDenormalized employee login name
ExpenseUserFullNameStringDenormalized employee full name
ProjectNameStringDenormalized project name
ClientNameStringDenormalized client name
SubsystemNameStringDenormalized subproject/phase name
CategoryNameStringDenormalized category name
ExpenseProjectTypeNameStringProject type classification
InventoryNameStringLinked inventory item name (if expense draws from inventory)
InventoryCodeStringLinked inventory item code
ProjectIDStringFK → Projects
ClientIDStringFK → Clients
UserIDStringFK → Users
SubsystemIDStringFK → Subprojects
CategoryIDStringFK → Categories

Inventory (inventory.*)

Parts, materials, and physical assets tracked in stock.

Events: inventory.created, inventory.updated, inventory.deleted  ·  Deleted-event id: InventoryID

FieldJSON TypeNotes
InventoryIDStringPrimary key
NameStringItem display name
CreatedDateTimeOffsetRecord creation timestamp
ModifiedDateTimeOffsetLast-modified timestamp
ActiveBooleanActive/inactive flag
StatusStringItem status
QtyInStockDecimal (4 dp)Current quantity on hand
QtyWhenToReorderDecimal (4 dp)Reorder point
QtyToReorderDecimal (4 dp)Quantity to order when reordering
CostUnitDecimal (4 dp)Cost per unit (purchase cost)
CostClientDecimal (4 dp)Client billing price per unit
LaborDecimal (4 dp)Labor cost component per unit (for Build items)
DescriptionStringFree-text description
CodeStringInternal item code
UnitsTypeStringUnit of measure (each, lb, ft, etc.)
BuyOrBuildString"Buy" or "Build" sourcing decision
LeadTimeDaysIntegerProcurement lead time in days
WeightStringItem weight
SizeStringItem dimensions or size
ConditionStringPhysical condition (New, Used, Refurbished, etc.)
SKUStringInternal stock keeping unit
VendorSKUStringVendor's item number
MfgSKUStringManufacturer's part number
ModelNumStringModel number
SerialNumStringSerial number
VendorStringVendor/supplier name
ManufacturerStringManufacturer name
LocationStringPhysical storage location
WeblinkStringVendor or product page URL
NotesStringFree-text notes
UserText1StringCustom field 1
UserText2StringCustom field 2
UserText3StringCustom field 3
InventoryFolderStringFolder path for organizing inventory items

Invoices (invoice.*)

Invoice records with totals, due dates, and payment status.

Events: invoice.created, invoice.updated, invoice.deleted  ·  Deleted-event id: InvoiceID

FieldJSON TypeNotes
InvoiceIDStringPrimary key
InvoiceNumStringHuman-readable invoice number (e.g. INV-1042)
CreatedDateTimeOffsetRecord creation timestamp
ModifiedDateTimeOffsetLast-modified timestamp
DateSentDate or nullDate the invoice was sent to the client
InvoiceDueDateDate or nullPayment due date
DatePaidDate or nullDate payment was received
StartRangeDate or nullBilling period start date
EndRangeDate or nullBilling period end date
MilestoneDateDate or nullMilestone date
PaidInFullBooleanInvoice fully paid flag
SubTotalDecimal (4 dp)Subtotal before tax
InvoiceTaxRateDecimal (4 dp)Tax rate applied
TaxAmountDecimal (4 dp)Tax amount
InvoiceAmountDecimal (4 dp)Total invoice amount including tax
AmountPaidDecimal (4 dp)Amount received to date
BalanceDueDecimal (4 dp)Remaining balance
InvoiceTermsStringPayment terms (e.g. "Net 30")
POStringClient purchase order number
InvoiceInvoiceNoteStringNote printed on the invoice
NotesStringInternal memo
RepresentativeStringSales representative name
ClientNameStringDenormalized client name
ProjectNameStringDenormalized project name
SubprojectNameStringDenormalized subproject name
TaskNameStringDenormalized task name
UserNameStringDenormalized user name
MilestoneNameStringMilestone name if invoice is tied to a milestone
ClientIDStringFK → Clients
ProjectIDStringFK → Projects
SubprojectIDStringFK → Subprojects
TaskIDStringFK → Tasks

BillingRates (billingrate.*)

Rate schedule records — hourly client and salary rates scoped by user, project, category, or role, with optional effective date ranges.

Events: billingrate.created, billingrate.updated, billingrate.deleted  ·  Deleted-event id: BillingRateID

FieldJSON TypeNotes
BillingRateIDStringPrimary key
RateTypeStringScope of this rate — "User", "Project", "Category", or "Role"
CreatedDateTimeOffsetRecord creation timestamp
ModifiedDateTimeOffsetLast-modified timestamp
StartDateDate or nullEffective date start
EndDateDate or nullEffective date end
BillingRateClientRateDecimal (4 dp)Hourly client billing rate
BillingRateSalaryRateDecimal (4 dp)Hourly salary/cost rate
UserNameStringDenormalized user name
ProjectNameStringDenormalized project name
CategoryNameStringDenormalized category name
BillingRateRoleNameStringRole name (when RateType = "Role")
UserIDStringFK → Users (when RateType = "User")
ProjectIDStringFK → Projects (when RateType = "Project")
CategoryIDStringFK → Categories (when RateType = "Category")
RoleIDStringRole identifier — no corresponding OData entity set

Delivery, Retries & Signing (Quick Recap)

Full details, code samples, and the Active toggle are covered in the Webhooks Integration guide. The short version:

  • Every payload is signed with HMAC-SHA256 in the X-ST-Webhook-Signature header, formatted sha256=<hex>.
  • Delivery runs on a background task with up to three attempts — immediate, then +5 seconds, then +30 seconds — each with a 10-second timeout.
  • If all three attempts fail, the event is not retried further — there is no persistent retry queue.
  • The Test button in the Webhook Subscriptions dialog sends one hard-coded sample payload per event type and makes exactly one delivery attempt, not three.