# Payroll Liability Reconciler

> Ties gross-to-net per period and catches the employer-vs-employee coding errors that hide in a payroll liability balance. Not tax advice; never posts.

- Agent: Claude Code
- Plan: Starter (1 vCPU, 2 GiB RAM, 10 GiB disk)
- Forks: 0 · Stars: 0
- Creator: https://www.jurniti.com/creator-ca0ff2
- Tags: accounting, bookkeeping, claude-code, payroll, quickbooks, small-business
- Requires config (you provide): ANTHROPIC_API_KEY
- Skills: payroll-reconciler

**To fork:** open https://www.jurniti.com/templates/payroll-liability-reconciler and use the Fork action — it starts a Stripe Checkout for a new VM seeded with this template's persist disk (same flat plan price, no fork fee).

## README

# The payroll liability balance nobody can explain

Somewhere the employer FICA share got booked as a liability instead of an expense,
a state unemployment payment never matched, and a garnishment landed in the wrong
account.

It's been like that for four months because nobody wants to open it.

## The split is where the errors hide

This is the rule that catches real problems: **employee withholding is a liability
you hold and remit. The employer share is an expense.** Confusing the two is the
most common payroll coding error in a small business, and it's invisible in a
balance total.

Four specific checks:

1. **FICA** — employer matches employee. Unequal means one is mis-coded.
2. **Unemployment (FUTA/SUTA)** — employer-only. Any employee-side amount is an
   error.
3. **Benefits** — employer contribution is expense; the employee premium is a
   deduction, not an expense.
4. **Garnishments** — always a liability, never an expense.

Findings name the account *and* the amount: *employer FICA of $1,240 is coded to a
liability account; employee FICA is $1,190; these should match and one is
mis-coded.*

## Two tie-outs, both printed

```
gross − employee_taxes − employee_deductions = net_pay
total_cash_out = net_pay + tax_deposits + benefit_remittances + fees
```

If either doesn't hold, that's a finding with the exact amount. **Never plug** — a
variance is reported with candidate causes (a misclassified employer share, an
unmatched remittance, a period cut-off), never smoothed away.

## Stale liabilities are a red flag

Every open liability gets aged against your deposit schedule. Anything older than
one period means a deposit was missed or a payment never matched.

## What you supply

Your own Claude Code login, plus two exports into `~/payroll/exports/` — a payroll
register with the tax and deduction breakout, and your ledger's payroll liability
accounts (QuickBooks: Payroll Liability Balances + Payroll Summary).

No API key. Exports are the input, which is also why nothing can post or file.

If your register lacks the employer/employee breakout the split checks can't run —
and it says so rather than guessing.

## Where this stops

`NOT TAX ADVICE` on line one. It does not post journal entries, file returns, or
pay a liability.

It won't state deposit schedules or penalties as fact — it says "confirm your
deposit schedule", because they vary by lookback and they change. Exempt/non-exempt
questions and state requirements route to the **For your CPA** section.

Verified on build: the skill, the working tree, both guards, the split rule, all
four checks and the never-plug rule are present on a fresh fork. Running it on your
own books is yours to do.
