transactionline
transactionSubsidiary-scopedLocation-scopedThe line grain of the transaction spine: item, quantity, rate and transaction-currency amounts, plus the subsidiary, location, class and department that scope the line.
the mainline column separates the header row from the real lines — Oracle's own SuiteQL examples filter mainline = 'T' for header grain, so line-grain analytics take the inverse, mainline = 'F'. Forgetting it double-counts every document.
This is where subsidiary lives, where createdfrom points at the upstream document, and where quantities are. Amounts here are TRANSACTION currency (foreignamount, netamount, creditforeignamount, debitforeignamount); base-currency amounts are on transactionaccountingline. uniquekey is the line's stable key; id repeats the line identifier.
What the badges mean
- master
- Data class: what the record holds — master data, transaction documents, control/configuration, or a documented convenience record. NetSuite has no product-family or schema axis, so this is the whole classification.
- Subsidiary-scoped
- The record carries a
subsidiarycolumn that partitions its rows, so the generated SQL anchors it. On a few records the column is a multiselect rather than a scalar foreign key — the table notes say which (see the quirks guide). - Location-scoped
- The record carries a
locationcolumn — an org segment in NetSuite before it is a warehouse — and the generated SQL anchors it the same way. - View
- A documented convenience record rather than a stored one. Land the records it stands in for instead of assuming it extracts as-is — the table notes say where the rows actually live.
Structural facts — how the record is partitioned, not a trap by itself
Join & extract hazards — verify before you rely on this
'T'/'F' string.Header & line
transactionline rows join back to their header transaction on the transaction id — one document, many lines.
Record types
The business documents that live in this table. NetSuite stores them all in one table family separated by the type column, so a sales order and an item fulfillment are the same rows under different type values. Oracle publishes no list of those values — read them from your own account with SELECT DISTINCT type FROM transaction.
- Sales Ordersalesorder
Has its own analytics record page, but the queryable rows live on transaction / transactionline filtered by type. Discover the type value in-account with SELECT DISTINCT type.
- Purchase Orderpurchaseorder
As with the sales order: a record page exists, but the data path is transaction / transactionline filtered by type.
- Item Fulfillmentitemfulfillment
No dedicated analytics record — verified absent from the 2021.1 catalog. Query transaction filtered by type; the 2025.2 script browser page is the provenance.
- Item Receiptitemreceipt
No dedicated analytics record — query transaction filtered by type.
- Transfer Ordertransferorder
No dedicated analytics record — query transaction filtered by type. transactionline.transferorderitemlineid is the line-level tie-back.
- Inventory Adjustmentinventoryadjustment
No dedicated analytics record — query transaction filtered by type.
- Quote (Estimate)estimate
The UI calls it a quote; the record id is estimate. First document of the order-to-cash chain, and a row on the transaction spine like every other — discover its type value in-account with SELECT DISTINCT type.
- Invoiceinvoice
Has its own record page, but invoices are rows on the transaction spine. Its line-level tie-back to the order it billed runs through the forward line-link table; see quirks #document-links.
- Cash Salecashsale
The paid-on-the-spot sibling of the invoice — a separate type value on the same spine, so a revenue read that filters only for invoices silently omits it.
- Customer Paymentcustomerpayment
No dedicated analytics record — verified absent from the 2021.1 catalog, so the 2025.2 script browser page is the provenance. Query transaction filtered by type; what the payment applies to is a link, not a column.
- Credit Memocreditmemo
The returns and adjustments side of receivables, on the same spine. Net revenue means netting these against invoices by type — one more reason to hold your own type mapping.
- Return Authorizationreturnauthorization
The customer-return document that precedes the receipt and the credit memo — a spine row that chains back to the original order through the line links.
- Work Orderworkorder
The manufacturing order is a document like any other: a row on the transaction spine, filtered by type. Its BOM and routing are master records of their own, and manufacturingoperationtask is the one record that points back at the order; see quirks #work-orders.
- Assembly Buildassemblybuild
No dedicated analytics record — verified absent from the 2021.1 catalog. The receipt of finished goods from a work order, posted as inventory-affecting lines on the spine, so completions are a spine query rather than a manufacturing table.
- Assembly Unbuildassemblyunbuild
No dedicated analytics record — query transaction filtered by type. It reverses a build, so a completions measure that ignores it overstates output.
- Work Order Issueworkorderissue
No dedicated analytics record — query transaction filtered by type. Component consumption against a work order, which is why material usage is read from transactionline and not from the BOM.
- Work Order Completionworkordercompletion
No dedicated analytics record — query transaction filtered by type. The completion posting in the multi-step manufacturing flow, the counterpart of the single-step assembly build.
- Work Order Closeworkorderclose
No dedicated analytics record — query transaction filtered by type. Closing an order stops further postings against it, so a work-in-process measure needs this document as its end boundary.
- Cash Refundcashrefund
The money-out counterpart of the cash sale, and the paid-on-the-spot sibling of the credit memo — a separate type value on the same spine, so a returns measure built only from credit memos misses it.
- Customer Depositcustomerdeposit
No dedicated analytics record — verified absent from the 2021.1 catalog. Customer cash taken and held before an invoice exists, so it is a liability on the spine rather than revenue; counting it as a receipt against sales overstates both.
- Deposit Applicationdepositapplication
No dedicated analytics record — query transaction filtered by type. The document that draws a held deposit down against an invoice; what it applies to is a link, not a column, so the chain runs through the line links (quirks #document-links).
- Journal Entryjournalentry
No dedicated analytics record — verified absent from the 2021.1 catalog. The manual GL document, and a row on the spine like every other: there is no journal record and no published enumeration of journal types anywhere, so discover the types your account uses in-account with SELECT DISTINCT type, exactly as for every other document.
- Vendor Billvendorbill
The payables counterpart of the invoice — what a purchase order becomes when the vendor asks to be paid. A record page exists, but the rows are on transaction / transactionline filtered by type.
- Vendor Paymentvendorpayment
No dedicated analytics record — verified absent from the 2021.1 catalog. What a payment pays is a link, not a column: the bills it settles are reached through the line links, not by reading a field on the payment.
- Vendor Creditvendorcredit
The payables-side credit memo — the document that reduces what is owed to a vendor. Net spend means netting these against vendor bills by type.
- Checkcheck
A direct disbursement — money out without a bill behind it. It sits on the same spine as the vendor payment and is a different type value, so a cash-out measure needs both.
- Depositdeposit
No dedicated analytics record — verified absent from the 2021.1 catalog. The bank-deposit document that sweeps undeposited funds into an account, which is why cash received and cash banked are two different dates on two different spine rows.
- Vendor Return Authorizationvendorreturnauthorization
The purchase-side return, and the counterpart of the customer return authorization — the document that precedes sending stock back to a vendor and the credit that follows it.
Fields
19 fields · 3 key
19 fields.
| # | Field | Description | Type | Flags |
|---|---|---|---|---|
| 1 | id | Line ID | NUMBER | Primary-key field |
| 2 | transaction | Parent transaction (internal id) | NUMBER | Primary-key field |
| 3 | uniquekey | Stable unique key for the line | NUMBER | Primary-key field |
| 4 | linesequencenumber | Line number as displayed | NUMBER | |
| 5 | mainline | Header row marker — 'T' is the document header, 'F' the real lines | VARCHAR | |
| 6 | taxline | Tax line | VARCHAR | |
| 7 | subsidiary | Subsidiary (internal id) — the OneWorld partition lives here, not on the header | NUMBER | |
| 8 | location | Location (internal id) | NUMBER | |
| 9 | item | Item (internal id) | NUMBER | |
| 10 | quantity | Line quantity | NUMBER | |
| 11 | rate | Unit rate | NUMBER | |
| 12 | foreignamount | Line amount in TRANSACTION currency | NUMBER | |
| 13 | netamount | Net amount in transaction currency | NUMBER | |
| 14 | creditforeignamount | Credit amount in transaction currency | NUMBER | |
| 15 | debitforeignamount | Debit amount in transaction currency | NUMBER | |
| 16 | createdfrom | Upstream document this line was created from (internal id) | NUMBER | |
| 17 | units | Unit of measure on the line (internal id) | NUMBER | |
| 18 | isclosed | Line closed | VARCHAR | |
| 19 | linelastmodifieddate | Line last modified — the line-level incremental watermark | DATE |
Field provenance: hand-curated. 3 key fields.
Boilerplate SQL
Starting point for reading the Connect-landed copy of transactionline on Databricks — dates are real DATE/TIMESTAMP columns and need no conversion, and the partition anchors are already in place. The linelastmodifieddate watermark is in place too. Set your Unity Catalog location, schema, and filter values below; they’re substituted into the SQL and the copy button.
8 parameters not filled: <catalog>, <schema>, <subsidiary_id>, <location_id>, <id>, <transaction>, <uniquekey>, <watermark>
-- ============================================================
-- Table : transactionline — The line grain of the transaction spine: item, quantity, rate and transaction-currency amounts, plus the subsidiary, location, class and department that scope the line.
-- Purpose: Column-selected read of transactionline — auto-generated from field metadata
-- Grain : One row per id + transaction + uniquekey
-- Caution: the mainline column separates the header row from the real lines — Oracle's own SuiteQL examples filter mainline = 'T' for header grain, so line-grain analytics take the inverse, mainline = 'F'. Forgetting it double-counts every document.
-- Notes : Auto-generated skeleton for NetSuite data landed in your lakehouse from a SuiteAnalytics Connect (or SuiteQL) extract — it never addresses live NetSuite. Identifiers are lowercase as NetSuite2.com renders them. Select-type columns hold numeric internal ids: BUILTIN.DF() display resolution exists only at extraction time, so decode ids by joining the landed list records; see quirks #display-values. Check-box columns arrive as 'T'/'F' strings; see quirks #tf-booleans.
-- ============================================================
SELECT
t.id AS "Line ID",
t.transaction AS "Parent transaction (internal id)",
t.uniquekey AS "Stable unique key for the line",
t.linesequencenumber AS "Line number as displayed",
t.mainline AS "Header row marker — 'T' is the document header, 'F' the real lines", -- 'T'/'F' string — compare = 'T', or CAST via CASE; see quirks #tf-booleans
t.taxline AS "Tax line", -- 'T'/'F' string — compare = 'T', or CAST via CASE; see quirks #tf-booleans
t.subsidiary AS "Subsidiary (internal id) — the OneWorld partition lives here, not on the header",
t.location AS "Location (internal id)",
t.item AS "Item (internal id)",
t.quantity AS "Line quantity",
t.rate AS "Unit rate",
t.foreignamount AS "Line amount in TRANSACTION currency",
t.netamount AS "Net amount in transaction currency",
t.creditforeignamount AS "Credit amount in transaction currency",
t.debitforeignamount AS "Debit amount in transaction currency",
t.createdfrom AS "Upstream document this line was created from (internal id)",
t.units AS "Unit of measure on the line (internal id)",
t.isclosed AS "Line closed", -- 'T'/'F' string — compare = 'T', or CAST via CASE; see quirks #tf-booleans
t.linelastmodifieddate AS "Line last modified — the line-level incremental watermark"
FROM <catalog>.<schema>.transactionline t
WHERE
t.subsidiary = <subsidiary_id> -- OneWorld partition — see quirks guide #oneworld
AND t.location = <location_id> -- location scope — see quirks guide #oneworld
AND t.mainline = 'F' -- line grain; 'T' is the document header row — see quirks guide #transaction-spine
-- AND t.id = <id>
-- AND t.transaction = <transaction>
-- AND t.uniquekey = <uniquekey>
-- AND t.linelastmodifieddate >= DATE '<watermark>' -- inserts and updates only — deletes never appear here; diff deletedrecord, which is itself blind to line-level deletes (see quirks #deletes)
ORDER BY t.id;Verified August 2026 · Analytics Browser 2021.1 · corroborated 2025.2
Select columns hold internal ids, not display text — see decoding display values.
Relationships
Diagram of 1-hop neighbors — join details below. Document-link edges are highlighted; they chain one document to the next and are the joins newcomers most often get wrong.
Join details
ON transaction.id = transactionline.transactionON transactionline.transaction = transactionaccountingline.transaction AND transactionline.id = transactionaccountingline.transactionline AND transactionaccountingline.accountingbook = <accounting_book_id> -- TAL duplicates once per accounting book (max 5) and is stated in the subsidiary's base currency; TL is transaction currency — see quirks #tal-and-booksON transactionline.item = item.idON transactionline.location = location.idON transactionline.subsidiary = subsidiary.idON transactionline.createdfrom = transaction.idON nexttransactionlinelink.previousline = transactionline.idON nexttransactionlinelink.nextline = transactionline.idON previoustransactionlinelink.previousline = transactionline.idON previoustransactionlinelink.nextline = transactionline.idON inventoryassignment.transactionline = transactionline.id
More Transactions tables
- transactionshipmentThe shipment satellite of a transaction: ship-from and ship-to addresses, ship method, shipping and handling rates, weight, and whether the shipment has been fulfilled.
- transactionshippingaddressThe shipping address as it was stamped on a document: the formatted block plus the parsed lines, city, state, zip, country and phone, keyed by the address key the transaction header points at.
- nexttransactionlinelinkThe forward line-link table: one row per line-to-line link travelling downstream — a sales-order line to its fulfillment line, a fulfillment line to its invoice line — with the link type and linked amount.
- paymentmethodThe payment-method list: one row per method a document can carry, with its type and the GL account payments land in.
- previoustransactionlinelinkThe backward line-link table: the exact mirror of nexttransactionlinelink, travelling upstream from an invoice line to the sales-order line it originated on.
- salesinvoicedThe invoiced-sales analytics view: the ordered twin plus a posting period, one row per invoiced transaction line with amount, quantity and the estimated cost and gross-profit columns.