Connects with ERP & MES systems like

Integrations / ERP / Oracle NetSuite

NetSuite Integration Guide for SkyPlanner APS Production Scheduling

This guide shows NetSuite partners, administrators and technical buyers how SkyPlanner APS connects to Oracle NetSuite for finite capacity production scheduling. SkyPlanner integrates with NetSuite in both directions, over REST web services and SuiteQL:

  • Work orders, routings, work centers, items and purchase orders flow in.
  • Planned start and end times are written to the manufacturing operation tasks.
  • Logged hours and produced quantities post back as Work Order Completions or Assembly Builds.
  • SkyPlanner webhooks push schedule changes as they happen.
SkyPlanner APS Gantt timeline with jobs scheduled across workstations and an order list below.

NetSuite owns items, BOMs, routings, work orders, inventory and costing. SkyPlanner builds the finite capacity schedule with the Arcturus engine. The SkyPlanner team configures the integration to your account during onboarding and supports it after go-live. It runs against standard NetSuite records and does not depend on the Advanced Manufacturing SuiteApp.

SkyPlanner already runs integrated with NetSuite at UTU, a switchboard and switchgear manufacturer in Ulvila, Finland. UTU went live in September 2025, with SkyPlanner integrated with Oracle NetSuite and its payroll system. For the business case, start with the NetSuite production scheduling page and Does NetSuite have finite capacity scheduling?.

The one decision that shapes the project: REST and OAuth 2.0

Oracle has set the direction. From 2026.1, new integrations should be built on SuiteTalk REST web services with OAuth 2.0. From 2027.1, no new integrations on SOAP or Token-Based Authentication (TBA). SOAP endpoints are disabled in 2028.2. Any scheduling integration started today belongs on REST.

NetSuite optionWhat it isRole in an APS integration
SuiteTalk REST record API/services/rest/record/v1/<recordType>, versioned with the NetSuite release; !transform for work order completions, issues and buildsWrites: operation task and work order dates (PATCH), completions, issues and assembly builds (transform)
SuiteQL over RESTPOST /services/rest/query/v1/suiteql with Prefer: transient, up to 100,000 results per query, limit/offset pagingBulk reads: items, routings, work centers, open work orders, stock
SuiteScript 2.1 RESTletsCustom get/post/put/delete endpointsGaps in REST coverage, combined payloads such as a work order with all its operations
SuiteScript User Event / Map-ReduceServer-side scripts inside NetSuiteOutbound change notifications
CSV Import AssistantSaved import mappingsOne-off loads; not for ongoing sync
SuiteTalk SOAPLegacy, TBA onlyDo not start new work here

Authentication

For a server-to-server scheduler, use OAuth 2.0 Client Credentials (machine-to-machine). The admin path is Setup > Integration > Manage Authentication > OAuth 2.0 Client Credentials (M2M) Setup. You upload a public certificate and map it to an entity, a role and the integration record. Each integration record holds at most five active certificates.

Create a dedicated integration role: view on items, BOM revisions, routings and work centers; edit on work orders, completions and issues. The SkyPlanner REST API (API reference) uses JWT, so the middleware holds both credentials.

Events: there is no standard webhook

Oracle’s documentation describes no native outbound webhook. The working pattern is a SuiteScript User Event script on Work Order (afterSubmit) that queues an outbound call through N/task or a Map/Reduce script, calling out with N/https. Never call out synchronously in afterSubmit: the call runs inside the user’s save, so a slow endpoint slows or breaks the save.

User events do not cover every change path. Mass updates and CSV imports can bypass them. Pair the event script with a scheduled SuiteQL reconciliation poll on lastmodifieddate so nothing is missed. In the other direction, SkyPlanner’s own webhooks drive the write-back, so NetSuite gets new dates as soon as the plan changes.

Data mapping: NetSuite to SkyPlanner

