IntegrationCustom fabrication studio

Payroll time clock and NetSuite projects, kept in step for job costing

Projects and tasks appear in the payroll time clock as cost centres, and approved hours come back to NetSuite as time entries against the right job.

The situation

A fabrication studio tracks the cost of every job as a NetSuite project. Its shop-floor staff clock in and out on the payroll provider's time clock, which runs on UKG Ready. The time clock did not know about NetSuite's projects, and NetSuite did not see the hours, so job costing ran a step behind and depended on re-keying timesheets.

What we built

A two-way REST integration in three Map/Reduce jobs and a User Event.

Projects out as cost centres. A job takes active NetSuite projects and their tasks and creates them as cost centres in the payroll system, in a parent and child tree that mirrors project and task. When a project is renamed, re-coded or changes status, the job updates the matching cost centre. Finished or held work is hidden from the time clock instead of deleted, so past hours keep their reference. A task counts as active only if its department is active. A User Event on the project keeps task and department values in step when a project changes, because NetSuite clears them.

People and hours in. A second job reads employees from the payroll system. It links them to existing NetSuite employees, creates new hires, updates changed details, and marks terminated staff inactive with their release date. It never creates a terminated employee. The job then reads approved time entries and creates NetSuite time records against the right project, task and department.

The two systems compared. A third job compares cost centres and employees in both systems and emails the differences, so a mismatch shows up before payroll closes.

What it does now

Staff clock time against the job they are working on, from the same list of jobs NetSuite has, and those hours reach the project without re-keying. The error email reports invalid time entries, for example hours against a cost centre that no longer maps to a project, with enough detail to fix them at the source.

Under the hood

  • The payroll API token is cached for 50 minutes. On an authentication failure the cache is cleared and the call retried once.
  • Cost centres carry the NetSuite id as their external id, which makes the push an upsert.
  • Visibility changes always send the time-allocation flag, because the payroll API resets it otherwise.
  • Terminated employees become inactive in NetSuite and are never created.
  • The business can run the comparison job at any time as a reconciliation check.
  • Every job ends with an emailed summary of what failed and why.

Need something like this in your NetSuite?

A 30-minute working session with a senior consultant. Bring the systems you run and the problem in front of you; we will sketch how we would connect them.