How to Build a Daily Cross-Platform Sales Digest from NetSuite and Stripe

Build a Spojit workflow that wakes up every morning, pulls yesterday's sales orders from NetSuite and charges from Stripe at the same time, has an Agent-mode Connector node write a plain-language digest, and emails it to your team.

What This Integration Does

Finance and operations teams usually start the day by opening two systems: the ERP that holds booked sales orders and the payment processor that holds the money that actually moved. This workflow removes that chore. On a schedule you choose, Spojit fetches the latest NetSuite sales orders and Stripe charges, asks an Agent-mode Connector node to turn both data sets into a short readable summary (totals, counts, anything that looks off), and delivers it to inboxes before anyone logs in. You get one digest instead of two dashboards.

The run model is fully unattended. A Schedule trigger fires on a cron expression in your timezone, a Parallel node fans out into two branches that call NetSuite and Stripe concurrently, a Connector node in Agent mode reads both results and writes the digest, and a Send Email node ships it. Nothing is written back to either system, so the workflow is read-only and safe to re-run: each run reads the current state of both platforms for the chosen window and produces a fresh digest. If a run fails partway, no orders or charges are modified, so you can simply re-run it.

Prerequisites

Step 1: Start with a Schedule trigger

Create a new workflow in the Workflow Designer and set the trigger type to Schedule. A Schedule trigger uses a 5-field Unix cron expression plus an IANA timezone, and a single trigger can hold more than one schedule. For a weekday 7am digest, use:

Cron: 0 7 * * 1-5
Timezone: Australia/Sydney

The trigger output is {{ scheduledAt }}, the timestamp the run started. You will use this later to label the digest with the correct date.

Step 2: Compute the reporting window with the Date connector

Add a Connector node in Direct mode for the Date utility connector and pick the subtract tool to derive "yesterday" from the run time, then the start-of and end-of tools (or one format call) to produce clean day boundaries. The goal is two ISO timestamps you can hand to both platforms. A simple approach is one format call against {{ scheduledAt }} minus one day:

tool: subtract
date: {{ scheduledAt }}
amount: 1
unit: day

Save the result as window so downstream nodes can reference {{ window.start }} and {{ window.end }}. Doing the date math in one deterministic place keeps both branches asking for the exact same day.

Step 3: Fan out to NetSuite and Stripe in parallel

Add a Parallel node after the date step. Parallel runs each branch concurrently, so the two slow API calls overlap instead of stacking up. Create two branches.

Branch A - NetSuite sales orders. Inside branch A add a Connector node in Direct mode for the NetSuite connector and choose the list-sales-orders tool. Filter to the reporting window so you only summarize yesterday's bookings, and save the output as nsOrders. If you need a more specific query than the standard filters allow, use the run-suiteql tool instead with a query like:

SELECT tranid, trandate, entity, total
FROM transaction
WHERE type = 'SalesOrd'
  AND trandate >= {{ window.start }}
  AND trandate <= {{ window.end }}

Branch B - Stripe charges. Inside branch B add a Connector node in Direct mode for the Stripe connector and choose the list-charges tool. Scope it to the same window using Stripe's created filter, and save the output as stripeCharges. Both branches finish before the workflow continues, and their saved variables are available to the next node.

Step 4: Write the digest with a Connector node in Agent mode

After the Parallel node, add a Connector node in Agent mode. Agent mode lets the agent read both data sets and compose the narrative rather than you hand-formatting numbers. In the prompt, hand it both variables and tell it exactly what to produce:

You are preparing a daily sales digest for {{ window.start }}.

NetSuite sales orders: {{ nsOrders }}
Stripe charges: {{ stripeCharges }}

Write a concise plain-text summary that includes:
- Total NetSuite sales order count and combined value
- Total Stripe charge count and combined amount
- Any refunds or failed charges worth flagging
- One short sentence on how the two compare

Keep it under 200 words. Do not invent figures; if a list is empty, say so.

To keep the output predictable you can attach a Response Schema so the node returns structured JSON (for example fields summary, netsuiteTotal, stripeTotal), but for an email body a plain-text response is usually enough. Save the result as digest. Agent mode consumes AI credits, so this single reasoning step is the only paid part of the workflow.

Step 5: Email the digest with the Send Email node

Add a Send Email node. It sends from Spojit's built-in mail service, so no connection is required. Configure the fields:

  • Recipients: comma-separated, for example finance@yourco.com, ops@yourco.com (each must be on the org allowlist).
  • Subject: Daily sales digest - {{ scheduledAt }}
  • Body: {{ digest }} (or {{ digest.summary }} if you used a Response Schema).
  • If sending fails: choose Fail the workflow so a delivery problem shows up clearly in your execution history.

Only upstream variables resolve in this node, which is why every value the email needs (window, totals, digest text) was saved as a variable earlier. See using Send Email nodes for more on templating the body.

Step 6: Enable the workflow and let the schedule run it

Save and enable the workflow. From now on it runs on its own at the cron times you set. Each run appears in your execution history with the schedule, the two parallel branches, the Agent-mode digest, and the email send, so you can open any morning's run and inspect exactly what was fetched and what was sent. See monitoring workflow executions.

Tips

  • Ask Miraxa to scaffold the skeleton for you: "Build a workflow with a Schedule trigger, a Parallel node with a NetSuite list-sales-orders branch and a Stripe list-charges branch, an Agent-mode node that summarizes both, and a Send Email node." Then fine-tune fields in the properties panel.
  • Keep all date math in one Date-connector node and reference {{ window.start }} / {{ window.end }} everywhere, so both platforms always query the identical window.
  • If your order or charge volume is high, request only the fields the digest needs to keep each list call small and fast.
  • Add a second schedule to the same trigger (for example a Monday-only weekly roll-up) instead of cloning the whole workflow.

Common Pitfalls

  • Timezone drift. The cron timezone and the window math must agree. A 7am Sydney run that filters on UTC days will summarize the wrong 24 hours. Set the IANA timezone explicitly and compute boundaries from {{ scheduledAt }}.
  • Pagination. list-sales-orders and list-charges return a page of results. On busy days, page through or tighten the window so the digest reflects the full day, not just the first page.
  • Recipients not on the allowlist. The Send Email node only delivers to allowlisted external addresses. Add recipients under Settings -> General -> Email recipients first, or the send will be blocked.
  • Empty days. Tell the Agent-mode prompt to say so plainly when a list is empty, otherwise it may pad the digest. Never let it invent figures.

Testing

Before relying on the schedule, validate on a small scope. Temporarily switch the trigger to Manual and click Run, or point the Date step at a known busy day and narrow the NetSuite and Stripe filters to a handful of records. Confirm both Parallel branches return data, open the Agent-mode node output to check the digest reads correctly, and send the test email to yourself. Once a manual run looks right end to end, switch the trigger back to Schedule and enable the workflow.

Learn More

Did this answer your question? Thanks for the feedback There was a problem submitting your feedback. Please try again later.