NetSuite record (REST id)SkyPlanner objectDirectionFrequency
Assembly Item (assemblyItem), Inventory Item (inventoryItem)Product / materialNetSuite → SkyPlannerInitial load, then daily or on change
BOM Revision (bomRevision), BOM componentsMulti-level product structure, material requirementsNetSuite → SkyPlannerOn change
Manufacturing Routing (manufacturingRouting, sublists routingStep, routingComponent)Process steps: sequence, workstation, setup time, run timeNetSuite → SkyPlannerOn change
Manufacturing Work Center (Group flagged as work center): Machine Resources, Labor Resources, Work CalendarWorkstations, workstation groups, shiftsNetSuite → SkyPlanner, then maintained in SkyPlannerInitial load
Work Order (workOrder): item, quantity, location, Production Start/End Date, status; linked Sales Order for the due dateOrder / job with due date and priorityNetSuite → SkyPlannerNear real time via User Event, plus reconciliation poll
Manufacturing Operation Task (manufacturingOperationTask)Scheduled operationNetSuite → SkyPlanner, dates SkyPlanner → NetSuiteNear real time
On-hand stock per location (SuiteQL), Item Receipts (itemReceipt)Stock balances for material-driven schedulingNetSuite → SkyPlannerEvery 15 to 60 minutes or on receipt
Purchase Order (purchaseOrder) lines: item, quantity, expected receipt date, statusPurchase orders / incoming material (expected delivery date). Counted as available on the delivery date; stock updates when the PO is marked DeliveredNetSuite → SkyPlannerEvery 15 to 60 minutes or on change
Planned start and end per operationPATCH manufacturingOperationTask/{id} (startDate, endDate) and PATCH workOrder/{id} (Production Start/End Date)SkyPlanner → NetSuiteOn schedule change, via SkyPlanner webhook
Mobile Confirmations, timelogs, Production TimerPOST workOrder/{id}/!transform/workOrderCompletion: startOperation/endOperation range, completed quantity, labor time on the operation lines, SkyPlanner timelog ID as external IDSkyPlanner → NetSuitePer confirmation or batched
Material consumptionPOST workOrder/{id}/!transform/workOrderIssue, or isBackflush on the completionSkyPlanner → NetSuitePer confirmation
Finished order (non-WIP accounts)POST workOrder/{id}/!transform/assemblyBuildSkyPlanner → NetSuiteOn order completion
Order closedWork Order Close (workOrderClose)NetSuite, by financeNot automated by default

Integration patterns

1. Initial master data load. Read work centers first, then items, BOM revisions and routings with SuiteQL. Routings reference work centers, so order matters. In the trial, export the same data to CSV and import it into SkyPlanner. The schedule is validated before any code exists.

2. Order sync. Pull work orders in Released and In Process status. Decide early whether Planned work orders come along. If they do, treat them as tentative demand. Sync open purchase orders in the same cycle, so the schedule checks each job against stock and incoming material, not stock alone.

3. Schedule write-back. When the schedule changes, a SkyPlanner webhook pushes the new operation dates to the middleware. The middleware sends PATCH /services/rest/record/v1/manufacturingOperationTask/{id} (Oracle record reference) with startDate and endDate for each changed operation. One more PATCH on the workOrder header sets the Production Start and End Date. Write only dates and, if you use one, a custom sequence field. Never write quantities or BOM data back. To update many operations in one transaction, a small RESTlet saves the whole operation list in one call. The record API stays the default.

4. Shop floor confirmations. Operators log work in SkyPlanner Mobile Confirmations. The middleware posts each confirmation through the Work Order transforms with POST /services/rest/record/v1/workOrder/{id}/!transform/workOrderCompletion, carrying startOperation, endOperation, the completed quantity and the logged time on the operation lines. Non-WIP work orders close with !transform/assemblyBuild instead. Work Order Completion over REST requires the Manufacturing Work In Process feature. Inventory and cost postings stay in NetSuite.

5. Idempotency and retries. Each completion carries the SkyPlanner timelog ID as its NetSuite external ID. External IDs are unique per record type, so a replayed webhook is rejected as a duplicate instead of posting quantities and cost twice. Writes go through a queue. A failed call (concurrency limit, locked record, expired certificate) is retried and logged. Anything that still fails is visible to the SkyPlanner team supporting the integration.

6. Ownership rules. NetSuite owns what is made: item, quantity, BOM, routing, location. SkyPlanner owns when and where: operation sequence, workstation, start and end. Dates edited in NetSuite are overwritten on the next write-back, so lock Production Start/End Date with a form customization or workflow.

