Reconciling Payroll and Posting to Your GL
Tie each payroll run out to your books, post it to your general ledger, and allocate costs by client or job.
Once payroll runs, someone has to account for it. Your finance team needs to know that what Everee paid matches what you expected, post the cost to the general ledger, and, for staffing and services firms, bill clients for the labor they used.
Everee gives you three views of the same payments. Each answers a different question, so most integrations use two of them together.
| You want to... | Use | It's organized by |
|---|---|---|
| Post payroll to your general ledger | The payroll journal | Funding, as balanced debits and credits with your GL codes |
| Bill clients, or report cost by job or project | The cost segments in the Payroll Cost API | Cost center, with wages, taxes, and other costs fully loaded |
| Check individual payments against your own records | The Payment Data API | Payment, one per worker per pay period, with every line itemized |
They come from the same payments but aren't meant to match one for one. The journal groups by funding date, the segments by earning or pay date, and the payment data by pay date. Use the journal for the books and the segments for analysis.
Before you start
Two pieces of setup decide how useful this data is:
- Cost centers on your wages. The segments, and the allocation in the journal and payment data, only follow the cost centers you send with shifts and payable items. Decide what you need to report by, such as client, job, or department, and create those cost centers before you send wages. See Setting up your organization.
- GL code mappings. Your accounting system needs account codes on each journal line. Create the mappings once, up front.
Everything below only includes payments that have been paid. Wait until a pay date has finished processing before you retrieve it. Retrieve in one pass: a payment that's paid while you're paging through may be missed in that pass.
1. Map your GL codes
A GL code mapping tells Everee which of your accounts a kind of journal line belongs to. It works at three levels of detail, and each line takes the most specific mapping that fits.
Send your mappings to Create or update GL mappings:
[
{ "category": "GrossPay", "glCode": "6000" },
{ "category": "GrossPay", "transactionType": "FIELD_HOURS", "glCode": "6010" },
{ "category": "EmployerTaxes", "glCode": "6200" },
{ "category": "Withholdings", "glCode": "2100" },
{ "category": "Liabilities", "glCode": "2110" },
{ "category": "PayrollFunding", "glCode": "1000" }
]- Sending your whole set of mappings on every sync is safe. Existing ones are updated and nothing is duplicated.
- To find the types and details to map, retrieve a journal and look at its lines, or list suggested transaction types.
- If different approval groups or work locations need different codes, scope your mappings by one of them.
- You can also set them up in the Everee admin portal. Both work on the same mappings.
A mapping change applies to every journal you retrieve afterward, including past ones.
See the Guide to GL code mappings.
2. Post each funding to your GL
A funding is the transfer of money that covers one or more payments. Each funding's journal balances on its own, so you post one funding as one journal entry.
The loop is simple:
every day, or when payment.paid arrives:
1. List fundings since your last run GET /integration/v1/payroll-costs/journal/fundings
2. For each funding you haven't posted yet:
a. Skip it unless its status is FUNDED
b. Retrieve its journal GET /integration/v1/payroll-costs/journal/fundings/{fundingId}
c. Post it as one journal entry
d. Store the fundingId so you never post it twiceGET https://api.everee.com/integration/v1/payroll-costs/journal/fundings?start-date=2026-10-01&end-date=2026-10-31Points to get right:
- Wait for
FUNDED. By default the list returnsSUBMITTEDandFUNDEDfundings. A submitted funding can still fail, so if you'd rather not post until the money has arrived, post onlyFUNDEDones. - Treat
fundingIdas opaque, and store every one you've posted. - The date range filters on funding date, not pay date.
- Every journal balances.
totalDebitsequalstotalCredits. If yours don't after posting, a line was dropped. - Don't skip lines with no GL code. A
nullglCodemeans no mapping applies. Post those to a suspense account and alert someone to add a mapping. Skipping a line unbalances the entry. - Handle values you don't recognize. New line categories and funding statuses may be added.
- Mapping changes are retroactive. If you change a mapping after posting a funding, retrieve the journal again if you want the new codes.
You can choose how much detail to post. By default the journal splits lines by work location, approval group, and all three cost centers, as the Payroll Journal report does. Pass group-by to split by fewer fields and get a shorter journal that balances the same way:
GET https://api.everee.com/integration/v1/payroll-costs/journal/fundings/123456?group-by=work-location-state&group-by=cost-center-1See the Guide to the payroll journal for the line categories, how a funding balances, and how companies that file and remit their own taxes appear.
3. Bill clients and report by cost center
The cost segments split your total payroll cost by the cost centers on your wages. Employer taxes, benefit costs, and Workers' Comp premiums are allocated across cost centers in proportion to wages, so each segment is a fully loaded cost.
GET https://api.everee.com/integration/v1/payroll-costs/segments/by-period?min-earning-date=2026-10-05&max-earning-date=2026-10-11GET https://api.everee.com/integration/v1/payroll-costs/segments/by-cost-centers?cost-center-type-key=clientId&cost-center-value=290&cost-center-value=291- Retrieve once per pay period, after payroll is finalized, on the same schedule you invoice or report on.
- You get one segment for each unique combination of cost centers on the wages, plus one unallocated segment for costs that couldn't be allocated. Include it, or your totals won't tie out.
- If a cost center value you pass doesn't exist, the request fails with a
400. Setignore-unknown-cost-center-valuestotrueto skip those values instead.
4. Check individual payments
When a total doesn't match, or you need to answer "what exactly was paid to this worker?", retrieve the payments themselves:
GET https://api.everee.com/integration/v1/payment-data?pay-date=2026-10-16Each payment itemizes taxable wages by pay code and cost center, non-taxable pay, employer taxes, employer additional costs, employee withholdings, deductions, and net payouts. Page through with the nextCursor until hasNextPage is false. A pay period can be paid on several pay dates, so you can retrieve one by pay-period-start-date and pay-period-end-date instead.
The totals on a payment always equal the sum of their lines, so you can rely on that in your own checks. The payment's id is the same ID used in the Worker Payment History API and in payment.paid webhook events.
See the Guide to the Payment Data API.
5. Trigger it all from webhooks
You don't need a schedule. These events tell you when to look:
| Event | What to do |
|---|---|
payment.paid | A payment was paid. When your pay date is complete, retrieve its payment data and check for new fundings |
payment.deposit-returned | A deposit was returned, so a worker hasn't received money yet. See Returned deposits and retries |
report.completed | A report you requested is ready to download |
For a one-off reconciliation, or for something your finance team wants as a spreadsheet, the Reports API runs Everee's standard reports, such as Payments by Pay Date and Funding, and gives you an Excel file to download.
Putting it together
A common month-end routine for a staffing platform:
- Each pay date, after
payment.paid, list fundings and post the newFUNDEDones to the GL. - Each pay period, pull the cost segments and turn each client's segment into an invoice line.
- Compare each client's cost to what you billed. If there's a gap, open the payment data for that pay date and find the payments behind it.
- After changing a GL mapping, re-retrieve the journals for the affected fundings.
Common mistakes
- Skipping the unallocated segment. Totals then fall short of what was paid.
- Posting a funding twice. Store every
fundingId. - Posting before the funding is
FUNDED. A submitted funding can still fail. - Dropping lines with a
nullGL code. The journal no longer balances. - Expecting the journal and segments to match. They're organized differently. Compare like with like.
- Retrieving mid-run. Payments that finish while you're paging may be missed.
Next steps
Updated about 3 hours ago