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:

PathBest for
Manual journal entryOnce-a-month payroll, simple structure, owner-only files
Payroll CSV importMost small businesses with a payroll provider — Gusto, OnPay, ADP, Paychex, Justworks
Payroll API syncPro/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 (Wages or Payroll 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 FICA
    • State Tax Payable — state income tax withheld
    • FUTA Payable / SUTA Payable — federal/state unemployment
    • Health Insurance Payable — premiums withheld + company portion
    • 401(k) Payable — employee deferrals + employer match
    • Garnishments 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.

  1. Run payroll through your provider; download the period's payroll register
  2. In Solid: New Journal Entry
  3. Enter the lines as above, taking the numbers from the register
  4. 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:

  1. 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)
  2. In Solid: File → Import → CSV and choose the file
  3. Map columns to Solid accounts at the wizard step
  4. 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:

  1. Run Payroll Liability Summary to see what's owed and when
  2. When deposit due, write a Check (or use the provider's automated deposit feature) for the amount
  3. Apply the Check against the liability account: DR Federal Tax Payable / CR Bank
  4. 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

Updated May 1, 2026
Edit this page on GitHub →
Was this helpful?

We use this to prioritize which docs to improve. No tracking, no email follow-up.