> Documentation index: https://taggalongtech.github.io/continuous-control/llms.txt

# Monitoring & troubleshooting

Human page: https://taggalongtech.github.io/continuous-control/monitoring-troubleshooting.html

Observability is built in, not bolted on: every API call to NetSuite is a run you can open, filter, and read — down to the exact JSON that crossed the wire. When something fails, the answer is on this tab.

![The Sync Runs dashboard: KPI tiles for runs, success rate, failures and last sync; per-type status bars; a filterable run table](https://taggalongtech.github.io/continuous-control/assets/shots/sf-sync-runs.jpg)

*The Sync Runs tab: KPIs, per-type health bars, and the live run table.*

## The Sync Runs dashboard

The **Sync Runs** tab shows four KPIs (runs, success rate, failures, last sync), a health bar per sync type, and the run table — filterable by type and status, newest first, each row linking to its source record (the order, invoice, payment…). The status filter includes **Completed with warnings** as its own value, alongside Queued, Processing, Completed, and Failed, so an operator can isolate warned runs on their own. The type filter includes **Order Line Sync** (Salesforce 3.3.0). The type filter and the health bars leave out Cash App Pull, which is hidden (see [Shipped calls](ref-shipped-calls.md#cash-app-pull-hidden)).

**Completed with warnings** counts as a finished, successful run for the **Success** KPI — the same way it is terminal everywhere `Completed` is — so a warned booking does not drag the rate down. It gets its own amber pill (`cc-pill--warn`) in the run table so it still reads differently from a clean Completed row. Each per-type health bar reports the warned subset inline: a bar reading **12 ✓ (3 with warnings)** means all twelve finished, three of them with something to say.

## Reading a run

Expanding a run loads its payload and result JSON on demand. The reading order that solves most mysteries:
1. **Status + error snippet** — the one-line diagnosis.
2. **Result JSON** — NetSuite's answer: per-section counts, the id map, any errors; engine results (contracts rolled, plans built, POBs mirrored) merge in ~20–30 seconds after completion.
3. **Payload JSON** — exactly what was sent, mapping extras included. If a value is wrong in NetSuite, this shows whether it left Salesforce wrong.

Each run also records **where it went** — the endpoint URL, the HTTP method, and the action it sent — shown as a `POST · https://… · book` chip on the run row, with the full URL in the cell's tooltip. When a call is pointed at a [custom endpoint](calls-endpoints.md#endpoint-per-call), this is the fastest way to confirm which endpoint a failure actually hit.

On the sync card itself, a finished run's message — whether it is a warning or just something worth knowing — renders on an amber strip rather than the red failure strip: a **Completed with warnings** booking shows its "N lines have no NetSuite item" text there, prefixed *Completed with warnings:*; a plain **Completed** run carrying a softer note (say, a partial per-record failure count) shows the same text unprefixed. Neither means the run failed — the card only turns red while a run is genuinely not done.

Each checklist row then shows what the run **landed**, read off `Result_Json__c.counts`. A row that landed fewer records than the record holds is short: an amber warning icon, *<landed> of <held> synced*, and a **… with warnings** pill even on a plain `Completed` run. Short rows are judged on the booking and single-document cards only; a batch run, a pull, or a custom call keeps its green rows, and so does a row that carries its own done text (the engine story, an unapplied payment, no addresses to push). A **reload** shows the same thing: every card summary returns `lastRunStatus` plus `lastRunResult` (`CcNsSyncCallController.LastRunResult`: `counts`, `error`, `failedCount`, `contractsRolled`, `engine`, `engineSkipReason`), which the card maps through the same code as the live poll. A last run that ended `Failed` reloads with the red strip, the run's error and a **Booking failed** / **Sync failed** pill, the button offered again. See [Booking an order](booking-an-order.md#what-happens-when-you-click-book).

## Failure notifications

A failed run notifies the initiating user through the Salesforce bell, and optionally emails a configured address — see [Sync settings](sync-settings.md). Batch invoice runs are partial-failure aware: the run completes with a failed-document count and per-document errors, and only the failures return to scope next run.

## Common errors

| Symptom | Likely cause · fix |
|---|---|
| "Unauthorized endpoint" on test or sync | The host is not allow-listed — wizard step 2 lists the two standard entries; a call pointed at a [custom endpoint](calls-endpoints.md#endpoint-per-call) needs its own Remote Site as well |
| Validate reports "Host … has no Remote Site Setting" | The same cause, caught before Activate — add the host under Setup > Security > Remote Site Settings and validate again |
| Run Failed with an HTTP error naming an unfamiliar URL | The call points at an endpoint with a wrong script or deployment id. Fix the endpoint, or click **Reset to default** in the endpoint editor. Then re-activate and re-run |
| '"<Call>" isn't set up yet. Deploy the prebuilt calls in step 6 of the NetSuite Connection page, then try again.' | The prebuilt call has no row: step 6 of the [Connection wizard](connection-wizard.md) never ran. Only that step creates the calls. Run **Deploy prebuilt calls & mappings**, then sync again. Every start refuses before writing anything: a toast on the card, `Status = Error` on a Flow action, or a Failed run on a record the Flow started in the background |
| The sync card shows '"<Call>" isn't set up yet. … then reload this page.' instead of its button | Same cause, caught before anyone clicks. Deploy in step 6, then reload the record page |
| Calls & Mappings shows "No calls are set up yet." | Same cause. The tab never creates calls; click **Open NetSuite Connection** and deploy in step 6 |
| "Continuous Control isn't set up yet. Deploy the prebuilt calls in step 6 of the NetSuite Connection page, then try again." | The call exists but was never published (no activated snapshot, whatever `Status__c` says). Run **Deploy prebuilt calls & mappings** in the [Connection wizard](connection-wizard.md); it publishes every call that isn't live. Then book or sync again. A booking shows this as a toast or Flow fault with no run row. A customer sync marks its run Failed |
| A card row reads "<n> of <m> synced" with an amber warning icon | The last run landed fewer of that row's records than the record holds (`lastRunResult.counts` vs. the pre-run summary). The strip carries the run's `Error__c`. Fix what it names, then **Sync again** |
| The card's pill reads "Booking failed" / "Sync failed" on load | The newest run on the record is `Failed` (`lastRunStatus`). The red strip shows its `Error__c`, or the fallback *The last sync failed. Open the Sync Runs tab for details, then try again.* Fix the cause and run again |
| "NetSuite reported no order landed for order …" | The call reached NetSuite but produced no order. Read the run's errors first, then its payload — a booking that lands nothing is deliberately marked Failed rather than green |
| HTTP 401 / invalid signature | A credential is wrong or the token was revoked — re-enter in step 1, re-test in step 3 |
| "A booking run for this order is already in progress" | A live run exists — wait for it; a run stuck >10 minutes is auto-superseded by the next attempt |
| **Sync Order Lines** refused: "This order isn't in NetSuite yet. Book it first." / "This order's contract isn't in NetSuite yet. Book the order first." | The Order (or its Contract) has no `NetSuiteRecordId__c`. Book the order first |
| "This order is being booked to NetSuite right now. Sync its lines when the booking finishes." | A live (non-stale) booking run of the same order (`Order__c`). A line sync waits for it because both write the RC Order Lines. Sync again once the booking finishes. A line sync never blocks a booking |
| "An order line sync for this order is already in progress." | A live Order Line Sync run on the same order (`Scope_Id__c`, Type `Order Line Sync`). Wait; a stale one (>10 minutes) is superseded |
| "Order Line Sync needs one setup step after an upgrade. In Setup, add "Order Line Sync" to the Type picklist on NetSuite Sync Run, then try again." | The org was upgraded from before 3.3.0: an upgrade adds no value to the existing restricted `CC_NetSuite_Sync_Run__c.Type__c` picklist, so the run can't be filed (`CcNsSyncRunService.runTypeAvailable`). Add the value in Setup > Object Manager > NetSuite Sync Run > Type; step 6 shows the same reminder until it's there |
| "None of these order lines are in NetSuite yet. Book the order again to add them." / "This order has no order lines to sync." | None of the requested lines carries a `NetSuiteRecordId__c` (lines added after the booking), or the order has no lines. Book again, then sync the lines |
| "This order has too many lines to sync in one run. Sync the lines in smaller groups from a Flow." | The serialized payload would exceed `CcNsOrderLinePayloadBuilder.MAX_PAYLOAD_CHARS` (131,000, about 900 lines), since each leg sends the stored copy. Call **Sync Order Lines to NetSuite** per subset of Order Products |
| "This call needs Continuous NetSuite package 3.3.0 or later, and the connected account is running <x>. …" on an order line sync | Verify last stamped a package below 3.3.0 (`CcNsSyncRunService.checkNsVersionFloor`). Install ns-v3.3.0, then run **Verify installation** (step 4) so the stamp updates. If the stamp is blank or current but NetSuite is older, NetSuite refuses instead and the run is Failed with "this call needs Continuous Control NetSuite package 3.3.0; this account runs … Nothing was written." |
| Order line sync `Completed with warnings`: "NetSuite has no order line for <n> of these lines. Book the order first." | Salesforce holds a NetSuite id for those lines but NetSuite found no RC Order Line with that external id (`skipped`). Book the order again, then sync the lines |
| Order line sync `Completed with warnings`: "<n> order line(s) have no NetSuite record yet, so … weren't sent. Book the order again to add …" | Some of the order's lines were never booked; the rest were sent. Book again to add them |
| Order line sync error: "Order line <name> belongs to another Salesforce org: <org>. Only that org can update it, so nothing was written." | The RC Order Line's Source Org names a different org id (`stampedByOtherOrg`, compared by org id, not host). Update it from the org that booked it |
| Order line sync error: "Order line <name>: % Complete <v> is not a number from 0 to 100. …" / "…: the delivered date <v> is not a date. …" | That one line was refused; the others landed. Fix the value in Salesforce and sync again |
| Order line sync `engine: skipped` — "NetSuite found none of these order lines, so the POBs had nothing to update." | NetSuite matched none of the lines, so no engine leg ran. Book the order, then sync its lines |
| POBs look stale after a delivery or % change | An engine leg didn't finish. Click **Sync Order Lines** again: it re-runs Update POBs → Update Revenue Plans → POB mirror whenever NetSuite finds any line, changed or not |
| A % Complete POB recognized far less than expected | Update Revenue Plans reads `custrecord_cc_pob_pct_complete` as points (ns-v3.3.0): 0.4 is 0.4%, not 40%. Enter 40 for 40% and run Update Revenue Plans |
| "has no Contract. Add a Contract to the order" | The order has no Contract. Set it and book again. |
| Order card says "Activate first" | The order isn't Activated — the sync only books activated orders |
| A booked order shows "Prices aren't up to date. Refresh Prices." | Revenue Cloud sets `Order.ValidationResult = TransactionIncomplete` ("not configured and priced") whenever an order line is updated after activation through the sObject API, and the pricing banner shows for that value. Booking writes `OrderItem.NetSuiteRecordId__c` (`CcNsWritebackService`), so every booked order gets it, although no price changed; the Order header writeback alone doesn't. Continuous doesn't change Revenue Cloud's behavior. Don't use **Refresh Prices** on a booked order: repricing can change its amounts from what NetSuite holds. To hide the banner, turn on **Hide Price Refresh Notification** in Setup > Revenue Settings (`RevenueManagementSettings.hidePriceRefreshNtfcn`); it hides the banner on quotes too |
| Invoice skipped from a batch | Not Posted, already synced, account not NetSuite-matched, or a fully-converted negative (its credit memo syncs instead) — see [what qualifies](invoices-credit-memos.md) |
| "NetSuite returned a web page instead of data." | NetSuite answered a RESTlet call with HTML (a login or error page: expired token, wrong RESTlet URL). Run **Test the connection** in wizard step 3, fix what it reports, sync again. Every leg (booking, invoice, credit memo, payment, refund, product, customer, custom call, Cash App Pull, POB mirror read) reports it the same way |
| "NetSuite still had work left after 25 legs, so the run stopped." / "… didn't move its resume point …" | A booking or custom call chained more than `MAX_CONTINUATION_LEGS` (25) continuation legs, or NetSuite answered `partial` without advancing `continueFrom` / `customNodesFrom`. The run is marked Failed with what landed kept. Read the errors, then run again |
| "NetSuite reached its usage limit after `<n>` of `<m>` `<documents/payments/refunds/products>`. The next leg syncs the other `<x>`." / "…Sync the other `<x>` again." | An invoice, payment, refund, or product batch ran into NetSuite's usage limit partway through. Everything before the stop already landed | Nothing to do on a batch — the next leg picks up the rest. On a single-document call, run the sync again |
| "`<Payment/Refund/Product>` `<n>` stays unsynced because NetSuite reached its usage limit." / "Account `<name>` stays unsynced because NetSuite reached its usage limit." | The one document (or account) a leg was writing didn't finish — its extension records or billing mirrors didn't all land, so its id, and its custom-node records, were left out | For a batch call ("A batch retries it on its next leg"), nothing to do. Otherwise ("Sync it again"), sync that document or account again |
| "NetSuite reached its usage limit before `<n>` mapped record(s) were written. Sync again to write `<it/them>`." | Extension-node records that belong to no document (a parentless node) didn't all land before the leg ran out of usage | Sync again |
| "The `<action>` call stopped on an error in NetSuite: `<message>`. Check the script log in NetSuite, then run it again." | An error outside the action's own handling reached the RESTlet's dispatcher — something failed before NetSuite could even attempt the write | Open the script log in NetSuite for the detail, fix what it names, then run the call again |
| "`<n>` schedule row(s) are still being posted by another run … Run again in a few minutes to finish." | Recognize Revenue found rows another run (the scheduled close, or a second manual run) marked as posting moments ago, and left them alone rather than risk two journal entries for the same period | Wait a few minutes for the other run to finish, then run Recognize Revenue again |
| Card says "revenue engine didn't finish in NetSuite" | The sync succeeded; the chained `CcNsEngineQueueable` job died. The run keeps its status and warnings, and `Result_Json__c` gets `engine: failed` + `engineError`. Run **Refresh POBs** later |
| Wizard step 4 shows "This connection uses the `<role>` role. Move it to the Continuous Control Integration role. A later release limits the endpoint to that role and Administrator." (ns-v3.2.0) | `installcheck`'s `role` is neither Administrator nor `customrole_cc_integration` — advisory only, this release, since the RESTlet stays open to every role | Assign the [Continuous Control Integration role](install-netsuite.md) to the integration user, create a new access token for that user and role, and enter it in [wizard step 1](connection-wizard.md); the consumer key/secret stay the same |
| A run note: "`<what>`: NetSuite id `<n>` belongs to a different record. It was ignored, and the record was looked up by its Salesforce id." (ns-v3.2.0) | The `nsId` Salesforce sent for that record is real, but its externalid belongs to a different Salesforce record — `claimedByOther` refused to trust it | Nothing, usually — NetSuite fell back to the externalid lookup, exactly as if no id had been sent. If the wrong NetSuite record was updated, find which Salesforce record actually owns that externalid |
| A run note: "`<what>`: "`<value>`" is not a NetSuite id. It was ignored, and the record was looked up by its Salesforce id." (ns-v3.2.0) | The `nsId` Salesforce sent isn't a NetSuite internal id shape at all | Nothing — the externalid lookup ran instead. Check the source of that id if it recurs |
| A run error: "`<name>`: Files of type .`<ext>` are not accepted, so the file was not saved. Send a document or an image, such as a PDF." (ns-v3.2.0) | The generated document's extension is a script or markup type (`.js`, `.html`, and similar), or another type outside the accepted list | Regenerate the document as an accepted type, or send a PDF |
| A run error: "`<name>`: The file name cannot be used, so the file was not saved. Send a plain file name with no slashes." or "folder: The folder name "`<name>`" cannot be used. Nothing was saved. Name one subfolder of Continuous Documents with no slashes, or leave the name out." (ns-v3.2.0) | The document's file name, or the payload's `folderName`, has a path separator or another disallowed character | Fix the name at the source — a Salesforce document title shouldn't carry a slash — and sync again |
| A run error: "`<name>`: Continuous does not attach files to `<type>` records, so the file was not saved. Attach it to a record Continuous syncs, such as an invoice." (ns-v3.2.0) | The document's target record type isn't one Continuous syncs (see [`files`](ref-restlet-actions.md#files-folders-and-extensions)) | Attach the document to a record Continuous syncs |
| A run error: "`<scriptId>` is not on the relay allowlist, so nothing was sent. Add its script id to Relay Allowlist on Continuous Revenue Settings, or relay to a listed RESTlet." (ns-v3.2.0) | A call's relay target isn't on the settings record's **Relay Allowlist** | Add the target's script id to Relay Allowlist, or leave the list blank to allow any RESTlet except the Continuous endpoint |
| A run error naming a loop: "This call was already relayed by `<script>` …", "`<script>` already relayed this call …", or "This call was already relayed `<n>` times, and 3 is the limit." (ns-v3.2.0) | The relay chain (`relayChain`) came back to an endpoint already in it, or exceeded three hops | Fix the relay targets on the calls that forward this one so it doesn't loop or chain more than three deep |
| A run error: "`<label>`: NetSuite id `<n>` belongs to a different record, so this application was skipped. Sync that document again, then sync this one." or "… NetSuite id `<n>` is not an invoice / a payment or credit memo, so this application was skipped. …" (ns-v3.2.0) | A payment's, refund's, or credit memo's application target doesn't exist, or isn't the right kind of transaction for that application | Sync the target document (the invoice, payment, or credit memo) again, then sync this one — the error says to do exactly that |
| A run error: "`<value>` is not a NetSuite table name" or "`<value>` is not a NetSuite transaction type" (ns-v3.2.0) | A custom mapping's `write.table`/`write.tableType`, `lookups` entry, or `keyRef` names something that isn't a well-formed NetSuite table or transaction type code | Fix the table name or type code in the mapping row (a custom transaction type is `Custom<n>`, its internal id), then sync again |
| Flow action returns "Skipped: this change came from a Continuous Control writeback" | A record-triggered Flow fired inside our own writeback DML (`CcNsWritebackService.isWritebackInProgress()`), so `CcNsInvocableSupport.run` refused it to prevent a sync loop. Nothing to fix; add an entry condition to the Flow if you prefer |
| Invoice fails to save in NetSuite with a tax error | The customer resolves no tax code — check the account's nexus/default tax item setup ([manual setup](netsuite-manual-setup.md)) |
| Mapping warning on a run | A mapping row was skipped (bad path, incompatible type, or a field the sync's user can't read) — the warning names the row; fix it in the [editor](field-mappings.md), or give the user read access |
| "no NetSuite item for product …" — run `Completed with warnings` | The order landed but one or more lines' products have no matching NetSuite item; the card shows **Booked with warnings** and the run's error names the count. Fix the item — match or create it in [wizard step 7](connection-wizard.md), or directly in NetSuite — then re-book; the same Continuous record updates in place, same as any other re-sync |

## Safe retries

Because every sync is [idempotent](sync-runs-idempotency.md), the recovery procedure is almost always the same: fix the cause, click the same button again. Re-runs update the same NetSuite records, writebacks re-stamp the same ids, and the engine legs re-derive the same rollups. For NetSuite-side questions, the engine's run log (on the Continuous Control tab) records every engine execution with its counts.

## Exact message text and sources

Angle brackets are substituted at runtime.

| Message (verbatim) | Where it appears | Source |
|---|---|---|
| "<Call>" isn't set up yet. Deploy the prebuilt calls in step 6 of the NetSuite Connection page, then try again. | Any run whose prebuilt call has no `CC_NS_Call__c` row. Refused by every `CcNsSyncRunService.start*` as its last check before DML (no run row; card toast; Flow action `Status = Error`; a background Flow start files a Failed run with this as `Error__c`), by `CcNsPayloadBuilder.build` / `buildCustomerPayload` (booking start and payload preview), by `startCustomCall` when the Run NetSuite Call key names a prebuilt call, and by `runtimeEndpoint` for a leg reached any other way (the engine turns that one into the warning "POB mirror read skipped: …"). `<Call>` is the shipped name, e.g. "Invoice Sync". Not raised for the hidden Cash App Pull. | `CcNsCallRegistry.notDeployedMessage(callKey)` |
| "<Call>" isn't set up yet. Deploy the prebuilt calls in step 6 of the NetSuite Connection page, then reload this page. | Sync card, in place of its button, when `getCallSetup(callKey)` answers `deployed = false` for the card's built-in mode. A custom call never shows it. | `CcNsSyncCallController.getCallSetup` |
| No calls are set up yet. Deploy the prebuilt calls in step 6 of the NetSuite Connection page. | Calls & Mappings empty state (with an **Open NetSuite Connection** button) when `getCalls()` returns no calls. | `ccNsMappingEditor` |
| Continuous Control isn't set up yet. Deploy the prebuilt calls in step 6 of the NetSuite Connection page, then try again. | Booking or customer sync on a call that exists but has no activated snapshot. Booking: toast or Flow fault, no run row. Customer sync: run marked Failed. | `CcNsPayloadBuilder.NOT_SET_UP_MESSAGE` |
| "<Call>" is turned off. Turn it back on in Calls & Mappings, then try again. | Same path, when the call exists but is inactive. | `CcNsPayloadBuilder.requireActivated` |
| This order has no Contract. Add one before you book to NetSuite. | Order card gate hint (button disabled). | `ccNetSuiteSyncCall.gateHintText` |
| Order <OrderNumber> has no Contract. Add a Contract to the order, then book it to NetSuite. | Build exception if a booking is started without a Contract (Flow action). | `CcNsPayloadBuilder.build` |
| Activate first / Activate the order to enable booking to NetSuite. | Order card pill and gate hint. | `ccNetSuiteSyncCall` `OrderBooking` config |
| <landed> of <held> synced | Sync card row status for a SHORT row: the finished run's count for that row (live `getRunStatus` result, or `lastRunResult.counts` after a reload) is below the pre-run summary's. Amber warning icon, tooltip "Not all records synced". Booking and single-document cards only. | `ccNetSuiteSyncCall.finishedRow` / `isShortfall` |
| Booking failed · Sync failed | Sync card pill in the ready state when the last run ended `Failed`, live or read back on load (`lastRunStatus`). **Booking failed** is the Order Booking card's; every other mode says **Sync failed**. | `ccNetSuiteSyncCall.statusPill` |
| The last sync failed. Open the Sync Runs tab for details, then try again. | Sync card red strip on load when the last run is `Failed` and its `Error__c` is blank. | `ccNetSuiteSyncCall.applyPersistedState` |
| <n> line has / <n> lines have no NetSuite item. Match the item in wizard step 7 or in NetSuite, then book again. | Run `Error__c`, status `Completed with warnings`; the card prefixes it "Completed with warnings: ". Counts RESTlet errors containing `no NetSuite item for product`. | `CcNsBookOrderQueueable`; RESTlet `cc_action_book.js` |
| NetSuite reported no order landed for <order>, so this booking created no NetSuite order. See the errors above and the run payload for detail. | Run marked `Failed` when the RESTlet's `counts.order` is 0. | `CcNsBookOrderQueueable` |
| A booking run for this order is already in progress. | Starting a second booking while one is live. Runs older than 10 minutes (`STALE_MINUTES`) are superseded. Siblings: "An order line sync for this order is already in progress.", "An invoice sync for this scope is already in progress.", "A payment sync for this batch run is already in progress.", "A sync for this product is already in progress.", "A sync for this account is already in progress.", "A sync for this refund is already in progress.", "A refresh for this contract is already in progress.", "A cash application pull is already in progress.", "A run for this record is already in progress." | `CcNsSyncRunService` |
| Unauthorized endpoint | Salesforce platform callout error on a run (host has no Remote Site Setting). | Platform |
| NetSuite returned a web page instead of data. Check the RESTlet URL, and run Test the connection in step 3 of the NetSuite Connection wizard. It began: <first 200 characters> | Run `Error__c` when a RESTlet answers a 200 whose body isn't a JSON object (the prefix reads "NetSuite returned an answer that isn't JSON." when the body isn't HTML). | `CcNsRestClient.parseBody` |
| NetSuite still had work left after 25 legs, so the run stopped. What already landed in NetSuite is kept. Check the run's errors, then book the order again. | Booking run marked Failed at the continuation cap (the custom call says "run the call again"). | `CcNsBookOrderQueueable.nextLegStop`, `CcNsCustomCallQueueable` |
| <Type> sync job died: <reason> | Run marked Failed by the finalizer when a sync leg dies outright (limit, uncaught error). Types: Booking, Invoice, Credit memo, Payment, Refund, Product, Customer, Order line, Custom call, Cash App Pull, POB refresh. | `CcNsBookOrderQueueable.RunFailFinalizer` |
| This order isn't in NetSuite yet. Book it first. · This order's contract isn't in NetSuite yet. Book the order first. · This order is being booked to NetSuite right now. Sync its lines when the booking finishes. · An order line sync for this order is already in progress. · None of these order lines are in NetSuite yet. Book the order again to add them. · This order has no order lines to sync. · This order has too many lines to sync in one run. Sync the lines in smaller groups from a Flow. | Order Line Sync start refusals: card toast, Flow action `Status = Error`, or a background Flow start's Failed run. | `CcNsSyncRunService.startOrderLineSync` |
| This call needs Continuous NetSuite package <v> or later, and the connected account is running <x>. Install the current NetSuite release, then run Verify installation on the NetSuite Connection page, step 4. | Run start when Verify's stamp is below the call's floor (Order Line Sync: 3.3.0). | `CcNsSyncRunService.checkNsVersionFloor` |
| 1 order line has / <n> order lines have no NetSuite record yet, so it wasn't / they weren't sent. Book the order again to add it / them. | Order Line Sync run `Error__c` (warning) for lines with no `NetSuiteRecordId__c`. | `CcNsOrderLinePayloadBuilder.ineligibleWarning` |
| NetSuite has no order line for <n> of these lines. Book the order first. | Order Line Sync run warning for `skipped` lines. | `CcNsSyncOrderLinesQueueable.warningsOf` |
| NetSuite didn't accept the order line sync. Check the run's result for detail, then try again. | Order Line Sync `ok:false` with no errors of its own. Run Failed. | `CcNsSyncOrderLinesQueueable` |
| NetSuite still had lines left after 25 legs, so the run stopped. The lines already updated in NetSuite are kept. Sync the order lines again. · NetSuite asked for another leg but didn't move past line <n>, so the run stopped. … | Order Line Sync continuation cap or a cursor that didn't move. Run Failed; the engine leg still runs for the lines that landed. | `CcNsSyncOrderLinesQueueable.nextLegStop` |
| NetSuite found none of these order lines, so the POBs had nothing to update. | `Result_Json__c.engineSkipReason` (`engine: skipped`) on an Order Line Sync. | `CcNsSyncOrderLinesQueueable` |
| Order line <name>: … Fix it in Salesforce and sync again. Nothing was written for this line. · Order line <name> belongs to another Salesforce org: <org>. Only that org can update it, so nothing was written. · Line <n> of the request has no Salesforce id, so it was skipped. · Order line <name>: NetSuite did not save the update: <msg>. Sync it again. | Per-line `errors` from the `orderlines` action; the other lines land. | `cc_action_orderlines.js lineRow` |
| Syncing order lines to NetSuite… · Order lines synced. <n> updated, <m> unchanged. · Order lines synced with warnings. … · Order line sync failed. … | The Order card's line-sync status line (read back after a reload). The failed fallback is "Open the Sync Runs tab for details, then try again." | `ccNetSuiteSyncCall.lineSyncText` |
| Revenue engine job died: <reason> | Stored as `Result_Json__c.engineError` (with `engine: failed`) when the engine leg dies after a successful sync. The run's status and `Error__c` are not changed. | `CcNsEngineQueueable.EngineDeathFinalizer` |
| Skipped: this change came from a Continuous Control writeback | Flow action result (`Status = Error`) for every request made while our writeback DML is running. | `CcNsInvocableSupport.run` |
| Salesforce blocked the call to NetSuite. Add the Remote Site Settings in step 2, then verify again. | Wizard connection test (failed step `remoteSites`). | `CcNsConnectionSetupController` |
| Host <host> has no Remote Site Setting (Setup > Security > Remote Site Settings). Runs will fail until it is added. | Calls & Mappings **Validate** on a call with an endpoint override. | `CcNsCallLifecycle` |
| NetSuite rejected the signature (HTTP <401/403>). Recheck the consumer key/secret and token id/secret in step 1, and that the token's role can access the RESTlet. | Wizard connection test (failed step `credentials`). On a run, the same cause shows as an HTTP 401 error. | `CcNsConnectionSetupController` |
| NetSuite answered but did not recognize the test call. Check the RESTlet script and deployment ids in step 1. | Wizard connection test. | `CcNsConnectionSetupController` |
| NetSuite reached its usage limit after <n> of <m> payments. The next leg syncs the other <x>. | A note on a `payments` batch leg that stopped between documents; `<m>`'s noun is the action's own (`documents` for invoices/credit memos, `payments`, `refunds`, `products`). Batch actions (invoices, payments) say "The next leg syncs the other <x>."; single-run actions (refunds, products) say "Sync the other <x> again." | `cc_action_custom.js docAnswer` |
| Payment <n> stays unsynced because NetSuite reached its usage limit. A batch retries it on its next leg. Otherwise sync it again. | The document a leg was writing (invoice, credit memo, or payment — batch actions) didn't land whole; its id is withheld. Refunds and products (never batched) drop the "A batch retries…" sentence and end at "Sync it again." | `cc_action_custom.js docAnswer` |
| Account <name> stays unsynced because NetSuite reached its usage limit. Sync it again. | The customer sync's own document unit (customer + contacts + extension nodes) didn't land whole. | `cc_action_customer.js postCustomer` |
| NetSuite reached its usage limit before <n> mapped record(s) were written. Sync again to write <it/them>. | Extension-node entries that belong to no document (a parentless node) didn't all land before the leg ran out of usage, on `invoices`, `payments`, `refunds`, `items`, or `custom`. | `cc_action_custom.js finishRest` |
| The <action> call stopped on an error in NetSuite: <message>. Check the script log in NetSuite, then run it again. | An exception thrown outside any action's own try/catch, caught by the dispatcher's last resort. Answers `{ok:false, version, errors}` instead of NetSuite's raw error page; logged at ERROR. Every call (whatever it answers) also logs one AUDIT line: action, payload size, usage before/after. | `cc_control_rl.js post` |
| <n> schedule row(s) are still being posted by another run and was/were left alone. Run again in a few minutes to finish. | Recognize Revenue's headless/manual partial answer: a period carries a `Posting <token>` mark under 10 minutes old (`STALE_MARK_MS`), so this run left its rows for the run that marked them. | `cc_rev_rec_run.js partialText` |
| <n> schedule row(s) are being posted by another run right now, so this run left <it/them> alone. Run again in a few minutes. | Same in-flight hold, worded for the Recognize Revenue results page. | `cc_rev_rec_run.js resultsHtml` |
| This connection uses the <name> role. Move it to the Continuous Control Integration role. A later release limits the endpoint to that role and Administrator. | `installcheck`'s `notes[]`, wizard step 4, for a token on any role but Administrator or `customrole_cc_integration`. `<name>` falls back to `the <scriptId> role`, then `the role with internal id <id>`, when the token's own role can't read the role list. Never fails the check. | `cc_action_setup.js roleMoveNote` (ns-v3.2.0) |
| <what>: NetSuite id <n> belongs to a different record. It was ignored, and the record was looked up by its Salesforce id. | A run note when a caller-sent `nsId` resolves to a record whose externalid names a different Salesforce record. `<what>` names the record, e.g. "Customer Kingsbridge Digital" or "Billing schedule Schedule A0". | `cc_control_ctx.js staleNote` (ns-v3.2.0, audit N15) |
| <what>: "<value>" is not a NetSuite id. It was ignored, and the record was looked up by its Salesforce id. | Same note, when the caller-sent value isn't a NetSuite internal id shape (`NS_ID_RE`) at all. | `cc_control_ctx.js staleNote` |
| <what>: NetSuite id <n> was not found. It was ignored, and the record was looked up by its Salesforce id. | Same note, when the id is a valid shape but no such record exists in that table. | `cc_control_ctx.js staleNote` |
| <label>: NetSuite id <n> belongs to a different record, so this application was skipped. Sync that document again, then sync this one. | A payment/refund/credit-memo application's target resolves to a document another Salesforce record owns. | `cc_control_ctx.js applicationTarget` (ns-v3.2.0, audit N15) |
| <label>: NetSuite id <n> is not an invoice, so this application was skipped. Sync that document again, then sync this one. | The application's target exists but isn't the transaction type the application needs (a payment or credit memo needs `CustInvc`). | `cc_control_ctx.js applicationTarget` — `APPLY_TARGET_NOUN.customerpayment` / `.creditmemo` |
| <label>: NetSuite id <n> is not a payment or credit memo, so this application was skipped. Sync that document again, then sync this one. | Same, for a customer refund's application (needs `CustPymt`, `CustCred`, or `CustDep`). | `cc_control_ctx.js applicationTarget` — `APPLY_TARGET_NOUN.customerrefund` |
| <label>: "<value>" is not a NetSuite id, so this application was skipped. Sync that document again, then sync this one. | The application's `invoiceNsId` isn't a NetSuite internal id shape. | `cc_control_ctx.js applicationTarget` |
| <label>: NetSuite id <n> belongs to a different record. It was ignored, and the document this call synced was used. | A run note, not an error: the same call already landed the real target document under `invoiceSfId` (a mixed-sign RCA split — a residual invoice and a credit memo riding one payload), so the bad `invoiceNsId` is ignored in favor of it rather than skipping the application. | `cc_control_ctx.js applicationTarget` |
| <name>: The file name cannot be used, so the file was not saved. Send a plain file name with no slashes. | The `files` action's file name carries a path separator or control character. | `cc_action_setup.js fileRefusal` (ns-v3.2.0, audit N12) |
| folder: The folder name "<name>" cannot be used. Nothing was saved. Name one subfolder of Continuous Documents with no slashes, or leave the name out. | The `files` action's `folderName` carries a path separator or is all dots. Refused before the folder lookup runs, so nothing is created. | `cc_action_setup.js subfolderName` |
| <name>: Files of type .<ext> are not accepted, so the file was not saved. Send a document or an image, such as a PDF. | The file's extension isn't in `FILE_TYPES` (document and image types only) — a script or markup extension (`.js`, `.html`, `.svg`, and similar) included. | `cc_action_setup.js fileRefusal` |
| <name>: Continuous does not attach files to <type> records, so the file was not saved. Attach it to a record Continuous syncs, such as an invoice. | The file's `recordType` isn't one of `ATTACH_TYPES` — the record types Continuous syncs. | `cc_action_setup.js fileRefusal` |
| <value> is not a NetSuite internal id, so the file was not saved. Send the id of the record to attach it to. | The file's `nsId` isn't a positive integer string. | `cc_action_setup.js fileRefusal` |
| <scriptId> is not on the relay allowlist, so nothing was sent. Add its script id to Relay Allowlist on Continuous Revenue Settings, or relay to a listed RESTlet. | The relay target isn't on a non-blank Relay Allowlist. | `cc_action_relay.js doRelay` (ns-v3.2.0, audit N16) |
| The relay allowlist on Continuous Revenue Settings could not be read, so nothing was sent. Check that the record opens in NetSuite, then run the call again. NetSuite said: <reason> | Continuous Revenue Settings exists but its Relay Allowlist field couldn't be read (a permission or record-access problem, not a blank list). | `cc_action_relay.js doRelay` |
| This call was already relayed by <script>, so relaying it again would loop. Nothing was sent. Check the relay targets on the calls that forward it. | The forwarded `relayChain` already names this endpoint — the call has come back around. | `cc_action_relay.js doRelay` |
| <script> already relayed this call, so relaying back to it would loop. Nothing was sent. Point the call at a RESTlet that answers it. | The forwarded `relayChain` already names the target — relaying to it again would send the call in a circle. | `cc_action_relay.js doRelay` |
| This call was already relayed <n> times, and 3 is the limit. Nothing was sent. Point the call at the RESTlet that answers it. | The chain would grow past `MAX_CHAIN` (3) relays. | `cc_action_relay.js doRelay` |
| <value> is not a NetSuite table name. Nothing was looked up. | A bulk resolver's own `table` (e.g. `resolveEids`) doesn't match `/^[a-z][a-z0-9_]*$/`. | `cc_control_ctx.js checkTable` (ns-v3.2.0, audit N11) |
| lookup <field>: <value> is not a NetSuite table name. It was not looked up. Fix the node's mapping, then sync again. | A `write.lookups[field].table` (or a nested row's `keyRef.table`/`parentRef.parentTable`) is malformed — refused per field; the record's other fields and its siblings still land. | `cc_record_writer_lib.js refProblem` |
| The write block's table <value> is not a NetSuite table name. Nothing was written. Fix the table in the node's write block, then sync again. | The entry's own `write.table` is malformed — the whole entry is refused, not just one field. | `cc_record_writer_lib.js` |
| keyRef: <value> is not a NetSuite transaction type / … is not a NetSuite table name | A nested row's `keyRef.tableType` or `keyRef.table` is malformed. | `cc_record_writer_lib.js refProblem` |
| The write block's tableType <value> is not a NetSuite transaction type. Nothing was written. Fix the tableType in the node's write block, then sync again. | The entry's own `write.tableType` doesn't match a native code or `/^Custom\d+$/` — the whole entry is refused. | `cc_record_writer_lib.js` |
| <node> / <target>: the user running this sync can't read <Object.Field>. Row skipped. Give that user read access to the field, or remove the row. | Run warning (`mappingWarnings`). The mapped fields are read in `USER_MODE` as the user who started the sync, and a path that user can't read is dropped before the query. | `CcNsMappingService.apply` / `requery` |
| Custom node <key>: query failed (the user running this sync can't read <Object.Field>). Node skipped. | Run warning. An added object's `USER_MODE` query touched a field the user can't read (often the row filter). | `CcNsCustomNodeService.queryNode` (`QueryException.getInaccessibleFields()`) |
| Custom node <key>: the filter's parentheses or quotes don't match. Fix the Filter on this node. Node skipped. | Run warning. The row filter would escape the parentheses it is wrapped in. | `CcNsCustomNodeService.checkedFilter` |
| <what the user was doing>. Something unexpected went wrong in Salesforce. Try again. If it keeps happening, ask your Salesforce admin to check the debug log. | Toast from a card, the wizard or the mapping editor when an `@AuraEnabled` method hits a platform exception (null pointer, list, type and the like). The raw type, message and stack go to the debug log at `ERROR`. The package's own messages (`AuraHandledException`, `CcNs*Exception`) pass through unchanged. | `CcNsErrors.toUser` |
| … Salesforce couldn't save the change: <Salesforce's reason>. Fix that, then try again. | Same, for a `DmlException`. The reason is the first row's `getDmlMessage` (a validation rule, "Required fields are missing: [Name]"). | `CcNsErrors.toUser` |
| … Salesforce couldn't read the records this needs. Try again. If it keeps happening, ask your Salesforce admin to check the debug log. | Same, for a `QueryException`. | `CcNsErrors.toUser` |
| … You don't have access to a record or field this needs. Ask your Salesforce admin to check your Continuous Control permission set. | Same, for `NoAccessException`, `SecurityException`, a `USER_MODE` query refused for inaccessible fields, or a DML status `INSUFFICIENT_ACCESS*`. | `CcNsErrors.toUser` |
| … Salesforce couldn't reach NetSuite. Check the connection on the NetSuite Connection tab, then try again. | Same, for `System.CalloutException` (timeout, blocked host). | `CcNsErrors.toUser` |
| … Another process was updating the same record. Wait a minute, then try again. / … Salesforce has too many background jobs waiting. Wait a few minutes, then try again. | Same, for DML status `UNABLE_TO_LOCK_ROW` / `AsyncException`. | `CcNsErrors.toUser` |
| <value> is not a NetSuite transaction type. Nothing was looked up. | A bulk resolver's own `tableType` (e.g. `resolveTxnEids`) is malformed. | `cc_control_ctx.js` (twin of `cc_record_writer_lib.js`'s checks — `tools/ns-sql-safety-test.js` asserts the two code lists stay identical) |

Sync Runs tab labels (`ccNsSyncRuns`): KPI tiles Runs · Success · Failed · Last sync; filters "All types" / "All statuses"; types Order Booking · Invoice Sync · Credit Memo Sync · Payment Sync · Refund Sync · Product Sync · Customer Sync · Order Line Sync · POB Refresh · Custom Call; statuses Queued · Processing · Completed · Completed with warnings · Failed; table columns Run · Type · Status · Source · Started · Duration · Error; expanded panels "Payload → NetSuite" and "Result ← NetSuite"; amendment bookings show type "Order Booking · Amendment".

