Payroll
Solid Accounting does not run payroll. We deliberately don't compute withholdings, file 941s, deposit taxes, or print W-2s — those are heavily-regulated activities with state-by-state nuances we don't try to replicate. Instead, Solid is a post-payroll system: you run payroll through a dedicated provider and post the results into Solid's GL.
Three paths from payroll provider → Solid:
| Path | Best for |
|---|---|
| Manual journal entry | Once-a-month payroll, simple structure, owner-only files |
| Payroll CSV import | Most small businesses with a payroll provider — Gusto, OnPay, ADP, Paychex, Justworks |
| Payroll API sync | Pro/Accountant tier; auto-pulls from Gusto/OnPay/ADP via OAuth |
The accounting model
Every payroll cycle posts a journal entry that:
- Debits the gross wages expense account (
WagesorPayroll Expense) for the full gross pay - Debits the employer-side payroll-tax expense (
Payroll Tax Expense) for employer FICA, FUTA, SUTA - Debits any company-paid benefits (
Health Insurance Expense,401(k) Match Expense, etc.) - Credits liability accounts for everything not yet paid out:
Federal Tax Payable— withheld federal income tax + employee FICA + employer FICAState Tax Payable— state income tax withheldFUTA Payable/SUTA Payable— federal/state unemploymentHealth Insurance Payable— premiums withheld + company portion401(k) Payable— employee deferrals + employer matchGarnishments Payable— court-ordered or otherwise
- Credits the bank account for net pay
A typical bi-weekly payroll for one employee posts ~10 lines. For a 20-employee company with health insurance and a 401(k), the journal entry can have 50+ lines.
Bi-weekly payroll — period ending 04/26/2026
DR Wages — Sales 14,200.00
DR Wages — Engineering 22,400.00
DR Wages — G&A 8,600.00
DR Payroll Tax Expense 3,470.40
DR Health Insurance Expense 4,200.00
DR 401(k) Match Expense 1,460.00
─────────
54,330.40
CR Federal Tax Payable 7,540.00
CR State Tax Payable 2,108.00
CR FUTA Payable 22.50
CR SUTA Payable 198.00
CR FICA Payable (employee + employer) 5,648.40
CR Health Insurance Payable 4,200.00
CR 401(k) Payable 3,560.00
CR Garnishments Payable 150.00
CR Operating Checking (net pay) 30,903.50
─────────
54,330.40
The trick to clean payroll posting: every payroll cycle uses the same account structure, in the same order, every time. Set up the recurring template once and don't deviate.
Path 1 — Manual journal entry
For very small businesses (owner-only or small partnerships) doing payroll once a month, manually entering the journal entry from your provider's payroll register works fine.
- Run payroll through your provider; download the period's payroll register
- In Solid: New Journal Entry
- Enter the lines as above, taking the numbers from the register
- Post
Use Solid's recurring transactions for the template if the structure stays consistent across periods. The amounts will vary; the recurring entry pre-fills the line structure and you adjust the numbers per cycle.
Path 2 — Payroll CSV import
Most providers export each payroll period to CSV. Solid imports these via the standard CSV import wizard:
- From your provider, download the journal entry export for the period (Gusto: Reports → Custom Reports → Payroll Journal; OnPay: Reports → Accounting Export; ADP: Reports → Payroll Journal Detail)
- In Solid: File → Import → CSV and choose the file
- Map columns to Solid accounts at the wizard step
- Solid creates a journal entry for each pay period in the CSV
Most providers will customize the export format on request — ask their support for a "Solid Accounting" export format if they offer one. The default formats import fine; the customized formats save the column-mapping step on subsequent runs.
After the first import, Solid remembers the column mapping for that source. Subsequent imports skip the mapping step.
Path 3 — Payroll API sync (Pro / Accountant)
For Pro and Accountant tiers, Solid integrates directly with three major providers via their APIs:
- Gusto (OAuth)
- OnPay (OAuth)
- ADP RUN (OAuth)
Setup is in Settings → Integrations → Payroll Provider. After OAuth authorization, Solid pulls each completed payroll run as a journal entry, automatically. The same posting structure as the manual path; the data flow is just automated.
Sync runs on a schedule (every 4 hours by default; configurable) and pulls only completed pay periods — partial or in-progress runs aren't pulled. New pay periods appear in Solid as posted journal entries with source = 'recurring' (so reports can filter to "from payroll integration").
The API integrations are only on Pro/Accountant tiers because they require an active Updates plan to maintain — payroll-provider APIs change frequently, and we ship updates as those APIs evolve.
Employee contacts
Employees are stored in the contacts table with contact_type = 'employee'. They're used:
- For 1099 filing of contractor-type employees (technically misclassified workers — but if you're processing both 1099 and W-2 in the same year for a transitioning hire, both records exist)
- For reimbursable-expense tracking (employee submits expense reports; reimbursements post against an Employee Reimbursements Payable account)
- For per-employee payroll detail in some CSV import formats that key by employee name
The encrypted TIN field stores employee SSN; access is logged in the audit trail. See the Customers module for the encryption details.
Reports
Two payroll-specific reports:
- Payroll Liability Summary — every payroll-related liability account (Federal Tax Payable, State Tax Payable, FUTA, SUTA, Health, 401(k), etc.) with current balance. The "what do I owe and to whom" view that drives tax-deposit timing.
- Payroll Expense by Period — gross wages + employer taxes + benefits by period. Combine with the Income Statement for total compensation cost.
Plus the standard P&L (which shows wages, tax expense, benefits) and Balance Sheet (which shows the liability balances).
Tax-deposit workflow
After running payroll, you owe taxes to federal/state authorities. Solid tracks this through the liability accounts; remitting follows the same pattern as paying any liability:
- Run Payroll Liability Summary to see what's owed and when
- When deposit due, write a Check (or use the provider's automated deposit feature) for the amount
- Apply the Check against the liability account: DR Federal Tax Payable / CR Bank
- After deposit, the liability balance returns to zero
For providers that handle tax deposits automatically (Gusto, OnPay typically do; some ADP plans do), the deposit shows on your bank statement as a single debit; categorize it against the same liability account.
Common gotchas
Total wages on Solid's P&L doesn't match Gusto's payroll register total. Possible causes: an unimported pay period, a manually posted reimbursement that hit Wages instead of an employee-expense account, or a bonus run that imported separately. Compare period-by-period to find the gap.
Health Insurance Expense on the P&L is double the actual cost. Common mistake: posting the employer portion to Health Insurance Expense AND posting the employee withholding's other side there too. The employee withholding should credit Health Insurance Payable (a liability), not Expense. Correct via a journal entry to reclassify.
Employee SSN can't be retrieved. TIN access requires Admin role + password re-entry; the audit log shows who's tried to access it. If you need access for filing W-2s and you're not the file Admin, ask the Admin to run the report.
Payroll API sync skipped a period. Check the provider's status — sometimes runs are flagged "incomplete" until certain thresholds clear (year-end W-2 reconciliation, for example). Solid only pulls completed runs to avoid posting half-finished data.
State Tax Payable balance grows but never zeroes out. Either you haven't been posting deposits, or deposits are posting to the wrong account. Run the Payroll Liability Summary and reconcile against the provider's deposit history. The two should match cycle-by-cycle.
Cross-references
- Vendors module — for 1099 contractors (which are vendors, not employees)
- Recurring transactions — for the template structure on manual payroll posting
- Reports → Tax reports — for year-end W-2 generation (separate from 1099)