Shopify to Postgres integration for a queryable store replica
The Shopify to Postgres integration from Adapters syncs orders, line items, customers, products, and refunds from the Shopify Admin API into your own Postgres tables on an incremental schedule, so internal dashboards and app features join store data to your own tables instead of paging the Shopify API live. Field mapping is no-code, so try it against sample records in the live demo.
No credit card required.
Field mapping auto-plugged · tap a port to rewire
Plug a source port into
Transform on this cable
JSON in
JSON out
5 sample records ready
Last updated September 2026
What running Shopify to Postgres by hand costs you
- Querying the Shopify Admin API live burns the leaky-bucket rate limit and makes any internal dashboard slow, so you want a local Postgres copy to join against.
- Orders change after they are placed (edits, partial refunds, cancellations), so a one-time import into Postgres is wrong within a day.
- Blending Shopify revenue with your own product, inventory, or subscription tables needs both sitting in the same database, not one in an admin panel and one in Postgres.
The field mapping, out of the box
These cables are pre-wired when you pick the pair. Rewire any of them, or add your own, in the same visual data mapping tool you use for every adapter.
Input / SHOPIFY
Output / POSTGRES
Transforms included
Incremental loads use the Shopify updated_at watermark so edits, partial refunds, and cancellations flow through on the next run rather than leaving a stale order behind; money fields arrive as decimal strings and cast to Postgres NUMERIC so cents never round through a float, timestamps become TIMESTAMPTZ in UTC, line items land in their own child table keyed to the order, and writes upsert with ON CONFLICT on the Shopify id so a retry never double-inserts.
Shopify to Postgres in depth
Store data in a relational database you control, usually so orders can be joined to something Shopify has never heard of. The Shopify side is metered in a way that surprises people, and the money type is the opposite shape to every payment processor. Read from Shopify and PostgreSQL documentation on 23 August 2026.
Shopify money is a decimal, not minor units
This is the trap for anyone who has integrated a payment processor first. MoneyV2.amount is a Decimal! such as 12.99, with a separate currencyCode field. It is not in cents. Applying the divide-by-100 you wrote for Stripe turns a $12.99 order into thirteen cents. Land it in NUMERIC(19,4) and never in the PostgreSQL MONEY type, whose behavior depends on the server lc_monetary setting.
GraphQL costs points per second, not requests per second
Shopify does not count your calls, it prices them. The GraphQL Admin API meters calculated query cost in points per second: 100 on Standard, 200 on Advanced, 1,000 on Shopify Plus and 2,000 on Enterprise. The same extraction job behaves like a different product on two plans, which is why a connector that worked at a client on Plus can crawl at one on Standard.
A query over 1,000 points is rejected, not throttled
There is a hard per-query ceiling of 1,000 points, and exceeding it rejects the query outright rather than delaying it. Backoff never fixes this, because retrying an oversized query just fails again. Flatten the selection set or split it into several queries. Every response also returns requestedQueryCost, actualQueryCost and throttleStatus, so pace against those and you never see THROTTLED at all.
Use bulk operations for the initial backfill
Bulk operations run asynchronously, return JSONL, and are not subject to the normal cost and rate limits, which makes them the correct tool for loading history. From API version 2026-01 you get 5 concurrent bulk query operations per app per shop, a maximum of 5 connections and 2 nesting levels per query, and the signed result URL expires after one week. Download promptly.
Counts are only accurate up to 25,000 objects
The pagination ceiling is 25,000 objects and counts are only accurate below it. So verifying a load by comparing a Shopify count to your Postgres row count can compare two numbers that were both capped in the same place and agree while both being wrong. Verify by reconciling a known order end to end instead, or by comparing sums rather than counts.
Timestamps need TIMESTAMPTZ or the watermark drifts
Shopify timestamps carry an offset. Land them in TIMESTAMPTZ, not TIMESTAMP. An incremental sync keyed on a plain timestamp drifts by an hour twice a year at daylight saving boundaries, and the orders in that gap are never picked up. Nothing errors, the table is just quietly short.
Pin the API version, because unknown versions fall forward
Shopify ships a new version every three months at 5pm UTC on 1 January, 1 April, 1 July and 1 October, and supports each stable version for at least twelve months with at least nine months of overlap. A request to a version that is no longer accessible falls forward to the oldest accessible stable version rather than failing, so an unpinned integration can silently start speaking a different API. Pin it and diary the upgrade. Full limit set: Shopify API rate limits.
REST is legacy, build new work on GraphQL
The REST Admin API has been legacy since 1 October 2024, and since 1 April 2025 all new public apps must be built exclusively on the GraphQL Admin API. Its leaky bucket of 40 requests refilling at 2 per second is still documented, but it is not where new integrations should start. The wider destination comparison is on Shopify integration tools and Postgres ETL tools.
How it goes live
Three steps, minutes end to end, covered by flat data integration pricing from $49 a month.
STEP 01
Pick the pair
Connect Shopify and Postgres with scoped credentials. About a minute each.
STEP 02
Confirm the mapping
The cables above are pre-wired. Adjust any field, preview the transform on sample records, done.
STEP 03
Schedule the sync
Hourly down to every minute, with retries, alerting, and a full log on every run.
Prefer to understand the moving parts first? Our long-form guide to the Shopify to Postgres guide covers the field-by-field detail, the failure cases, and what changes at volume.
Shopify to Postgres sync: common questions
How do I sync Shopify to Postgres?
Authorize the store, select orders, line items, products, variants, customers and inventory, map them onto Postgres tables, and pick a schedule. The sync respects the Shopify rate limit, walks the pages, and upserts on the Shopify id with ON CONFLICT so re-running after a failure repairs the table instead of duplicating orders.
Why is the first Shopify sync so slow?
Rate limits. The Shopify REST Admin API uses a leaky bucket with a capacity of 40 requests that drains at 2 requests per second on standard plans, 4 per second on Advanced and 20 per second on Shopify Plus. A store with years of order history is therefore hours of paged requests on a first full backfill, and minutes per run after that.
How should Shopify orders be modeled in Postgres?
Split the order header from the line items into two tables joined on the order id, and keep refunds and transactions separate again. A single flattened table forces you to choose between duplicating the order total on every line or losing line detail. Store the raw JSON payload in a JSONB column alongside the typed columns for anything you have not modeled yet.
Do Shopify orders change after they are created?
Constantly. Orders get edited, fulfilled, partially refunded, cancelled and tagged long after creation, and the financial status moves with them. Sync on the updated_at watermark and upsert, so those edits land. An append-only load keyed on created_at produces a table that was accurate the night each order was placed and wrong ever since.
How does the Shopify to Postgres sync work?
The Shopify to Postgres integration from Adapters syncs orders, line items, customers, products, and refunds from the Shopify Admin API into your own Postgres tables on an incremental schedule, so internal dashboards and app features join store data to your own tables instead of paging the Shopify API live. Field mapping is no-code, so try it against sample records in the live demo.
Is there a prebuilt Shopify connector for Postgres?
Yes. This Shopify to Postgres connector ships prebuilt: the field mapping is wired the moment you pick the pair, transforms are included, and you can try it against sample records in the live demo. No code or engineering sprint required.
How much does the Shopify Postgres integration cost?
Pricing is flat and monthly: Starter at $49, Growth at $149, Scale at $399. Every plan includes this pair, visual field mapping, and per-record logs. There are no per-task or per-row fees, so the bill stays the same as volume grows.
How often can Adapters sync Shopify to Postgres?
Hourly on Starter, every 5 minutes on Growth, and down to every minute on Scale. Failed records retry automatically with backoff, and alerting plus a full per-record log come standard on every run.
Do I need to write code to connect Shopify and Postgres?
No. Fields are auto-mapped the moment you pick the pair, and you can rewire any mapping visually before the first sync. Incremental loads use the Shopify updated_at watermark so edits, partial refunds, and cancellations flow through on the next run rather than leaving a stale order behind; money fields arrive as decimal strings and cast to Postgres NUMERIC so cents never round through a float, timestamps become TIMESTAMPTZ in UTC, line items land in their own child table keyed to the order, and writes upsert with ON CONFLICT on the Shopify id so a retry never double-inserts.
More pairs from the API connector library
Browse the full api connector library, or request a pair you do not see.
Shopify and Postgres, finally in agreement
Map the pair once and let it sync on schedule. Flat price from $49 a month, no per-task fees.
No credit card required.