Typical project steps

Implementation is normally completed within weeks after onboarding starts, even for large companies. A NetSuite project contains:

  • Trial on your own data: CSV exports of work centers, routings and open work orders from saved searches, imported into SkyPlanner during the 30-day trial.
  • Master data mapping: NetSuite records to SkyPlanner objects, custom fields, units and the WIP or non-WIP model per item.
  • Initial load: items, BOM revisions, routings and work centers via SuiteQL, then shifts, operators and alternative workstations set up in SkyPlanner.
  • Order and purchase order sync: Released and In Process work orders plus open purchase orders with expected receipt dates, driven by User Event scripts and a reconciliation poll.
  • Schedule write-back: planned operation dates to work orders and operation tasks, with OAuth 2.0 M2M set up in sandbox and production.
  • Shop floor confirmations: Work Order Completions, issues or Assembly Builds from Mobile Confirmations and timelogs.
  • Testing in parallel with the current plan: run the SkyPlanner schedule next to today’s release process and compare.
  • Go-live: switch planning to SkyPlanner and lock date fields in NetSuite.

Clean routings and one subsidiary keep the scope small. Multiple subsidiaries, WIP backflush and custom forms add mapping work.

NetSuite pitfalls

  • Work orders without routings. A work order with no Manufacturing Routing has no operations to schedule. Oracle says the same about its own finite scheduler: “Work orders not associated with a NetSuite routing should not be scheduled.” Find them with SuiteQL before go-live.
  • Work centers are thin. A NetSuite work center is a Group with two counts, Machine Resources and Labor Resources (both default to 0), and one Work Calendar, usually “Default Work Calendar”. Load work centers once, then maintain individual workstations, shifts per person, tools, the setting time matrix and alternative workstations in SkyPlanner.
  • Setup Time and Run Rate quality. NetSuite’s infinite scheduling uses these fields, but because it ignores capacity, wrong values go unnoticed. A finite schedule exposes them on day one.
  • WIP or non-WIP. With Manufacturing WIP, output posts through Work Order Issue, Work Order Completion and Work Order Close. Without WIP, an Assembly Build is used. The integration posts completions for WIP items and assembly builds for the rest, so the model per item is part of the mapping.
  • Advanced Manufacturing in the same account. If the account also runs the Advanced Manufacturing SuiteApp, its Manufacturing Work Bench records must match the routing exactly: operation sequence, operation name and work center. Decide which system sets operation dates. Two schedulers on the same work orders means two competing plans.
  • Concurrency limits. Web services and RESTlet calls share one account concurrency limit, set by service tier plus 10 per SuiteCloud Plus license. Parallel per-record polling hits it fast. Use SuiteQL with paging for reads and queue writes.
  • Sandbox refresh wipes M2M setup. OAuth 2.0 client credentials mappings are cleared on sandbox refresh and are not copied between accounts. An expired or revoked certificate stops the sync until a new mapping is created. Alert on authentication failures.

The NetSuite integration: who configures and supports it

The work covers mapping to your records, routings and work centers, plus the constraints NetSuite does not hold as schedulable data: setting time matrix, tools, operator counts and alternative resources. SkyPlanner webhooks send schedule changes back as they happen, including those Autopilot makes.

  1. The SkyPlanner team configures it during onboarding and supports it after go-live. Every plant runs NetSuite differently: WIP or non-WIP, custom forms, scripts, routing conventions. The team maps your records and connects the SkyPlanner REST API and webhooks to NetSuite REST, SuiteQL and RESTlets. Its support covers the User Event script and the middleware, and follows changes to your NetSuite setup.
  2. Your NetSuite partner can take part. Partners know your custom forms, scripts and roles. They work against the SkyPlanner REST API, which covers orders, products, materials, purchase orders, process steps and timelogs. It has Swagger/OpenAPI documentation and JWT authentication. Public docs: SkyPlanner docs.
  3. Your own developers build on it. A common split: the User Event script inside NetSuite, a small middleware service outside it. An API key is enough to start (integration tutorial), and the SkyPlanner team assists when needed.

Validate the schedule in the 30-day free trial first, on CSV data with up to 20 workstations and no credit card. Integration then starts from a schedule that already fits the plant.

