Incentives by Date Range
Returns staff incentives and commissions for a date range, at one row per timesheet entry per incentive component. Base activity wages are not included - those come from Wages by Date Range.
There is no server-side aggregation. The per-component grain is deliberate: it is the only grain from which every resort's payroll policy can derive its own totals.
This is a read-only reporting feed; nothing is written.
Authentication
Authorization: Bearer {access_token}Endpoint
GET {api-url}/api/timekeeping/incentivesQuery parameters
startDate
date
Required. Start of the range (YYYY-MM-DD).
endDate
date
Required. End of the range (YYYY-MM-DD).
updatedAfterLocalDateTime
date-time
Required. Only entries updated after this time. Interpreted in resort-local time, not UTC - convert using the timezone from Resort Details.
seasonId
integer
Required. The season to report on.
includeResolutionStatus
boolean
Optional, defaults to false. Opt in to the resolutionStatus field - see below.
Response
200 with an array of incentive rows.
Each row carries the same employee and entry context as the wage feed: seasonId, seasonName, payrollId, employeeIdentifier, employeeName, flaikEmployeeId, timesheetId, timesheetStatus, timesheetDate, startTime, endTime, paidActivityGroupId, paidActivityGroupName, paidActivityId, paidActivityName, paidActivityType.
The incentive-specific fields:
type
string
"staffIncentive" or "commission". Unknown sections pass through with their raw section name rather than being dropped.
sourceKey
string?
Raw key of the component. null on unparseable rows.
incentiveId / incentiveName
integer? / string?
The incentive, when resolved
amount
decimal
The incentive or commission amount
minutes
integer
Minutes attributed to this component
guestCount
integer?
Commission only - null on staff-incentive rows
guestDetails
string?
Commission only
payCodeId / payCodeName / payCodeType / payCodeCostCentre
The incentive's own resolved pay code - not the parent activity's
businessStructureId / businessStructureName / costCentre / exportBusinessStructureName / externalId / locationName / parentPath
Resolved from the parent entry's paid activity
jobCodeId / jobCodeName / jobCodeType / jobCodeCostCentre
Resolved from the parent entry
isAutoAppliedToStaff
boolean?
Whether the incentive is applied automatically
resolutionStatus
string?
null unless includeResolutionStatus=true - see below
Rows are never dropped
Set includeResolutionStatus=true to have each row explain why its component did or did not resolve:
resolved · hardcodedCommission · unknownSection · unknownIncentive · missingPayCode · unparseable
It is off by default so the feed is not treated as a configuration validator. Rows are returned either way - a component that failed to resolve is surfaced for review, never silently dropped. An unparseable row indicates corrupt incentive detail worth manual review.
Turning it on for a first integration run is a good way to surface resort configuration gaps before you rely on the totals.
The three timekeeping feeds
per timesheet entry
wages and commission combined - supported, in production use
Incentives by Date Range (this page)
per entry x incentive component
staff incentives and commissions
No entry-level join key back to the wage feed. Incentive rows are self-contained - they carry their own employee, entry and cost-centre context precisely so they can be consumed without a join. One timesheet entry produces exactly one wage row but zero or many incentive rows, so the two feeds cannot be summed naively.
Need help? Contact resortsupport@flaik.com.
Was this helpful?
