Reference
Event catalogue
62 events, each with the capability a key needs to subscribe and the fields its payload carries. Payloads are identifiers, states and timestamps only — no names, titles or free text — so read the details you need through the API with the ids you receive. That is a privacy rule, not a style choice: the event log is outside the reach of anonymisation.
Machine-readable
The same catalogue is served as JSON Schema (draft 2020-12), so you can generate types and validate deliveries instead of trusting this table.
curl https://api.kelomo.fi/v1/webhook-events \
-H "Authorization: Bearer kelomo_…"
# → { "events": [ { "event": "workday.approved",
# "capabilities": ["worktime.supervise"],
# "payloadSchema": { "$schema": "…draft/2020-12/schema", … } } ] } Subscribe with POST /v1/webhooks. Subscribing to an event also requires the capability that guards it — a key that cannot see payroll data cannot receive payroll events either.
The events
quote.decided
Capability: crm.useprojects.manage
| Field | Type |
|---|---|
quoteId | string |
quoteKey | string |
decision | "accepted" | "declined" |
projectId | string | null |
batch.created
Capability: payroll.runprojects.manage
| Field | Type |
|---|---|
batchId | string |
lineCount | integer |
customerCount | integer |
grossCents | integer |
periodFrom | string |
periodTo | string |
status_update.posted
Capability: projects.read
| Field | Type |
|---|---|
projectId | string |
statusUpdateId | string |
rag | string |
createdAt | string |
deal.won
Capability: crm.use
| Field | Type |
|---|---|
dealId | string |
customerId | string | null |
valueCents | integer | null |
wonAt | string | null |
projectId | string | null |
lead.created
Capability: crm.use
| Field | Type |
|---|---|
leadId | string |
source | string | null |
workday.approved
Capability: worktime.supervise
| Field | Type |
|---|---|
workDayId | string |
membershipId | string |
workDate | string |
approvedAt | string |
export_batch.created
Capability: payroll.run
| Field | Type |
|---|---|
batchId | string |
periodStart | string |
periodEnd | string |
dayCount | integer |
groupId | string | null |
createdAt | string |
export_batch.delivered
Capability: payroll.run
| Field | Type |
|---|---|
batchId | string |
targetId | string |
deliveryId | string |
transport | string | null |
deliveredAt | string | null |
export_batch.delivery_failed
Capability: payroll.run
| Field | Type |
|---|---|
batchId | string |
targetId | string |
deliveryId | string |
transport | string | null |
failedAt | string |
absence.submitted
Capability: worktime.supervise
| Field | Type |
|---|---|
periodId | string |
membershipId | string |
startDate | string |
endDate | string |
status | string |
absence.decided
Capability: worktime.supervise
| Field | Type |
|---|---|
periodId | string |
membershipId | string |
startDate | string |
endDate | string |
status | string |
shift.published
Capability: scheduling.plan
| Field | Type |
|---|---|
publishEventId | string |
planningUnitId | string |
periodFrom | string |
periodTo | string |
publishedCount | integer |
recipientCount | integer |
invoice.issued
Capability: payroll.run
| Field | Type |
|---|---|
invoiceId | string |
invoiceNumber | string |
customerId | string | null |
totalGrossCents | integer |
dueDate | string | null |
issuedAt | string |
invoice.credited
Capability: payroll.run
| Field | Type |
|---|---|
creditNoteId | string |
originalInvoiceId | string |
totalGrossCents | integer |
createdAt | string |
invoice.dispatched
Capability: payroll.run
| Field | Type |
|---|---|
invoiceId | string |
dispatchId | string |
channel | string |
dispatchedAt | string |
invoice.delivered
Capability: payroll.run
| Field | Type |
|---|---|
invoiceId | string |
dispatchId | string |
deliveredAt | string |
invoice.delivery_failed
Capability: payroll.run
| Field | Type |
|---|---|
invoiceId | string |
dispatchId | string |
failedAt | string |
payment.recorded
Capability: payroll.run
| Field | Type |
|---|---|
paymentId | string |
invoiceId | string | null |
amountCents | integer |
recordedAt | string |
payment.allocated
Capability: payroll.run
| Field | Type |
|---|---|
paymentId | string |
invoiceId | string |
amountCents | integer |
allocatedAt | string |
payment.imported
Capability: payroll.run
| Field | Type |
|---|---|
importBatchId | string |
entryCount | integer |
importedAt | string |
invoice.overdue
Capability: payroll.run
| Field | Type |
|---|---|
invoiceId | string |
dueDate | string |
overdueDays | integer |
invoice.drafts_ready
Capability: payroll.runprojects.manage
| Field | Type |
|---|---|
draftCount | integer |
createdAt | string |
recurring_plan.run_completed
Capability: payroll.runprojects.manage
| Field | Type |
|---|---|
runId | string |
draftCount | integer |
completedAt | string |
batch.delivered
Capability: payroll.run
| Field | Type |
|---|---|
batchId | string |
targetId | string | null |
deliveredAt | string |
workday.confirmed
Capability: worktime.supervise
| Field | Type |
|---|---|
workDayId | string |
membershipId | string |
workDate | string |
confirmedAt | string |
workday.returned
Capability: worktime.supervise
| Field | Type |
|---|---|
workDayId | string |
membershipId | string |
workDate | string |
returnedAt | string |
workday.corrected
Capability: worktime.supervise
| Field | Type |
|---|---|
workDayId | string |
membershipId | string |
workDate | string |
correctedAt | string |
workday.unapproved
Capability: worktime.supervise
| Field | Type |
|---|---|
workDayId | string |
membershipId | string |
workDate | string |
unapprovedAt | string |
absence.cancelled
Capability: worktime.supervise
| Field | Type |
|---|---|
periodId | string |
membershipId | string |
startDate | string |
endDate | string |
cancelledAt | string |
absence.certificate_provided
Capability: worktime.supervise
| Field | Type |
|---|---|
periodId | string |
membershipId | string |
providedAt | string |
shift.changed
Capability: scheduling.plan
| Field | Type |
|---|---|
shiftId | string |
planningUnitId | string |
workDate | string | null |
changedAt | string |
open_shift.claimed
Capability: scheduling.plan
| Field | Type |
|---|---|
openShiftId | string |
claimId | string |
membershipId | string |
claimedAt | string |
open_shift.claim_decided
Capability: scheduling.plan
| Field | Type |
|---|---|
claimId | string |
openShiftId | string |
membershipId | string |
decision | string |
decidedAt | string |
shift_swap.proposed
Capability: scheduling.plan
| Field | Type |
|---|---|
swapId | string |
fromMembershipId | string |
toMembershipId | string |
proposedAt | string |
shift_swap.decided
Capability: scheduling.plan
| Field | Type |
|---|---|
swapId | string |
decision | string |
decidedAt | string |
export_batch.cancelled
Capability: payroll.run
| Field | Type |
|---|---|
batchId | string |
cancelledAt | string |
payroll_period.locked
Capability: payroll.run
| Field | Type |
|---|---|
lockId | string |
periodStart | string |
periodEnd | string |
lockedAt | string |
payroll_period.lock_lifted
Capability: payroll.run
| Field | Type |
|---|---|
lockId | string |
liftedAt | string |
member.created
Capability: members.manage
| Field | Type |
|---|---|
membershipId | string |
role | string |
createdAt | string |
member.invited
Capability: members.manage
| Field | Type |
|---|---|
membershipId | string |
invitedAt | string |
member.deactivated
Capability: members.manage
| Field | Type |
|---|---|
membershipId | string |
deactivatedAt | string |
employment.terminated
Capability: hr.managemembers.manage
| Field | Type |
|---|---|
membershipId | string |
endDate | string |
recordedAt | string |
task.created
Capability: projects.read
| Field | Type |
|---|---|
taskId | string |
projectId | string | null |
createdAt | string |
task.status_changed
Capability: projects.read
| Field | Type |
|---|---|
taskId | string |
status | string |
changedAt | string |
task.approval_responded
Capability: projects.read
| Field | Type |
|---|---|
taskId | string |
approvalId | string |
decision | string |
respondedAt | string |
quote.sent
Capability: crm.useprojects.manage
| Field | Type |
|---|---|
quoteId | string |
quoteKey | string |
sentAt | string |
quote.accepted
Capability: crm.useprojects.manage
| Field | Type |
|---|---|
quoteId | string |
quoteKey | string |
acceptedAt | string |
deal.lost
Capability: crm.use
| Field | Type |
|---|---|
dealId | string |
customerId | string | null |
lostAt | string |
deal.stage_changed
Capability: crm.use
| Field | Type |
|---|---|
dealId | string |
stageId | string |
changedAt | string |
lead.converted
Capability: crm.use
| Field | Type |
|---|---|
leadId | string |
dealId | string | null |
customerId | string | null |
convertedAt | string |
intake.received
Capability: projects.manage
| Field | Type |
|---|---|
intakeItemId | string |
source | string | null |
receivedAt | string |
change_order.approved
Capability: projects.manage
| Field | Type |
|---|---|
changeOrderId | string |
projectId | string |
approvedAt | string |
project.created
Capability: projects.read
| Field | Type |
|---|---|
projectId | string |
createdAt | string |
project.closed
Capability: projects.read
| Field | Type |
|---|---|
projectId | string |
closedAt | string |
contact.anonymized
Capability: crm.use
| Field | Type |
|---|---|
contactId | string |
anonymizedAt | string |
lead.anonymized
Capability: crm.use
| Field | Type |
|---|---|
leadId | string |
anonymizedAt | string |
invoice.paid
Capability: payroll.run
| Field | Type |
|---|---|
invoiceId | string |
invoiceNumber | string |
totalGrossCents | integer |
paidAt | string |
customer.created
Capability: crm.useprojects.manage
| Field | Type |
|---|---|
customerId | string |
createdAt | string |
customer.updated
Capability: crm.useprojects.manage
| Field | Type |
|---|---|
customerId | string |
updatedAt | string |
project.updated
Capability: projects.read
| Field | Type |
|---|---|
projectId | string |
updatedAt | string |
member.updated
Capability: members.manage
| Field | Type |
|---|---|
membershipId | string |
updatedAt | string |
shift.unpublished
Capability: scheduling.plan
| Field | Type |
|---|---|
publishEventId | string | null |
planningUnitId | string |
periodFrom | string |
periodTo | string |
unpublishedCount | integer |
unpublishedAt | string |