Skip to main content

Shopify

Read and work a Shopify store - products, variants, inventory, orders and customers - over the GraphQL Admin API, and prepare draft orders for a customer to pay.

Connect a Shopify store with a custom app's Admin API access token to answer questions about the catalogue and act on it: search products, variants and SKUs, read orders with their line items and refund-adjusted totals, look up customers and their lifetime spend, check stock per location, count products/orders/customers properly rather than by measuring a page, create and update products, reprice variants, set inventory with compare-and-set safety, and prepare draft orders whose invoice link a customer completes.

Connect

Credential fieldRequiredWhere it comes from
Admin API access token (ADMIN_API_ACCESS_TOKEN)YesThe custom app's Admin API access token (shpat_…), shown once at install. Its granted scopes are the permission ceiling for every tool here.
SettingRequiredWhat it is
Shop domain (SHOP_DOMAIN)YesThe store's permanent myshopify.com domain, e.g. acme.myshopify.com (Settings → Domains). Not the customer-facing storefront domain, which does not serve the Admin API.
API version (API_VERSION)NoOptional. A quarterly Shopify Admin API version such as 2026-01. Leave empty to use 2026-01; set it when that version retires or a newer one is needed.

Tools

ToolAccessWhat it does
Get shop (yekar.shopify.get-shop)ReadThe connected Shopify store: name, permanent myshopify.com domain, storefront URL, plan, timezone and - importantly - the store's own currency, which is what every shop-currency amount in these tools is denominated in. Run this first to confirm a connection works.
Count records (yekar.shopify.count-records)ReadCount products, orders or customers - optionally narrowed by the same search-query filter the list tools take. Use this rather than counting the items a list tool returned: a list page is a window, not a total. Above roughly 10,000 matches Shopify answers with precision: AT_LEAST, meaning the count is a floor rather than the exact number.
List products (yekar.shopify.list-products)ReadA page of products, with each product's status, vendor, tags, total inventory and price range. status matters: a DRAFT or ARCHIVED product is not on sale, so a catalogue answer should say which. Prices are decimal strings paired with a currency code. To count products rather than list them, use Count records.
Get product (yekar.shopify.get-product)ReadOne product with its description and up to 25 variants - each variant's SKU, price, inventory quantity and inventory item id (which is what Set inventory quantity takes, not the variant id). variantsTotal and moreVariants say when a product has more variants than are shown.
List variants (yekar.shopify.list-variants)ReadA page of product variants across the store, searchable by SKU, product or inventory level (sku:ACME-1, inventory_quantity:<5). Each row carries the variant's price, SKU, inventory quantity and inventory item id. An inventoryQuantity of null means the variant is NOT tracked, which is different from zero in stock.
List orders (yekar.shopify.list-orders)ReadA page of orders with financial and fulfillment status, totals and customer. Three things to be careful with: Shopify returns OPEN orders by default (add status:any to the query to include archived ones); orders placed on a test gateway have test: true and never moved money, so exclude them from revenue; and currentTotal (after refunds and edits) is what the merchant holds, while originalTotal is what the order was worth when placed.
Get order (yekar.shopify.get-order)ReadOne order with its line items (up to 25; moreLineItems says when there are more), statuses, note and totals. currentTotal reflects refunds and edits; originalTotal is the order as placed; totalRefunded is what went back.
List customers (yekar.shopify.list-customers)ReadA page of customers with their order count, lifetime spend, tags and default city/country. Search by email, tag, order count or location. amountSpent is a decimal string with its currency code - Shopify's own lifetime figure, not something computed from a page of orders.
Get customer (yekar.shopify.get-customer)ReadOne customer by id: contact details, tags, note, lifetime order count and spend. To find a customer by email or name instead, use List customers with a search query.
List locations (yekar.shopify.list-locations)ReadThe store's inventory locations - warehouses, retail stores and pickup points - with their ids, which List inventory levels and Set inventory quantity both need. Up to 50 are returned and moreAvailable says if the store has more.
List inventory levels (yekar.shopify.list-inventory-levels)ReadStock at one location, item by item: available (sellable), onHand (physically present, including units committed to open orders) and committed. These are different numbers - quoting onHand as availability oversells. Each row carries the inventory item id that Set inventory quantity takes.
Create product (yekar.shopify.create-product)WriteCreate a product. It is created as a DRAFT unless you pass status ACTIVE - a draft is not on the storefront. Shopify creates one default variant priced at 0; set the real price with Update variant price, and stock with Set inventory quantity. Running this twice creates TWO products: Shopify does not deduplicate by title.
Update product (yekar.shopify.update-product)WriteUpdate a product's title, description, vendor, type, tags or status. Only the fields you pass change. CAREFUL with tags: the list you send REPLACES the product's tags entirely rather than adding to them. Setting status ACTIVE publishes the product to the storefront.
Update variant price (yekar.shopify.update-variant-price)WriteSet the price (and optional compare-at price) of one or more variants of a product. Prices are decimal STRINGS in the store's own currency - "19.99" - and are absolute, not deltas. Shopify requires the product id alongside the variant ids.
Set inventory quantity (yekar.shopify.set-inventory-quantity)WriteSet stock for one or more inventory items at a location to an ABSOLUTE quantity (not a delta). Pass compareQuantity - the value you just read - to have Shopify refuse the write if the stock changed underneath you, which is how a concurrent sale avoids being overwritten. Takes INVENTORY ITEM ids, not variant ids: Get product and List inventory levels both return them.
Create customer (yekar.shopify.create-customer)WriteCreate a customer record. Shopify requires at least one of email, phone or a name, and enforces that email and phone are UNIQUE within the store - creating a customer whose email already exists fails rather than making a duplicate. Search first with List customers if you are not sure.
Create draft order (yekar.shopify.create-draft-order)WriteCreate a draft order from existing product variants and return its invoice URL - a link the customer can pay. This takes NO payment and sends NO email: it prepares an order for a human to review, send or complete in the Shopify admin. Stock is not reserved by a draft.

Notes

  • In Shopify admin go to Settings → Apps and sales channels → Develop apps → Create an app, then Configure Admin API scopes and grant: read_products, write_products, read_orders, read_customers, write_customers, read_inventory, write_inventory, read_locations, write_draft_orders.
  • Install the app and copy its Admin API access token (shpat_…). Shopify shows it once. Scopes are granted at INSTALL time, so adding one later means editing the configuration and re-installing the app - the token itself does not change.
  • Set the Shop domain to the store's permanent myshopify.com address (Settings → Domains), e.g. acme.myshopify.com. A custom storefront domain does not serve the Admin API and will not work; neither does admin.shopify.com.
  • Leave API version empty unless you have a reason: it defaults to 2026-01. Shopify supports each quarterly version (YYYY-01/04/07/10) for twelve months, so this is the dial to turn when a version retires or a newer field is needed.
  • Prices and totals are decimal strings in the store's own currency (Get shop reports which) - they are never cents and never floats.
  • Orders placed on a test payment gateway are returned like any other with test: true; exclude them before reporting revenue. Shopify's order list also returns OPEN orders by default - add status:any to the query to include archived ones.
  • Inventory is set to an ABSOLUTE quantity per location, never adjusted by a delta, and takes INVENTORY ITEM ids rather than variant ids. Pass compareQuantity so a sale that lands between your read and your write fails the call instead of being overwritten.
  • Every action is attributed to the custom app, not to the person who triggered the automation, and the store's timeline shows it that way. Bind automations using this integration as a service connection.