Post a NetSuite Journal Entry
Post journal entries from PlaidCloud project tables into NetSuite with the Post NetSuite Journal Entry workflow step. This guide builds a batch from a header table and a lines table, previews it without touching NetSuite, then posts it and reads back the result.
Prerequisites
Section titled “Prerequisites”- A working NetSuite connection with a role that can create journal entries (Create access on the Journal Entry record, in addition to the REST/OAuth setup the read-side guide covers).
- Two source tables in your project:
- A header table with one row per journal entry.
- A lines table with one or more debit/credit rows per journal entry.
Shape Your Header and Lines Tables
Section titled “Shape Your Header and Lines Tables”-
Build or import a header table with one row per journal entry. At minimum it needs:
Column Maps to Required A journal identifier Journal ID Yes The NetSuite subsidiary Subsidiary Yes The entry’s date Posting Date Yes The NetSuite currency Currency No An entry-level memo Memo No A caller-supplied external ID External ID No -
Build or import a lines table with one or more rows per journal entry, sharing the same journal identifier as its header row:
Column Maps to Required The journal identifier Journal ID Yes The GL account Account Yes The debit amount (0 if none) Debit Yes The credit amount (0 if none) Credit Yes A line-level memo Memo No Department, class, location, entity Department / Class / Location / Entity No -
Group amounts onto these two tables at whatever level you’re posting at — one entry per day, per document, per batch — using your usual table steps (a pivot, a group-by aggregate, or a join). The Journal ID is what ties a set of lines to its header row, so build it as a key that’s unique per journal entry and shared by every line that belongs to it.
Configure the Step
Section titled “Configure the Step”-
Add a Post NetSuite Journal Entry step to your workflow.
-
On the Connection tab, set NetSuite Connection to your NetSuite connection and pick an Environment.
-
On the Data tab:
- Set Journal Entry Header Table and Journal Entry Lines Table to the tables you built above.
- Leave Test Only Mode checked for now — see Preview and Validate.
- Leave Continue posting remaining entries if one entry fails checked, unless you’d rather a batch stop dead on its first bad entry.
- Set Posting Result Table to a table PlaidCloud can create or overwrite. You’ll want this for every run, not just the first — see Read the Result Table.
-
On the Header Map tab, map your header table’s columns to Journal ID, Subsidiary, Posting Date, and (if you have them) Currency, Memo, and External ID. Use Header Filters if you want to post only a subset of the header rows.
-
On the Line Map tab, map your lines table’s columns to Journal ID, Account, Debit, Credit, and (if you have them) Memo, Department, Class, Location, and Entity. Use Line Filters the same way.
Preview and Validate
Section titled “Preview and Validate”With Test Only Mode checked, run the step. PlaidCloud builds every journal entry from your mapped data and runs the same checks it would before posting — balanced debits and credits, required fields present, a valid posting date — without making a single call to NetSuite. Nothing posts.
-
Run the step (see Running one step in a workflow).
-
Open the result table and confirm every row you expected to post shows
status = validated. Any row readingerrornames the entry’s Journal ID and the problem — commonly an unbalanced entry, a missing Account, or a blank Subsidiary or Posting Date. -
Fix the source data (or your mappings and filters) for any
errorrow and re-run until the batch validates clean.
Post the Batch
Section titled “Post the Batch”Once a batch validates clean, uncheck Test Only Mode and run the step again. This time PlaidCloud actually posts each validated entry to NetSuite.
Read the Result Table
Section titled “Read the Result Table”The result table holds one row per journal entry attempted, whichever mode the step ran in:
| Column | Description |
|---|---|
| journal_id | The Journal ID from your header table. |
| external_id | The external ID used for this posting attempt (see below). |
| internal_id | NetSuite’s internal ID for the created entry. Blank in Test Only Mode and on error. |
| status | validated, posted, or error. |
| message | Error detail. Blank on success. |
Build downstream steps — a notification on any error row, a join back to your header table to record internal_id — off this table rather than off the step’s own run status, since one bad entry in a large batch doesn’t fail the whole step when Continue posting remaining entries is on.
Re-Running a Batch Safely
Section titled “Re-Running a Batch Safely”Each entry posts with a deterministic external ID built from your project, connection, Journal ID, Posting Date, and its line amounts. Re-running the step over an unchanged entry reuses that same external ID, and NetSuite’s own external-ID handling keeps it from creating a duplicate — so re-running a workflow after a transient failure is safe for the entries that didn’t change.
Related
Section titled “Related”- Connect to NetSuite — set up the connection this step posts through
- Post NetSuite Journal Entry reference — full field and configuration reference
- NetSuite SuiteQL Query Examples — pull the subsidiaries, accounts, and dimensions you’ll need as internal IDs
- Advanced Data Mapper Usage