ml-connector
IFS CloudGusto

IFS Cloud and Gusto integration

IFS Cloud manages manufacturing, supply chain, finance, and project delivery. Gusto handles HR, payroll, and benefits. Connecting the two keeps your labor costs and headcount aligned between payroll and the general ledger. New hires and terminations in Gusto update cost center assignments in IFS, and payroll accrual and expense journals post into IFS GL accounts on each pay cycle without manual re-entry. ml-connector bridges the different APIs and triggers on Gusto payroll events.

How IFS Cloud works

IFS Cloud exposes suppliers, purchase orders, GL accounts, GL vouchers, customers, sales orders, and project resources through OData v4 REST APIs, each customer accessing a tenant-specific subdomain with base URL https://<tenant>.ifs.cloud. Authentication uses OAuth 2.0 client credentials, with token lifetime approximately 60 minutes. IFS offers server-side Event Actions that can POST to external URLs when business events fire, but these require manual configuration per customer in the IFS admin UI and are not self-registerable through API. The recommended pattern is pull-based polling of OData APIs with filters on modified timestamps. IFS enforces page size limits (under 5000 elements) and rate limits (approximately 1000 requests per minute per tenant), and uses OData ETag headers for optimistic concurrency control on mutations.

How Gusto works

Gusto exposes employees, compensations, payrolls, contractor data, and company benefits through REST JSON APIs at https://api.gusto.com with OAuth 2.0 authorization code flow, one access token per company (2-hour lifetime, single-use refresh token). Gusto pushes payroll events (created, updated, calculated, submitted, processed, paid) and employee events (created, updated, onboarded, terminated) to a registered webhook endpoint; those webhooks must return 2xx within 10 seconds and Gusto retries up to 16 times over 3 days. API calls are rate-limited to 200 per minute per OAuth grant, and Gusto uses object versioning rather than idempotency keys for concurrency control. Employee rate data requires compensations:read scope, and each scope is assigned by Gusto during partner review, not self-selected in production.

What moves between them

The main flow moves from Gusto into IFS Cloud. When Gusto webhooks fire for payroll events (processing, paid, calculated), ml-connector receives the event and fetches the full payroll, employee, and compensation details from Gusto. It then constructs GL vouchers (journal entries) representing payroll accrual and expense accounts, allocating amounts to IFS GL accounts per company code. Employee records sync into IFS as customers or project resources so IFS headcount matches active Gusto employees. Changes are one-directional: Gusto is authoritative for payroll and HR, while IFS owns GL posting and financial reporting.

How ml-connector handles it

ml-connector registers an HTTPS endpoint as a Gusto webhook receiver and validates signatures using Gusto's HMAC-SHA256 X-Gusto-Signature header with the subscription verification token. When a payroll event fires, ml-connector fetches the payroll, employees, and compensations from Gusto using OAuth 2.0 bearer tokens (refreshing when a token approaches expiry). It maps Gusto employees to IFS customers or project resources by email or employee ID, and allocates payroll amounts to IFS GL accounts based on job codes and company assignment configured per customer. Each GL voucher is posted to IFS via OData PATCH/POST, including the ETag header required for mutations. If IFS returns HTTP 429, ml-connector backs off with exponential jitter and retries. Because Gusto webhooks may fire multiple times for the same payroll, ml-connector deduplicates by checking for existing vouchers before creating new ones, and it logs the full audit trail of each attempt.

A real-world example

A mid-market product company operates IFS Cloud for manufacturing, procurement, and finance across three locations, and uses Gusto for payroll and benefits administration. Before the integration, the accounting team received a payroll summary from Gusto each pay period and manually entered the gross wages, employer taxes, and benefits expense into IFS, breaking out the amounts by cost center for each location. Month-end financial close required chasing differences between Gusto headcount and the wages expense account in the ledger, and the manual entry step introduced delays and errors. With Gusto and IFS Cloud connected, each payroll posting flows into IFS automatically on the day Gusto processes it, allocated to the correct GL accounts and company codes, and the accounting team starts month-end close with payroll expenses and employee counts already reconciled.

What you can do

  • Receive Gusto payroll events via webhook and fetch complete payroll and employee details for posting.
  • Post Gusto payroll accrual and expense journals to IFS GL accounts, allocated by cost center and company code.
  • Map Gusto employees to IFS customers or project resources so headcount stays synchronized.
  • Validate and refresh OAuth tokens for both Gusto and IFS, handling token expiry and 401 responses.
  • Deduplicate GL vouchers by payroll ID and retry failed postings to IFS with exponential backoff when rate limits are hit.

Questions

How does ml-connector handle Gusto payroll events arriving at irregular times or duplicated?
ml-connector registers an HTTPS webhook endpoint and validates payroll event signatures using HMAC-SHA256. When an event arrives, it fetches the payroll details from Gusto and checks IFS for an existing GL voucher with the same payroll ID before posting. If a voucher exists, the event is skipped; if not, a new voucher is created. This deduplication pattern handles Gusto retries and ensures each payroll posts exactly once.
Which GL accounts and company codes do payroll amounts map to?
The mapping is configured per customer and can vary by location and payroll type. ml-connector allocates Gusto gross wages, employer taxes, and benefits expense to customer-specified IFS GL accounts, breaking down amounts by job code and company code. The customer provides the mapping during configuration, and ml-connector validates that target GL accounts and company codes exist in IFS before posting.
What happens if an IFS GL posting fails or Gusto rate limits the API?
If IFS returns HTTP 429 (rate limit), ml-connector backs off with exponential backoff and jitter, then retries the voucher post. If IFS returns an error (e.g., invalid company code, account not found, ETag mismatch), ml-connector logs the failure with full details and can replay the payroll event once the issue is fixed. The full audit trail is preserved so no payroll is lost.

Related integrations

Connect IFS Cloud and Gusto

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

Get started