Khaonix for payroll

What Khaonix verifies in payroll today, which document pairs are available, what a control covers, and how a run works. The product is PayrollCompare AI; the first market is Switzerland.

Two kinds of pair

Trigger against result

A letter against the payslip it should have produced. This is the control. It applies to any document that authorises a change to pay: today the salary letter and the termination letter.

Result against result

Payslip against payslip, before and after a change. This is the comparison. It only makes sense for the document the process produces, so for now it is payslips only; letters are not compared with letters.

Document pairs

Each pair is a defined control, qualified against a frozen test population before it is used on a client's documents. Status as of October 2026.

Trigger against result
Salary letter→Payslip

Annual salary against monthly salary in 12 or 13 instalments, bonus, effective date, employee identity. Verified in the month the change takes effect.

Available. Swiss layouts, German and French.
Trigger against result
Termination letter→Final payslip

Leaving date, final month's salary, vacation payout, pro rata 13th month, severance and other settlement items against the letter.

In qualification. Same method as the salary letter control.
Result against result
Payslip→Payslip

Every monetary field on every payslip: same, changed, missing or added. Pairs matched on employee number and name across both sets, independent of system or name order.

Available. Swiss layouts, German and French.

Your own letter templates, additional document types and other payslip layouts are added through the same specification and qualification. The method does not change, only the documents.

What a control covers, and what it does not

A control states exactly which fields it evaluates. Anything outside it is reported as not evaluated, never as fine, so coverage is a number you see on every run.

PayAnnual and monthly salary, hourly wage, 13th month, bonus and one-off payments, allowances, with a tolerance you define.
Period and datesPayslip period against effective date, leaving date, payment date.
IdentityEmployee number and name, matched across systems that order or abbreviate names differently.
Totals and deductionsGross, net and payment amount, social insurance and pension deductions, in the payslip-against-payslip comparison.
PairingA letter without a payslip, a payslip without a letter, or two candidates for one person are reported as unpaired, never dropped.
Not evaluatedFields not in the control, and values the model could not read with confidence, are listed as such on the review page.

The review page

A person only sees what did not verify. Each case shows both documents side by side, the fields compared drawn on the page, both values and the rule that failed.

Salary letter against payslipOctober 2026 runDifferences only
950pairs
947verified
2differences
1unpaired
99.7%coverage
For review (3)
A. Muster000001 · bonusDIFF
C. Muster000347 · salaryDIFF
D. Muster000515 · no payslipUNPAIRED
Verified (947)
Listed with evidence
Salary letter, page 112 Sep 2026
Dear Ms Muster,
Your annual salary is increased to CHF 125,000, effective 1 October 2026, paid in 13 instalments.
A bonus of CHF 10,000 will be paid with your October salary.
Payslip, page 1A. Muster, 000001
PeriodOctober 2026
Monthly salary9,615.38
Bonus8,000.00
Family allowance200.00
Gross salary17,815.38
AHV/IV/EO 5.3%-944.22
ALV 1.1%-195.97
BVG-612.50
Net salary15,920.17
Bonus · DIFFletter 10,000.00 → payslip 8,000.00
rule: payslip.bonus = letter.bonus
Salary · SAME125,000 ÷ 13 = 9,615.38
variant held: 13 instalments
Period · SAMEOctober 2026 ≥ 1 Oct 2026
effective date in period

The review page for one run: the run in numbers, the queue of exceptions, both documents with the compared fields drawn on the page, and the evidence for each rule. Illustrative, with sample documents.

report.jsonexcerpt, one pair
{
  "employee_id": "000001",
  "period": "2026-10",
  "fields": {
    "salary":  { "letter": 125000.00, "payslip": 9615.38, "status": "SAME" },
    "bonus":   { "letter": 10000.00,  "payslip": 8000.00, "status": "DIFF" },
    "period":  { "letter": "2026-10-01", "payslip": "2026-10", "status": "SAME" }
  }
}  // the full record adds page positions and versions
summary.xlsxone row per field compared
EmployeeFieldReferenceOutcomeStatusRule
000001salary125,000.009,615.38SAME÷ 13
000001bonus10,000.008,000.00DIFFeq
000002salary98,400.007,569.23SAME÷ 13
000515salary112,000.00UNPAIRED
RunQueueValuesPairs

The same run as a machine-readable report for the audit trail or a workflow, and as a spreadsheet for everyone else.

How a run works

1

Upload

The trigger documents and the payslips of one run, as PDF. No system access, no export format to agree, no interface to build.

2

Pair and compare

Khaonix pairs each letter with its payslip, reads both, applies the control and records the evidence for every field.

3

Review

The exceptions appear on the review page. Verified cases are listed with their evidence, not shown one by one.

4

Export and delete

One download holds the report, the review pages and a spreadsheet summary. The run is then deleted from the service; unexported runs expire on their own.

Two ways in, for two purposes. The browser interface is for bulk checks: a monthly run, a migration, a baseline, done by a person who uploads a set of documents and reviews the exceptions. In an automated workflow Khaonix is called through the API: the workflow submits the documents of a case or a run, receives the result as JSON, and routes the exceptions. Either way there is no connection to the systems that produced the documents.

Runs as a service hosted in the EU, or on your own servers where your security and compliance requirements ask for it. See Security and privacy.

Start with a baseline.

One payroll month, or a handful of letter-and-payslip pairs, anonymised if you prefer. You see the review page, the evidence and the coverage on your own documents. Then decide what to automate.