The single most-asked finding in mid-market ecom ops, the dollar value of orders that never made it to GL plus the reason.
At a glance
The dollar value of commerce-platform revenue that has not yet hit the NetSuite General Ledger, broken down by reason. Calculated as commerce_total_revenue minus netsuite_revenue_booked_gl for the same window, with reason codes attached to each missing dollar.
| What it counts | The signed gap between the sum of total_revenue across every connected commerce platform (Shopify, BigCommerce, Adobe Commerce) and revenue_booked_gl in NetSuite for the matching window. The reason breakdown classifies each missing dollar into one of: Pending Billing, Voided / Cancelled, Credit Memo Refund, Unmapped Marketplace, Period Boundary Timing, FX Translation, or Unknown. |
| Tax treatment | Net of tax on both sides. Commerce platform tax is stripped if the platform reports tax separately (Shopify taxesIncluded = false mode, BigCommerce default, Adobe Commerce). Inclusive-tax modes are normalised at compute time. The card is effectively comparing net-of-tax to net-of-tax, otherwise the gap would always show a 20% UK VAT mismatch. |
| Shipping | Both sides include shipping revenue. Mismatch only occurs if shipping is mapped to a non-revenue GL account in NetSuite. |
| Refunds | Counted on both sides. Commerce gross is subtracted by refunds for parity, NetSuite Credit Memos are pulled in. |
| Currency | Commerce-platform revenue is FX-translated to the NetSuite reporting currency at period-average rate. A residual FX-translation gap appears in the breakdown as FX Translation if the currency mix is large. |
| Multi-subsidiary | OneWorld accounts: card sums across all connected subsidiaries that have commerce platforms tagged to them in the field map. Single-subsidiary: trivially scoped. |
| Time window | 30D (no vsP comparison, the gap itself IS the trend) |
| Alert trigger | >$10k unreconciled (default), tunable per workspace |
| Sentiment key | revenue_gap |
| Roles | owner, finance |
Calculation
Calculated automatically from your NetSuite data. See the At a glance summary above for what the metric tracks and the worked example below for a typical reading.Worked example
A US wholesale apparel distributor (Annual revenue ~$80M) running NetSuite OneWorld. Connected commerce platforms: Shopify Plus DTC, BigCommerce B2B with Net-30 terms, Adobe Commerce wholesale portal. The 30-day window covers 14 Mar 26 to 12 Apr 26.| Source | Window total (USD, period-avg FX) |
|---|---|
| Shopify Plus, DTC | $2,140,000 |
| BigCommerce, B2B Net-30 | $3,820,000 |
| Adobe Commerce, wholesale portal | $1,260,000 |
| Commerce gross (sum) | $7,220,000 |
| NetSuite GL booked revenue | $6,510,000 |
| Gap (this card) | $710,000 |
| Reason | Amount | Explanation |
|---|---|---|
| Pending Billing | $410,000 | 47 BigCommerce B2B Sales Orders shipped but not yet invoiced. Net-30 ship-to-bill lag. |
| Credit Memo Refunds | $128,000 | 92 Credit Memos posted in window against orders booked in commerce gross. |
| Voided / Cancelled | $58,000 | 14 cancelled orders that show in commerce platform’s lifetime totals but voided in NetSuite. |
| Unmapped Marketplace | $52,000 | Adobe Commerce wholesale portal has 8 customer accounts not yet mapped to NetSuite Customer records, so the SOs failed to import. |
| Period Boundary Timing | $36,000 | Orders placed 11pm 12 Apr 26 in commerce platform; rolled into NetSuite 13 Apr 26 due to integration scheduler. |
| FX Translation | $14,000 | Adobe Commerce captured GBP transactions at spot rate; NetSuite booked at month-average. |
| Unknown / Investigate | $12,000 | 3 BC orders flagged but no audit trail. |
- The biggest leak is Pending Billing ($410K). This isn’t lost revenue, it’s stuck working capital. Shipping has happened, customer is on the hook, but no Invoice means no AR record, no DSO clock, and no GL booking. The card lets the Controller drill into the SO list and chase Operations to bill.
- Unmapped Marketplace ($52K) is real revenue at risk. If the Customer mapping is wrong on Adobe Commerce, those orders may never sync. The Controller pings the NetSuite Admin to fix the mapping; otherwise next month’s gap is even bigger.
- Credit Memo Refunds ($128K) is policy, not error. This is the structural gap between gross commerce headlines and net GL booking. It will always exist; what matters is whether the rate is constant or rising. Rising = quality / fulfilment / pricing problem. Constant = baseline noise.
- The $12K Unknown bucket is the leakage signal. It’s small enough not to alarm but it’s where reconciliation problems live. The Controller hands this list to the NetSuite Admin every Monday morning.
- Alert fires at >$10K unreconciled in the Unknown bucket. Pending Billing and Credit Memos are explained gaps; only Unknown trips the sentiment.
Sibling cards merchants should reference together
This card is the trigger; the action lives on its companions.| Card | Why pair it with Revenue Gap vs Commerce |
|---|---|
| Revenue Gap, Detailed Breakdown | The drill-down. Each missing dollar with the originating commerce order ID and the NetSuite-side reason. The Controller’s daily worklist. |
| Revenue Booked into GL | The denominator on the NetSuite side. Tells you how big the absolute booked revenue is so the gap percentage makes sense. |
| Open SO Value | Pending Billing’s forward-looking sibling. Shows what’s queued to become GL revenue. |
| Open SOs Blocked | Why Pending Billing is stuck. Inventory holds, credit holds, missing approvals. |
| Commerce Orders Without NetSuite SO | Specifically the Unmapped Marketplace bucket. The list of commerce orders without a paired NetSuite Sales Order. |
| Credit Memos Value | The Credit Memo Refunds bucket as its own time series. Tells you whether Credit Memo volume is rising structurally. |
| shopify.total_revenue | The DTC half of the commerce-side numerator. |
| bigcommerce.total_revenue | The B2B half on BC platforms. |
| adobe_commerce.total_revenue | The B2B half on Adobe Commerce. |
Reconciling against the vendor’s own dashboard
Where to look in NetSuite: There is no single native NetSuite report for this metric, that is precisely why Vortex IQ surfaces it. The closest manual approach inside NetSuite is:Run a saved search on Sales Orders (A NetSuite Admin can build this saved search in 10 minutes. Most don’t, because the cross-platform comparison requires pulling commerce data manually, and the moment you do that you’ve lost reproducibility. Vortex IQ runs this every 15 minutes. Adjacent NetSuite reports that look related but aren’t:Transaction.Type = SalesOrd) with status filterPending Billing OR Pending Approval, sumAmount. Then compare manually to the commerce platform’s last-30-day total revenue export.
- Sales Order Register: shows all open SOs but without commerce-side comparison.
- Customer Aging: AR-based, looks at unpaid Invoices not pre-Invoice gap.
- Revenue Trend by Period: smooths the gap into a monthly trendline; loses the per-order traceability.
| Reason | Direction | Why |
|---|---|---|
| Connector sync lag | Card may overstate gap | NetSuite RESTlet sync runs every 5-15 minutes. A commerce order placed in the last sync window appears in commerce gross but not yet in NetSuite SO list. |
| Customer mapping gaps | Card overstates gap | If a commerce customer doesn’t yet have a NetSuite Customer record, the SO can’t be created. The integration logs this as Unmapped Marketplace and the gap shows the gross order. Until the Admin maps it, the gap persists. |
| FX rate cadence | Small | Commerce platform may capture spot rate; NetSuite may consolidate at period-average. The FX Translation bucket isolates this. |
| Tax reclassification | Either | If the commerce platform sends an inclusive-tax order and the NetSuite tax engine recomputes at a different jurisdiction (e.g. shipping address state), the line totals differ even though gross paid is the same. |
| Period boundary | Card overstates by 1-2 days of orders | Orders placed late on the last day of the window are in commerce gross but not yet in NetSuite GL. They show up on the next period’s reconciliation. |
| Multi-subsidiary scope mismatch | Card understates gap | If only some subsidiaries are connected via the field map, commerce platforms tagged to unconnected subs are excluded. |
Known limitations / merchant FAQs
Should this gap ever be zero? No, and you should be suspicious if it is. A small structural gap (Pending Billing + Credit Memos + period-boundary timing) is healthy. Zero gap means either the connector isn’t pulling new commerce orders, or someone is force-closing the books before reconciliation. Aim for a stable gap that scales with revenue, with the Unknown bucket near zero. How big should the gap be vs total revenue? A typical mid-market commerce business runs at 8 to 15% gross commerce vs net GL revenue gap inside a 30-day window:- Pending Billing: 3 to 8% (higher for B2B Net-30, lower for DTC).
- Credit Memo Refunds: 4 to 10% (varies by category, apparel skews high; electronics low).
- Voided / Cancelled: 1 to 3%.
- Unknown: ideally < 0.5% of commerce gross.
Revenue Recognition Deferred in the breakdown, which is policy-correct, not a defect.
Multi-currency stores: does the FX Translation bucket overstate?
The bucket isolates the residual after period-average FX is applied. If your subsidiaries transact in 5+ currencies, expect the FX bucket to be 0.5 to 2% of commerce gross. Anything larger usually means the field map’s FX rate source is misconfigured.
What does the alert look like in practice?
At >$10K Unknown, the Nerve Centre fires a sentiment alert and Ask Viq surfaces the question “What’s the £14K reconciliation drift this week?” with a deep-link to the breakdown card. The Controller typically resolves it in 15 to 30 minutes by mapping a missing Customer or escalating a stuck SO.
OneWorld vs single-subsidiary, does the card behave differently?
Same logic, simpler scope. Single-subsidiary skips the FX Translation bucket and the elimination logic. Most fields are identical.
Sales Order vs Invoice vs Cash App, where does each fit?
- Commerce order → NetSuite Sales Order: fast (minutes). If this fails, gap appears as Unmapped.
- Sales Order → Invoice: slow (hours to days). If this is stuck, gap appears as Pending Billing.
- Invoice → Cash Application: slow (days to weeks). NOT in this card; this gap is captured by DSO.
- Refund → Credit Memo: variable. Captured as Credit Memo Refunds bucket.