Shipping & fulfillment
Connect ShipStation to Excel, Sheets and AI
Shipments, orders and carriers as SQL. Join fulfillment status to the order row that lives in Shopify or your ERP.
One connection, every surface
Where your ShipStation data can go
Connect ShipStation once and the same read-only connection feeds all of these — no second setup, no second copy of the data. 7 of 11 have a step-by-step guide.
ShipStation to Excel
Microsoft Excel · Excel add-in
Pull live ShipStation results straight into a worksheet and refresh them on demand — desktop Excel, Excel Online, Microsoft 365.
Read the guideShipStation to Google Sheets
Sheets add-on
Run a saved ShipStation query from the sidebar and drop the rows into the sheet. Shared collaborators can refresh it themselves.
Read the guideShipStation MCP server
Claude, Cursor and MCP clients
Give an AI assistant read-only access to ShipStation with the schema it needs to write correct SQL — no credentials in the chat.
How MCP works no ShipStation walkthrough written yetShipStation REST API
HTTP endpoint
Publish a ShipStation query as an authenticated JSON endpoint any application can call, with an OpenAPI 3.1 spec and ready-made Postman, Insomnia and Hoppscotch collections. No database port is opened.
How REST API works no ShipStation walkthrough written yetShipStation to Airtable
Automation platform
Sync ShipStation rows into an Airtable base on a schedule, or fetch them inside an Airtable automation script.
Read the guideShipStation to Baserow
Automation platform
Feed a Baserow table from ShipStation over the REST endpoint — self-hosted or Baserow cloud.
Read the guideShipStation to SeaTable
Automation platform
Keep a SeaTable base current with ShipStation data without exporting a file or exposing the database.
Read the guideShipStation to Smartsheet
Automation platform
Push ShipStation results into a Smartsheet grid so plans and reports read from the source system, not last week's export.
Read the guideShipStation to Anvil
Anvil Works · App platform
Back an Anvil Python app with ShipStation through the REST endpoint instead of embedding database credentials in the app.
Read the guideShipStation to Power BI
Power Query M
Paste the generated Power Query M into the Power BI Advanced Editor and the report reads live ShipStation results over HTTPS — no ODBC driver, no database port opened.
How Power BI works no ShipStation walkthrough written yetShipStation alerts and reports
Slack · Discord · Email · Webhook
Put a ShipStation query on a schedule and have the rows delivered to Slack, Discord, email or a signed webhook — or hold the message until a row count, threshold or percentage change crosses the line you set.
How alerts and reports work no ShipStation walkthrough written yetHow it works
5 steps, no inbound firewall change
Generate an API key in ShipStation. One key, from the v2 API — no key-and-secret pair to manage.
Install the Network Agent and paste the key. It stays there; ShipStation only ever hears from your own network.
Choose which of the 15 tables to sync and how often. Shipments, labels, fulfillments and inventory are pre-selected.
Write ordinary SQL against shipstation.shipments and the rest — or let Nova write it.
Read it from Excel, Sheets, Power BI, MCP or REST, joined to the order it belongs to.
Feature deep-dive
What ShipStation gives you
Status you can trust at the moment you ask
Shipment status is the one thing a nightly copy always gets wrong, because it is the thing that changes after the row was written.
- Ask for particular shipments or labels by id and those rows are checked against ShipStation before the answer comes back, so a cancellation or a voided label shows up immediately.
- A report over months of history reads the synced copy at SQL speed and costs nothing at ShipStation's end.
- ShipStation does not delete anything — a cancelled shipment stays as a row with its status changed, which is what you want when the question is how many were cancelled.
The 15 tables
- Movement — shipments, labels, fulfillments, manifests, pickups, batches.
- Setup — carriers, carrier_services, warehouses, users, tags, webhooks.
- Stock — products, inventory, inventory_locations.
- Each row keeps the complete ShipStation response in a raw_data JSON column, so parcel weights, dimensions, customs declarations and full addresses are all still there even though they are not top-level columns.
Careful with a shared budget
ShipStation's rate limit is account-wide, which means a reporting tool that hammers it slows down your actual shipping. This one deliberately does not.
- The agent paces itself to roughly a sixth of the account limit, leaving the rest for the software that is printing labels.
- Live refreshes draw on the same budget and are capped per query for the same reason.
- Shipments carry a genuine modified-since cursor, so an edited shipment is picked up on the next incremental run.
- Labels and fulfillments are tracked by creation date, which is ShipStation's own filter for them — a label voided after it was synced updates on the next full sync or the moment a live query touches it.
Shared by every API connector
How every API connector works
- Your account becomes tables — endpoints are mapped to typed SQL tables with primary keys and indexes, so you write SELECT, JOIN and GROUP BY instead of paging through JSON.
- You choose what syncs, and how often — each table has its own interval, or none at all. Where the vendor's API supports it, only records that changed since the last run are fetched.
- The copy is yours — it lives in an AES-256-GCM encrypted DuckDB file next to the agent, on your machine. Not in our cloud.
- The vendor only ever hears from you — the agent calls the API directly from your own network, so your token is not needed by Query Streams to answer a query.
Good to know
- It is a synced copy, not a live proxy — a query reads what has already been fetched, so it returns at SQL speed and never spends your API rate limit. Selected tables can additionally refresh a stale row as you read it.
- Rate limits are respected for you — each connector paces itself well inside the vendor's published limits, so a report cannot get your account throttled for everything else that uses it.
- Nothing is thrown away — fields the table does not name are kept in a raw_data JSON column you can still query.
- Join it to your databases — an API table and a SQL Server table in the same statement is an ordinary query here, not an integration project.
Cross-source SQL
Join ShipStation to the rest of your data
ShipStation knows the parcel went out. It does not know what the order was worth or whether it was ever paid — those sit in your own system and your payment processor, and one statement can ask all three. Each source runs only the part it can, streams the result back, and the join happens centrally — the sources never talk to each other and nothing is copied anywhere.
3 connections · 3 agents
One statement
-- the shipment from ShipStation, the order from your ERP, the invoice from Stripe
SELECT f.carrier_id, f.shipment_status, COUNT(*) AS shipments, SUM(i.amount_due) / 100 AS invoiced
FROM fulfillment.shipstation.shipments1 f
JOIN erp_sql.dbo.orders2 o ON o.order_number = f.external_order_id
JOIN billing.stripe.invoices3 i ON i.number = o.invoice_no
GROUP BY f.carrier_id, f.shipment_status
ORDER BY shipments DESC;
The three parts are connection, schema and table — and the connection name is whatever you called it. Illustrative columns; your tables will be your tables. external_order_id is the reference your own system put on the shipment, which is what makes the first join possible without a customer id. Weights, dimensions and the full ship-to address are on the same row, in raw_data. Read-only applies to every piece: SELECT, WITH and EXPLAIN only, with a ceiling on how much any one source may hand over for a single query. How federated queries work
Connection details
What ShipStation needs
- Authentication
- A single ShipStation v2 API key, held on the agent. No key-and-secret pair
- Reached over
- HTTPS from your network to ShipStation. Nothing inbound, and no webhook endpoint to host
- Schema
- shipstation — so shipstation.shipments, shipstation.labels
- Tables
- 15. Shipments, labels, fulfillments, carriers, carrier_services, warehouses, products, batches, inventory, inventory_locations, manifests, pickups, tags, users, webhooks
- Full detail
- Every row keeps the complete API response in a raw_data JSON column — weights, dimensions, customs, addresses
- Incremental
- Shipments on modified-since; labels and fulfillments on created-since, which is what the API offers for them
- Live refresh
- Shipments and labels, by id, with a 60-second freshness window
- Rate limits
- Self-paced to roughly a sixth of ShipStation's account-wide limit, so reporting does not slow down shipping
- Local copy
- An AES-256-GCM encrypted DuckDB file beside the agent, on your machine
Read-only is structural. Every request this connector makes is a GET — there is no create-label, no void and no ship-order call in it — so a query cannot spend postage or cancel a shipment.
A test key is recognised as a test key. ShipStation prefixes them, and the connection is labelled accordingly rather than leaving you to wonder why the numbers look wrong.
Vendor documentation: www.shipstation.com
FAQ
Questions about ShipStation
Which tools can read ShipStation data through Query Streams?
All of them, from one connection: Excel, Google Sheets, MCP, REST API, Airtable, Baserow, SeaTable, Smartsheet, Anvil, Power BI, scheduled alerts and reports. Connect the account once and every surface reads the same read-only connection — there is no per-tool setup and no second copy of the data.
Do I have to open a firewall port to my ShipStation account?
No. The Query Streams Network Agent runs inside your network and opens a single outbound encrypted connection. Nothing listens for inbound traffic, no VPN is required, and the account keeps its existing firewall rules.
Can Query Streams change data in ShipStation?
No. The agent enforces read-only at the point of execution — one statement at a time, SELECT and friends only. Credentials stay on the agent and are never sent to Query Streams.
What does Query Streams need to connect to ShipStation?
A reachable host, a role and its password — the agent carries the driver, so nothing is installed on the account. Authentication: A single ShipStation v2 API key, held on the agent. No key-and-secret pair. Reached over: HTTPS from your network to ShipStation. Nothing inbound, and no webhook endpoint to host. Schema: shipstation — so shipstation.shipments, shipstation.labels. Tables: 15. Shipments, labels, fulfillments, carriers, carrier_services, warehouses, products, batches, inventory, inventory_locations, manifests, pickups, tags, users, webhooks.
Can I join ShipStation to another database in the same query?
Yes — that is a federated query. One statement can reference ShipStation and your other connections at once, written as connection.schema.table. Each source runs only the part it can and streams the result back; the join happens centrally, so the sources never connect to each other and nothing is copied or scheduled. Read-only applies to every piece — SELECT, WITH and EXPLAIN only — and there is a ceiling on how much any one source may hand over for a single query. Federated queries are a plan feature; the federated queries page carries the current source and size limits.
Put ShipStation where the work happens
Install the agent, point it at your account, and pick a destination.
Read-only Outbound only Credentials stay on the agent

