ml-connector
Sage 100Gusto

Sage 100 and Gusto integration

Sage 100 covers your accounting, purchasing, and inventory. Gusto handles payroll and HR. Connecting them keeps your employee records and payroll GL postings in agreement without manual re-keying. New hires and terminations in Gusto line up with Sage 100 employee records and departments, and the GL journals Gusto produces after each payroll run post directly into Sage 100's general ledger. ml-connector bridges the gap between cloud payroll and on-premises accounting.

How Sage 100 works

Sage 100 is deployed on customer-owned Windows servers with no native cloud API. It exposes AP invoices, purchase orders, GL accounts, journal entries, items, vendors, and employee records through either eBusiness Web Services (SOAP at the customer's IIS endpoint) or the BOI COM layer wrapped by a local Windows agent running as a service on the customer's infrastructure. Sage 100 uses username and password authentication per SOAP call (no tokens), and a company code (3-character identifier) must be included in every request. There are no webhooks, so integration requires polling via DateLastUpdated or DateCreated fields. GL accounts use a multi-segment format that varies by customer configuration, and concurrent writes face COM record-locking limits that require exponential backoff.

How Gusto works

Gusto exposes employees, compensations, payrolls, contractors, company benefits, earning types, garnishments, terminations, and bank accounts through REST endpoints at https://api.gusto.com prefixed with /v1/. All calls use OAuth2 bearer tokens that expire in 2 hours, with a single-use refresh token that rotates on each refresh. The same token is scoped to a single company only, so multi-company setups require separate OAuth tokens per company. Gusto publishes webhooks for payroll events (created, updated, calculated, processed, paid, reversed), employee events (created, updated, terminated), and company events, but does not expose GL accounts, invoices, purchase orders, or accounting dimensions.

What moves between them

The main flow runs from Gusto into Sage 100. After each payroll run, ml-connector reads Gusto's payroll documents and posts the labor cost GL entries into Sage 100's general ledger, mapped to matching Sage 100 GL accounts and job codes. Employee records flow the same direction so Sage 100 employee files reflect Gusto hires, terminations, and rehires. Because Sage 100 has no native cloud interface and Gusto has no accounting dimension support, the integration polls Gusto on a payroll calendar schedule and writes to Sage 100 through its local SOAP or BOI agent. Gusto's rate limit is 200 requests per minute per OAuth token.

How ml-connector handles it

ml-connector manages Gusto's OAuth2 flow, refreshing the access token before the 2-hour expiry, and maps each Gusto company to its corresponding Sage 100 instance. On the Sage 100 side, it accepts either the customer's SOAP endpoint URL or routes through the local BOI agent, and enforces the required company code on every call. It polls Gusto at intervals tied to the customer's payroll calendar (e.g., daily or twice weekly) and retrieves payroll runs and employee changes via the Employees and Payrolls endpoints. Before writing GL entries, it validates that Sage 100 GL accounts exist in the customer's multi-segment format and that job codes match. Gusto rate limits (200 requests per minute) trigger HTTP 429 responses, so ml-connector backs off and retries. Sage 100's BOI COM layer enforces record locks on concurrent writes, so ml-connector retries with exponential backoff. Every GL entry and employee record carries a full audit trail and can be replayed if a downstream validation fails.

A real-world example

A regional retail chain runs Sage 100 on-premises for AP, AR, GL, and inventory management across eight locations, and uses Gusto cloud payroll for its 140 employees across all sites. Before the integration, the back-office finance team exported payroll summaries from Gusto weekly and manually entered the labor cost GL entries into Sage 100 by hand, allocating to the correct location code and GL account. Month-end close required chasing discrepancies between Gusto employee headcount and the Sage 100 payroll accounts. With Sage 100 and Gusto connected, each payroll run's GL entries flow into Sage 100 automatically, allocated to the correct job code and GL account per location. Employee changes sync immediately, so Sage 100 headcount is always current. The finance team no longer re-keys payroll totals, and the labor accounts close out with no variance.

What you can do

  • Post Gusto payroll GL entries into Sage 100's general ledger after each payroll run, allocated to the correct job codes and GL accounts.
  • Keep Sage 100 employee records synchronized with Gusto hires, terminations, and rehires.
  • Bridge Gusto's OAuth2 authentication to Sage 100's on-premises SOAP or BOI agent endpoint.
  • Retry Gusto rate limits (200 requests per minute) and Sage 100 COM record locks with exponential backoff.
  • Poll Gusto on a payroll calendar schedule with a full audit trail on every GL entry and employee change.

Questions

How does ml-connector handle Sage 100 being on-premises and Gusto being cloud?
ml-connector manages Gusto OAuth2 credentials and calls either the customer's SOAP endpoint or routes through the local BOI Windows agent on the Sage 100 server. The customer's firewall must allow outbound HTTPS to Gusto's API and inbound access to the Sage 100 SOAP or agent port from the ml-connector polling infrastructure.
What GL entries and dimensions flow from Gusto to Sage 100?
Payroll GL documents flow from Gusto after each payroll run, containing labor cost account distributions mapped to Sage 100's GL accounts and job codes. Gusto has no native support for accounting dimensions, so the integration relies on the payroll document structure and the customer's account number and job code mapping.
How often does the integration sync payroll and employee data?
ml-connector polls Gusto on a schedule aligned to the customer's payroll calendar, typically daily or twice weekly depending on pay frequency. Employee changes are picked up at each poll cycle via Gusto's Employees endpoint. Gusto rate limits are 200 requests per minute, and Sage 100 COM locks are handled with exponential backoff.

Related integrations

Connect Sage 100 and Gusto

Free to use. Add your credentials, ping your real systems, and see if we fit.

Get started