Once connected, the Arcturus engine schedules from live NetSuite work orders and checks material from stock and incoming purchase orders. Operators log work with Mobile Confirmations, Production Timer and Quick Log Mode, and NetSuite reflects the shop floor without manual entry. SkyPlanner starts from 199 € per month with 5 workstations included, billed monthly, cancel any time. The integration is quoted up front for your process and needs, together with your plan, so you see the full cost before you start. Talk to sales to scope your NetSuite build, or see features and customers.

SkyPlanner reviews from manufacturers

Kalle Kalliomäki, Supply Chain Specialist at UTU, on the switchboard production floor in Ulvila

2 hsaved every week

“SkyPlanner has taken our production planning from Excel spreadsheets to real-time production optimization.”

Kalle Kalliomäki, Supply Chain Specialist
UTU · Electrical switchboards and switchgear

Production planning saves 2 hours of working time every week, and a new work queue reaches the line in seconds.

Read the UTU review

Operators in cleanroom suits at a bottle-filling line in Laboratory & Allied's pharmaceutical plant in Nairobi

+90%production efficiency

“Efficiency has gone up 90% in production.”

Abdul Rucyinga, Head of IT
Laboratory & Allied · Pharmaceutical manufacturing

Production efficiency is up 90%, and a three-month optimized plan across all workstations takes under 30 minutes.

Read the Laboratory & Allied review

Aerial view of Piristeel's roof safety factory in Kauhava

99.2%delivery reliability

“SkyPlanner has brought visibility to identifying bottlenecks and clarified production management.”

Toni Tuori, Production Manager
Piristeel · Roof safety and rainwater systems

Delivery reliability reached 99.2% this year, and scheduling saves up to four hours of working time per day.

Read the Piristeel review

Anu Järvinen, Production Manager at Fredman Operations, beside a robot palletising cell in Rauma

6 monthsof free capacity visible to sales

“SkyPlanner creates the foundation and reliability for all production planning.”

Anu Järvinen, Production Manager
Fredman Operations · Food-safe packaging papers

Sales sees free capacity six months ahead, and schedule-change requests that took an hour or more are answered in seconds.

Read the Fredman Operations review

FAQ

How does SkyPlanner APS connect to NetSuite?

In both directions, through the NetSuite REST record API, SuiteQL and, where needed, RESTlets. Operation dates are written with PATCH on manufacturingOperationTask. Labor and output post through the workOrderCompletion or assemblyBuild transform. The SkyPlanner team configures it during onboarding and supports it after go-live, and your NetSuite partner or own developers can build on the documented REST API.

Do we need the Advanced Manufacturing SuiteApp to use SkyPlanner?

No. SkyPlanner does the finite scheduling itself from standard Work Orders, Manufacturing Routings and Work Centers. If the account also runs Advanced Manufacturing, scoping settles which system sets operation dates.

How are duplicate postings avoided if an event is sent twice?

Each Work Order Completion carries the SkyPlanner timelog ID as its external ID. NetSuite keeps external IDs unique per record type, so a replayed event is rejected instead of posting quantity and cost again. Failed writes are queued, retried and logged.

Can we use TBA or SOAP instead of REST and OAuth 2.0?

For new integrations, plan on REST with OAuth 2.0. Oracle stops new TBA and SOAP integrations from 2027.1 and disables all SOAP endpoints in 2028.2. A SkyPlanner integration built on REST and OAuth 2.0 keeps working through both dates.

How does SkyPlanner learn about new NetSuite work orders?

NetSuite has no documented standard outbound webhook. A User Event script on Work Order queues a notification on save. A scheduled SuiteQL poll catches changes the script misses, such as CSV imports and mass updates.

Can we test SkyPlanner with NetSuite data before building the integration?

Yes. Export work centers, routings and open work orders as CSV, import them into SkyPlanner during the 30-day trial and compare the finite schedule with your current plan. Start the free trial or book a demo.

How long does a NetSuite integration project take?

Implementation is normally completed within weeks after onboarding starts, even for large companies. The schedule already runs on CSV data during the trial, and UTU runs SkyPlanner with NetSuite today (UTU review).