payrolldataspecs.com

Write-back · guide

Idempotency and payroll cut-offs for benefits deduction writes

Send every deduction write with a deterministic idempotency key derived from employee and pay period, retry only inside the window your vendor honours it (five minutes on Bindbee), treat timeouts as landed, and because Bindbee's API does not expose the payroll cut-off, read the run back after a sync to confirm which period the line landed in.

By Eli Wilson · Published

Short answer: send every deduction write with an X-Idempotency-Key derived from the employee and the pay period (for example payroll-{employee_id}-{period_end}), and know how long your vendor honours it. On Bindbee, the key is honoured for five minutes, so retry only within five minutes with the same key. Treat a timeout as landed, and after the window, confirm by reading the payroll run back after a sync instead of retrying blindly. Your own ledger, not the key, is the long-term guard against duplicates. For cut-offs, the key fact is that Bindbee’s API does not expose the payroll cut-off, so plan without it. A write that arrives after a period closes can land in the next open period, so check start_date, end_date and check_date on the read-back and reconcile. Of the seven vendors compared below, four document a unified deduction write (Bindbee, Finch, Knit, Unified.to), and only Bindbee’s idempotency behaviour was verified for this piece; ask the others in writing.

The mechanics below use Bindbee’s POST /employee-payroll-runs as the worked example, because its idempotency and period semantics are documented in enough detail to show; it is how deductions are written there. Each write is a line in one pay period or one payroll run, not a standing deduction election (create employee payroll runs), so an ongoing deduction means a write every period. Write: Supported (write payroll deductions). For the end-to-end flow, see writing benefits deductions back into payroll after enrollment.

Comparison: deduction write and its safety mechanics (as of 1 Oct 2026)

Who can write a deduction, and where:

VendorUnified deduction writePayroll systems documentedShape of the write
BindbeePOST /employee-payroll-runs (earnings, deductions, taxes)Write: SupportedOne line per pay period or payroll run; no update endpoint
MergeNot documented in Merge’s HRIS common modelsNot applicableHRIS writes documented for Employees and Time Off
FinchDeductions (write) on Pro, marked “Employer Fee Required”: retirement, medical, dental, vision, HSA/FSA, commuter; pre/post-tax; company contributionsPer-system list not verified for this pieceNot verified
KomboNone in Kombo’s OpenAPINot applicableHRIS writes cover employees, documents, absences, skills; DATEV raw file passthrough
ApideckNone (no POST/PATCH on payroll, deductions or benefits in the HRIS spec)Not applicablePayroll is read-only
KnitCreate company deduction; enroll, update and unenroll employee deductionEnroll: ADP Run, ADP WFN, Paycor, Paychex, Paylocity, PrismHR, Avionte, QuickBooks Payroll. Update: ADP Run, ADP WFN, Paycor, Paychex, Paylocity. Unenroll: those five plus QuickBooks Payroll. Company deduction: ADP Run, Workday, QuickBooks Payroll, NetSuite PayrollEnrollment-style operations with an update endpoint
Unified.toCreate a deduction, Update a deduction endpointsOf US systems checked, only Paylocity lists create/update/remove. Paychex and UKG Pro list remove only. ADP WFN, Paycor, UKG Ready: read onlyUnsupported operations return 501

Safety mechanics:

VendorIdempotencyWhen the write is visible to readsPayroll cut-off exposed
BindbeeX-Idempotency-Key header, honoured for five minutes; same key with a different body returns 409 (idempotency docs). Passthrough writes cannot carry a keyWrite goes straight to the source and returns its response; readable via GET after the next sync, or sooner with an on-demand resyncNo
MergeNot applicableNot applicableNot applicable
FinchNot verifiedAssisted connections: changes written back within 2 business daysNot verified
KomboNot applicableNot applicableNot applicable
ApideckNot applicableNot applicableNot applicable
KnitNot verifiedNot verifiedNot verified
Unified.toNot verifiedNot verified (reads pass through to the source, per Unified.to)Not verified

“Not verified” means it was not researched for this piece; it is not a claim the feature is missing.

The two failure modes

1. Duplicates

A duplicate deduction is the worst outcome of this integration: an employee is charged twice and payroll staff have to reverse it by hand. It usually comes from retries:

What to do

The defences below are written against Bindbee’s documented behaviour. Where a vendor’s idempotency is not documented, assume none and lean harder on your ledger.

What a write and its responses look like

curl --request POST \
  --url 'https://api.bindbee.dev/api/hris/v1/employee-payroll-runs' \
  --header 'Authorization: Bearer <BINDBEE_API_KEY>' \
  --header 'X-Connector-Token: <CONNECTOR_TOKEN>' \
  --header 'X-Idempotency-Key: payroll-{employee_id}-{period_end}-{code}' \
  --header 'Content-Type: application/json' \
  --data @deduction.json

How Bindbee responds to a key:

