Shopify
Connect your store and three agents light up: Sam looks up orders and tracking, Alex turns your order history into outreach, Blake reports revenue and AOV by currency. Read-only by grant - all 7 scopes are read_*, and Unyo never requested a single write scope.
Cette page n'est pas encore disponible dans votre langue : voici la version anglaise.
"Where's order #1001?" "How much did we make this month?" "What's low on stock?" Ask, and you get the real answer from your real store - line items, tracking numbers, currencies.
And here is the part worth reading twice: Unyo asked Shopify for seven permissions, and every single one of them starts with read_. Not one write scope. Not write_products, not write_orders, not write_customers. Shopify itself enforces this - even if an agent decided tomorrow that your prices needed changing, the grant your store issued does not permit it. The capability doesn't exist to be misused.
Read-only by grant, not by promise
There is a difference between an app that chooses not to write to your store and an app that cannot. Unyo is the second kind. The seven scopes requested at connect time are read_products, read_orders, read_inventory, read_customers, read_price_rules, read_discounts, read_locations - and that is the complete list. No agent can create, edit, fulfil, refund, cancel, or delete anything in your Shopify admin.
What it unlocks, agent by agent
Shopify doesn't light up for everyone. In a normal chat it mounts for exactly three agents - the three whose jobs need it - and it is invisible to the others (the one narrow exception is Maya's opt-in overnight order-status automation; see the FAQ). Ashley cannot see your orders. Lucy cannot see your customers. That's an access control in the runtime, not a line in a prompt.
Sam - customer support
Sam is your support agent, and Shopify turns him into someone who can actually answer the "where is my order" email.
- Look up any order by number. "Where is #1001?" returns line items, total, currency, financial status, fulfilment status, the customer, the shipping address, and the tracking numbers attached to the fulfilment.
- Review recent orders. Up to 50 at a time - order name, total, currency, financial and fulfilment status, customer name and email, and date.
- Check the catalogue mid-conversation. Title, status, price range and total inventory, so a support reply about stock isn't a guess.
Sam, a customer is asking where order #1042 is. Look it up and draft a reply with the tracking number.
Alex - sales
Alex works your store's trading data into outreach.
- Recent orders, single orders, the catalogue and the store summary - the same read-only surface as Sam and Blake, pointed at sales.
- Alex drafts the outreach. He does not send it. The draft lands as an editable card and goes nowhere until you say so - and if you want it to actually leave your mailbox, that's Maya's job, with her own confirmation step.
Alex, pull last week's orders, find the biggest repeat customers, and draft a short thank-you note for each.
Recovery drafts, not recovery sends
Nothing in Unyo sends email unattended - there is no auto-send, anywhere, for anyone. Alex builds the outreach; you read it and click. Cart recovery that fires on its own is a feature we deliberately do not have.
Blake - data analysis
Blake is the only agent who reports on money, and Shopify gives him real figures instead of arithmetic he made up.
- Revenue summary over a window (default 30 days, up to 90): gross sales, net sales, refunded amount, order count and average order value - broken out by currency, not silently mashed into one number. If you sell in EUR and USD, you get EUR and USD.
- Refunds are reported, never issued.
read_orderslets Blake seetotal_refunded. Nothing in the codebase can create one. - Real computation on top. Blake can take those figures into a Python sandbox and produce actual statistics and charts, or hand you a multi-tab
.xlsxyou can open, edit in Google Sheets, or export.
Blake, what did the store do in the last 30 days? Revenue, order count and AOV by currency - and tell me if refunds are trending up.
If you also connect Stripe
Blake is the only agent with Stripe too - revenue summary, balance, charges and payouts. Stripe is read-only as well, though by a different mechanism: the connector exposes only get_/list_ tools and no charge, refund or payout-creation code path exists at all. See the Stripe guide.
Your store flows into the Neural Core
Connecting Shopify doesn't just hand three agents a lookup tool - it populates your Neural Core, the shared business memory every agent reads.
| What syncs | Where it lands | Cap |
|---|---|---|
| Active products (title, price, inventory, description, collection, product URL) | Offers | 100 products |
| Customers - merged from the Customers API and from your orders, so buyers who never created an account are still captured | Contacts | 100 customers |
| Orders, as a CSV entry | Knowledge | 250 orders |
The sync runs the moment your OAuth connection completes, then refreshes every 6 hours on a live cron - verified running in production. Products that disappear from your store are removed from the Neural Core on the next pass, so your Offers don't rot.
Synced products are protected from edits
Anything that came from Shopify is stamped source_platform: 'shopify' and locked. If an agent tries to update or delete a synced product or customer, the tool refuses. Shopify stays the source of truth for Shopify data - your catalogue can't drift because an agent got creative. Entries you create yourself remain fully editable.
Because the Neural Core is shared, this pays off in places you didn't ask for. Ashley, who cannot see your Shopify connection at all, can still write a post about a product - because the product is in Offers, and every agent reads the same memory.
How to connect
The route is /integrations, from the sidebar. It is not inside Settings.
Option A - OAuth (recommended)
- Open Integrations from the sidebar.
- Filter to E-commerce, or search for Shopify.
- Click Connect on the Shopify card.
- Type your shop URL (e.g.
my-store.myshopify.com) and continue. - Shopify shows you the permission screen. Read it - you'll see seven permissions, all of them read.
- Approve. You land back on Integrations, and the Neural Core sync starts immediately.
Option B - API key
If you'd rather not run OAuth, the same card offers a key-based connect: enter your store URL and an API key. Shopify doesn't need a secret on this path, so the field is left empty. Your store is verified against the Shopify Admin API before the connection is saved.
Which should I pick?
OAuth. It's one field and a click, it uses expiring tokens, and it kicks off the Neural Core sync immediately rather than waiting for the next 6-hourly pass. The API-key path exists for merchants whose setup makes OAuth awkward - it works, and the 6-hourly cron syncs it too.
More than one store? Connections are keyed by platform and store URL, so you can connect several Shopify stores - and mix in WooCommerce and PrestaShop alongside them.
Permissions in plain English
| Scope requested | What it lets an agent do |
|---|---|
read_products | See your catalogue - titles, descriptions, status, price range, product URLs. Powers "what am I selling" and the Offers sync. |
read_orders | See orders - line items, totals, currency, financial and fulfilment status, tracking numbers, refunded amounts. Powers Sam's lookups and Blake's revenue reporting. |
read_inventory | See stock levels, so a support answer about availability is real. |
read_customers | See who bought - name and email - for the Contacts sync and for attaching a customer to an order. |
read_price_rules | See your pricing rules, so a discount question gets your actual rules. |
read_discounts | See active discount codes. |
read_locations | See your store's locations, which fulfilment and inventory data are keyed to. |
The scopes we deliberately did not ask for
This is the interesting half of the table.
| Not requested | What it would have allowed | Why it's absent |
|---|---|---|
write_products | Edit or create products, change prices | No agent should be able to reprice your store |
write_orders | Edit, cancel or fulfil orders | Fulfilment is your decision, in your admin |
write_customers | Edit or create customer records | Shopify stays the source of truth |
write_inventory | Adjust stock levels | Same |
write_discounts / write_price_rules | Create or change discount codes | Same |
| Anything Shopify Payments-related | Refunds, captures, payouts | The capability doesn't exist in the codebase |
An app that can only read cannot break your store. That's the whole design.
What Unyo does with your data
- Your access token is encrypted at rest. It goes through a
pgcryptoencrypt/decrypt routine and is never written to or read from a plain column. The encryptor fails closed: if encryption doesn't succeed, it throws rather than ever storing a plaintext token. As of 2026-07-16, every populated OAuth token column across the platform was verified AES-256 encrypted at the cipher-byte level. - The token never leaves the server, and never appears anywhere you could leak it. It is resolved transiently, used as a single
X-Shopify-Access-Tokenheader on the outbound call, and discarded. It is never logged, never placed in a queue payload, never returned inside an error message, and never streamed to your browser. - Your store data is never used to train a model. Every model Unyo runs operates under a no-training guarantee.
- Row-level security on every table. Your connection row and every synced Neural Core entry are protected by row-level security keyed to your user id - 109 of 109 public tables were verified covered, with 291 policies, as of 2026-07-16.
- Deletion is real. Deleting your Unyo account purges around 80 tables atomically, including your Shopify connection and every entry that synced from it.
- Shopify's mandatory GDPR webhooks are implemented. Unyo handles
customers/data_request,customers/redactandshop/redact, and a mis-signed call is rejected with a 401. Onshop/redact, the store's connection row is deleted.
An honest note on customer records
Unyo's customers/redact handler acknowledges the request without deleting anything, because it was written on the assumption that no Shopify customer PII is stored on our side. Since the Neural Core sync landed, customer names and emails do sync into your Contacts. If a shopper asks your store to redact them, delete their Contact entry from your Neural Core as well - ask any agent, or remove it from the Contacts grid. We'd rather tell you this than let you assume it's automatic.
What this costs
Nothing per call. The five Shopify tools carry no per-call credit charge - reading your store is free. You're billed only for the model time an answer actually takes, at real cost. Every account starts with 2 500 free credits, no card.
If Blake takes your Shopify figures into the Python sandbox, that computation is 25 credits - and it's automatically refunded if it fails.
Example prompts
Blake, give me a revenue summary for the last 90 days - gross, net, refunds, order count and AOV, split by currency.
Blake, take my last 30 days of orders and build me a spreadsheet with one tab per currency and a chart of daily revenue.
Disconnecting and revoking
Open Integrations, find your Shopify card, and click Disconnect. The connection row - token included - is deleted immediately, and the three agents lose their Shopify tools on their very next run.
Be honest with yourself about what that does and doesn't do:
- ✅ Unyo can no longer call your store. The token is gone.
- ✅ New syncs stop.
- ⚠️ Entries already synced into your Neural Core stay there. Products in Offers, customers in Contacts, the orders CSV in Knowledge - disconnecting doesn't retroactively wipe them. If you want them gone, delete them from the Neural Core, or delete your Unyo account, which purges everything.
- ⚠️ To fully revoke at the source, uninstall the app from your Shopify admin (Settings → Apps and sales channels). Disconnecting inside Unyo removes our ability to call your store; uninstalling in Shopify is what revokes the grant on Shopify's side. When you uninstall, Shopify fires
shop/redact48 hours later and our handler deletes the connection row - but do the Unyo-side disconnect too if you want it gone now.
Troubleshooting
The agent says Shopify isn't connected, but the card says Connected. Only Sam, Alex and Blake have Shopify tools. Ask one of them. Asking Ashley about your orders will never work - she has no access to them by design.
"SHOPIFY_NOT_CONNECTED" mid-run. The agent pauses with a Waiting for connection notice rather than failing outright. Connect from /integrations and return to the conversation - the run resumes itself and replays the exact action it was on, with a guard that prevents you being charged twice. Note that unlike some connectors, the Shopify card doesn't auto-open its dialog from a chat link - you'll click Connect on the card yourself.
My newest products aren't in the Neural Core. The sync refreshes every 6 hours, and it takes the first 100 active products. If you have more than 100, the rest aren't synced - but Blake and Sam can still query up to 100 products live with shopify.list_products, which doesn't go through the sync at all.
A customer who bought last week isn't in Contacts. The customer sync merges the Customers API with your orders and caps at 100. Guest checkouts are captured via the orders pass. If you're over the cap, older customers fall off.
Blake's revenue number doesn't match my Shopify dashboard. Check the window and the currency. The revenue tool defaults to 30 days and maxes at 90, and it reports by currency rather than converting. Shopify's dashboard may be showing a converted total in your store currency.
The connection worked, then stopped. OAuth connections use expiring tokens. Disconnect and reconnect from /integrations.
I connected by API key and nothing synced. The immediate sync fires on the OAuth path. The API-key path is picked up by the 6-hourly cron - give it a cycle, or reconnect via OAuth for an instant sync.
FAQ
Can an agent change my prices, cancel an order, or issue a refund?
No - and not because we told it not to. Unyo requested seven Shopify scopes and all seven are read-only: read_products, read_orders, read_inventory, read_customers, read_price_rules, read_discounts, read_locations. Shopify enforces that grant. There is no write scope to abuse, and no refund, fulfilment or price-mutation code path anywhere in Unyo. Refunds are something Blake can report, never issue.
Which agents can see my store?
Sam (orders and tracking), Alex (order-driven outreach), and Blake (revenue, AOV, refunds, catalogue). No other agent loads Shopify in a normal chat - the one exception is Maya on a headless automation run. Products and customers do reach every agent, but only through the Neural Core, and only as data.
Will Alex email my customers automatically?
No. Alex reads the store data and drafts the outreach. Sending is a separate, deliberate act with its own confirmation. Unattended send doesn't exist in Unyo - not for Alex, not for Maya, not for a scheduled automation. Automations draft; they never send.
Is my store data used to train an AI model?
No. Every model Unyo runs operates under a no-training guarantee, and your store data is used only to answer the question you asked. Your access token is encrypted at rest and never appears in a log, an error message, or anything sent to your browser.
Can I connect more than one store?
Yes. Shopify connections are keyed by platform and store URL, so multiple Shopify stores can coexist - and you can run WooCommerce and PrestaShop connections alongside them.
How fresh is the data?
Two different answers. Live tools - order lookups, revenue summaries, the catalogue - call Shopify at the moment you ask, so they're current. The Neural Core sync (products into Offers, customers into Contacts, orders as a CSV in Knowledge) refreshes every 6 hours.