Install
openclaw skills install payroll-reconciliationReconcile QuickBooks Online payroll GL accounts against payroll provider reports (Gusto, ADP, Paychex) across 12 categories. Produces an 8-tab Excel workbook covering discrepancies, 941 tax recon, W-2 box verification, headcount, per-employee cost, and CDC logging. Integrates with the Month-End Close pipeline.
openclaw skills install payroll-reconciliationReconciles QuickBooks Online payroll GL accounts against payroll provider reports (Gusto, ADP, Paychex) to catch missed journal entries, manual adjustments, and tax filing discrepancies before they become audit findings or payroll tax penalties.
Use when:
Do NOT use when:
bank-reconciliation-agentpl-deep-analysisscripts/pipelines/payroll-reconciliation.py
# Monthly reconciliation
python3 scripts/pipelines/payroll-reconciliation.py \
--slug CLIENT_SLUG \
--month 2026-03 \
--payroll-file ~/Downloads/gusto-march-2026.csv
# Quarterly 941 reconciliation
python3 scripts/pipelines/payroll-reconciliation.py \
--slug CLIENT_SLUG \
--quarter 2026-Q1 \
--payroll-file ~/Downloads/gusto-q1-2026.csv \
--form-941-file ~/Downloads/941-q1.csv
# Annual W-2 helper
python3 scripts/pipelines/payroll-reconciliation.py \
--slug CLIENT_SLUG \
--year 2026 \
--payroll-file ~/Downloads/gusto-annual-2026.csv \
--w2-mode
# Custom date range
python3 scripts/pipelines/payroll-reconciliation.py \
--slug CLIENT_SLUG \
--start 2026-01-01 --end 2026-06-30 \
--payroll-file ~/Downloads/h1-2026.csv
# Provider analysis only (no QBO connection needed)
python3 scripts/pipelines/payroll-reconciliation.py \
--slug CLIENT_SLUG \
--month 2026-03 \
--payroll-file ~/Downloads/adp-report.csv \
--skip-gl
# Custom output directory
python3 scripts/pipelines/payroll-reconciliation.py \
--slug CLIENT_SLUG \
--month 2026-03 \
--payroll-file ~/Downloads/report.csv \
--out ~/Desktop/reports
| Argument | Required | Description |
|---|---|---|
--slug | Yes | Client QBO slug identifier |
--payroll-file | Yes | Path to payroll provider CSV |
--month | One of | YYYY-MM for single month |
--quarter | One of | YYYY-Q1 through YYYY-Q4 |
--year | One of | Full year (YYYY) for annual/W-2 |
--start / --end | One of | Custom range (YYYY-MM-DD) |
--form-941-file | No | Form 941 CSV for quarterly tax recon |
--w2-mode | No | Enable full W-2 box verification output |
--skip-gl | No | Skip QBO GL pull — provider analysis only |
--sandbox | No | Use QBO sandbox environment |
--threshold | No | Discrepancy threshold (default: $1.00) |
--out | No | Output directory (default: current dir) |
The script auto-detects the payroll provider from CSV headers:
| Provider | Detection Signature |
|---|---|
| Gusto | Headers contain Check Date + Gross Earnings |
| ADP | Headers contain Pay Date + Total Gross |
| Paychex | Headers contain Check Date + Regular Earnings |
| Generic | Fallback — best-effort column matching |
For unsupported formats, rename CSV columns to match any of the above signatures, or use the Generic fallback with standard column names (Gross, FIT, SIT, etc.).
The pipeline reconciles 12 payroll categories between GL and provider:
| # | Category | GL Keywords | 941 Line |
|---|---|---|---|
| 1 | Gross Wages | wages, salaries, payroll-salaries | Line 2 |
| 2 | Federal Income Tax (FIT) | federal withholding, fit, federal tax | Line 3 |
| 3 | State Income Tax (SIT) | state withholding, sit, state tax | — |
| 4 | SS Employer (FICA-SS ER) | social security employer, ss er | Line 5a |
| 5 | SS Employee (FICA-SS EE) | social security employee, ss ee | Line 5a |
| 6 | Medicare Employer (FICA-Med ER) | medicare employer, med er | Line 5c |
| 7 | Medicare Employee (FICA-Med EE) | medicare employee, med ee | Line 5c |
| 8 | FUTA / SUTA | futa, suta, unemployment tax | — |
| 9 | Health Insurance | health insurance, medical, dental | W-2 Box 12C |
| 10 | 401k / Retirement | 401k, retirement, pension | W-2 Box 12D |
| 11 | Workers Compensation | workers comp, wc premium | — |
| 12 | PTO Accrual | pto, vacation accrual, leave accrual | — |
Discrepancy threshold: ±$1.00 per category (configurable via --threshold).
Three sections:
payroll-recon_{slug}_{period}.xlsx
Examples:
payroll-recon_sb-paulson_2026-03.xlsxpayroll-recon_willo-salons_2026-Q1.xlsxpayroll-recon_glowlabs_2026.xlsxpip install openpyxl
Node.js QBO client (auth token required for GL pull).
Change data is persisted at:
.cache/payroll-reconciliation/{slug}.json
Keeps last 24 periods. Delete to reset baseline.
This pipeline integrates with the Month-End Close checklist
(scripts/pipelines/month-end-close.py). Run sequence:
payroll-reconciliation.py for the closed month--year + --w2-mode for Box verificationIf providing a 941 CSV (--form-941-file), the pipeline expects columns:
line, amount
Example rows:
Line 2 - Total wages, 125000.00
Line 3 - Federal income tax withheld, 18750.00
Line 5a - Social security wages, 15500.00
Line 5c - Medicare wages, 3625.00
Line 6 - Total taxes, 37875.00
Column names are matched case-insensitively. Extra columns are ignored.
"QBO CLI error (exit 1)" → Refresh the QBO auth token for this client slug.
"Payroll file not found"
→ Verify the path in --payroll-file. Use absolute path if needed.
"Provider detected: Generic" → Column headers didn't match Gusto/ADP/Paychex signatures. Results are best-effort. → Rename columns or use the Generic field names listed in the parser section.
All categories show $0 for GL
→ GL pull succeeded but no accounts matched payroll keywords.
→ Check QBO account names — they may use custom names. Add keywords to PAYROLL_ACCOUNT_KEYWORDS.
Discrepancy threshold too sensitive
→ Use --threshold 5.00 to allow up to $5 variance (useful for rounding-heavy providers).
Decimal — no float arithmetic anywhere.