ShipStation logo

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.

1connection
0inbound ports
read-onlyenforced

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.

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 guide
Guide

ShipStation 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 guide
Supported

ShipStation 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 yet
Supported

ShipStation 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 yet
Guide

ShipStation to Airtable

Automation platform

Sync ShipStation rows into an Airtable base on a schedule, or fetch them inside an Airtable automation script.

Read the guide
Guide

ShipStation to Baserow

Automation platform

Feed a Baserow table from ShipStation over the REST endpoint — self-hosted or Baserow cloud.

Read the guide
Guide

ShipStation to SeaTable

Automation platform

Keep a SeaTable base current with ShipStation data without exporting a file or exposing the database.

Read the guide
Guide

ShipStation 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 guide
Guide

ShipStation 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 guide
Supported

ShipStation 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 yet
Supported

ShipStation 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 yet

How it works

5 steps, no inbound firewall change

01

Generate an API key in ShipStation. One key, from the v2 API — no key-and-secret pair to manage.

02

Install the Network Agent and paste the key. It stays there; ShipStation only ever hears from your own network.

03

Choose which of the 15 tables to sync and how often. Shipments, labels, fulfillments and inventory are pre-selected.

04

Write ordinary SQL against shipstation.shipments and the rest — or let Nova write it.

05

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

ShipStation Shipping & fulfillment
Microsoft SQL Server Relational engine
Stripe Payments & billing

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