You sendBindbee doesYour next step
A new keyProcesses the write and sends it to the providerRecord the returned ID
The same key and body, after success, within five minutesReturns the saved response, with no second provider writeTreat any 2xx as success; a replayed response can carry a different status code
The same key while the first is still running409, “Request with this idempotency key is already in progress.”Wait briefly, retry the same key
The same key with a different body409, “Idempotency key already exists with a different payload.”Check the body; use a new key only for a genuinely new write
The same key after a failed attemptProcesses the request againRetry is safe
The same key after five minutesMay treat it as a new requestDon’t; check your ledger and read back instead

2. Missed or misplaced cut-offs

Payroll periods close. Bindbee’s docs say a late write can land in the next open period, and the cut-off is not exposed through the API. So:

Mechanics per connector

Before writing, call GET /employee-payroll-runs/meta/post. It returns the connector’s schema, required fields and integration_params. The bodies differ:

Each write also names the period it belongs to (create employee payroll runs):

A line applies to that one period or run only. It is not a recurring election, so an ongoing deduction is written every period, and stopping a deduction means not writing it for the next period.

Read the customer’s payroll codes with GET /payroll-codes (type EARNING, DEDUCTION or TAX). Use sub_type (HEALTH, RETIREMENT, GARNISHMENT and others) to classify codes without parsing names. Which code maps to which plan is the customer’s decision. Store it as configuration per employer.

Workday’s one-deduction-per-request rule matters for idempotency: a medical + dental + HSA change is three requests and needs three keys, so put the payroll code in the key.

Changing an existing deduction

There is no PATCH or PUT for deductions. Because each write targets one pay period or payroll run, a change is simply a different line in the next period you write, and stopping a deduction means not writing it next period. The one point Bindbee’s docs do not cover is a second write with the same code in the same period: whether it adds to or replaces the first is not documented, so read the run back to confirm before you rely on a same-period correction. Bindbee’s guidance for a late change is to treat it as an adjustment in the following period. Keep your own ledger per employee, code and period, and reconcile it against the read-back runs after each sync.

This is a real difference between vendors. Knit documents an update-employee-deduction endpoint (ADP Run, ADP WFN, Paycor, Paychex, Paylocity), and Unified.to documents Deduction update on Paylocity. Whether those change a standing deduction in the payroll system, and how they interact with cut-offs, was not verified for this piece; read the vendor’s docs for each system before relying on them.

A correction is a new logical write and needs a new key. A key derived only from employee and period collides on a same-period correction: the same key with a different body returns 409 (“Idempotency key already exists with a different payload”). Include a version or ledger line ID in the key.

Compensation has no unified write model at all. Where the source vendor allows it, compensation changes go through passthrough. Passthrough does not accept X-Idempotency-Key, so a retried passthrough write reaches the vendor as a second write. Deduplicate on your side before you retry.

Limits by vendor

Frequently asked

What should the idempotency key be?
Something deterministic from employee, period and (if you write several deductions per period) payroll code, such as `payroll-{employee_id}-{period_end}-{code}`. Never a fresh random value per retry. For a correction in the same period, add a version or ledger line ID, because reusing a key with a different body returns `409`.
My write timed out. Should I retry?
Retry within five minutes with the same key. After that, force a resync and read back before you write again. Bindbee's docs say a timed-out write has still reached the provider.

Source limits

Documentation comparison as of 1 Oct 2026; nothing verified hands-on. Only Bindbee's idempotency behaviour was verified from its docs; idempotency, read-after-write and cut-off exposure for Finch, Knit and Unified.to were not verified, and 'not verified' is not a claim the feature is missing. Finch's per-system write list and the semantics of Knit's and Unified.to's update endpoints were not verified. Whether a second same-code write in the same period adds to or replaces the first is not documented by Bindbee.

Sources checked

Source Publisher Document date We checked
Write payroll deductions Bindbee — 2026-10-01
Create employee payroll runs Bindbee — 2026-10-01
Idempotency Bindbee — 2026-10-01
Writing data Bindbee — 2026-10-01
Resync connector Bindbee — 2026-10-01
Payroll data model Bindbee — 2026-10-01
Passthrough Bindbee — 2026-10-01
Rate limits Bindbee — 2026-10-01
Sync frequency Bindbee — 2026-10-01
Model availability Bindbee — 2026-10-01
Bindbee vs Kombo (Bindbee-authored) Bindbee — 2026-10-01
Merge docs Merge — 2026-10-01
Finch pricing Finch — 2026-10-01
Finch Deductions Finch — 2026-10-01
Finch integration types Finch — 2026-10-01
Kombo Kombo — 2026-10-01
Kombo OpenAPI Kombo — 2026-10-01
Apideck HRIS OpenAPI spec Apideck — 2026-10-01
Knit developer docs — Create deduction, Enroll employee in deduction, Update employee deduction, Unenroll employee from deduction Knit — 2026-10-01
Unified.to HRIS overview Unified.to — 2026-10-01
Unified.to integrations (per-integration Deduction methods) Unified.to — 2026-10-01

Wrong or out of date? payrolldataspecs@gmail.com — corrections are free. How claims are scored: methodology.