SHOPIFY · COMMERCE & FINANCE
Orders, products, and fulfilment on the store they connected.
Each user connects their own account. Every call carries both identities — the agent and the person it is acting for — so the agent can never reach past what that individual can already do.
Tokens live in the vault and attach server-side at call time. The agent holds a session, not a secret, and revoking access does not mean rotating a key.
Who asked, which agent acted, which action ran, and the verdict that let it through — one audit trail across every integration, not one per vendor.
Each action is granted on its own. An agent allowed to read is not thereby allowed to write, and the scope beside each row is what the acting user must have connected for it to run at all.
shopify_activate_discount_codeWRITEDESTRUCTIVE — switch a deactivated discount code back on. The exact inverse of deactivating, and destructive in the same sense the code's creation was: it starts giving margin away again. It cannot resurrect a code past its end date.
shopify_activate_inventoryWRITEStart stocking an item at a location, optionally with an opening quantity. A Shopify stock level only exists where the item has been activated; until then adjusting or setting stock there fails with a refusal that reads like a bad id. Exactly reversible by Stop stocking an item at a location.
shopify_activate_locationWRITEReactivate a deactivated location. Its id comes from shopify_find_locations with include_inactive set. The stock moved away at deactivation does not return.
shopify_add_customer_tax_exemptionsWRITEAdd TaxExemption members to a Shopify customer, keeping any they already have. From the next order the exempted tax is not collected. Reversible with shopify_remove_customer_tax_exemptions.
shopify_add_discount_redeem_codesWRITEDESTRUCTIVE - Add extra redeem codes to an existing discount. IT MINTS CODES. One discount can carry many code strings - one per influencer, one per mailing, one per support ticket - all sharing the discount's own usage limit and end date. That shared bound is what makes this safe to expose: the codes multiply, the liability does not. THE CODES ARE EXPLICIT AND THE LIST IS CAPPED. Shopify accepts 250 in one call; this takes at most MAX_IDS_PER_CALL and takes them as strings the caller wrote, so the audit row records exactly which codes now exist. There is no "generate N random codes" argument, because that is a call whose output nobody can enumerate afterwards. ASYNCHRONOUS. The mutation returns a bulk-creation id, not the codes. Poll it with shopify_get_discount_code_batch, which reports the per-code errors - a duplicate code fails on its own without failing the batch, and nothing else would show you that.
shopify_add_discount_tagsWRITETag several discounts at once. Discount tags are not decoration in 2026-07: Shopify uses them to decide *"which other product discounts can apply to the same cart line"* when a discount configures productDiscountsWithTagsOnSameCartLine. Tagging can therefore change what stacks with what. It is still not destructive - nothing is given away by the tag itself, and shopify_remove_discount_tags is the exact inverse. NO SAVED SEARCH AND NO SEARCH STRING - explicit ids only, capped at MAX_IDS_PER_CALL. Asynchronous: it returns a job. Poll it with shopify_get_job.
shopify_add_draft_order_tagsWRITETag several draft orders at once. Tags are how a merchant's own workflow finds a quote again - "awaiting-po", "trade-show", "chase-friday". Not destructive: nothing is priced, charged or sent, and shopify_remove_draft_order_tags is the exact inverse. NO SAVED SEARCH AND NO SEARCH STRING. Shopify offers savedSearchId and search as alternatives to ids; neither is exposed. The effect ships via list-then-name - read the drafts with shopify_list_draft_orders, then name them. What is refused is a selector whose blast radius the caller cannot state and the audit row cannot record. Asynchronous: it returns a job. Poll it with shopify_get_job.
shopify_add_inventory_shipment_itemsWRITEAdd up to 100 line items to an inventory shipment. Pass the same idempotency key when retrying, or a retry adds the quantity twice.
shopify_add_locationWRITECreate a new location with a name and an address. The country code is required. fulfills_online_orders defaults to false so the new location's stock is not immediately sellable online.
shopify_add_order_edit_line_discountWRITEDiscount one line of an open edit session. PERCENTAGE ONLY. PERCENTAGE ONLY, AND THAT IS THE BOUND. OrderEditAppliedDiscountInput also takes fixedValue, a cash amount the agent names against a line whose value it may not have read - unbounded in the same way a fixed cash discount code is unbounded against a small basket. A percentage cannot exceed the value of the line it is applied to, which is a structural bound rather than a policy, and it is the same one shopify_create_discount_code relies on. description is required and is not decoration: it appears on the customer's amended order as the reason they were given money off, and an unexplained discount on a real person's order is what a merchant finds three months later and cannot account for.
shopify_add_order_edit_variantWRITEAdd a catalogue item to an open edit session. STILL NOT COMMITTED. BOUNDED BY THE MERCHANT'S OWN CATALOGUE, which is what makes it shippable where orderEditAddCustomItem is not: the price is the one the merchant set on the variant, not a figure the agent produced. shopify_create_draft_order is bounded the same way and for the same reason. Nothing has moved. The returned totals are what the customer WOULD be charged; the order is unchanged until shopify_commit_order_edit, which is the destructive step. An edit session that is never committed changes nothing. allow_duplicates defaults to false, matching Shopify: adding a variant already on the order is normally a mistake, and the right fix is shopify_set_order_edit_quantity.
shopify_add_products_to_collectionWRITEPut products into a manual collection. Exactly reversible by Remove products from a collection. Shopify applies it asynchronously and returns a job, so a successful result means Shopify accepted the change rather than that it has finished — Check a job answers that.
shopify_add_tagsWRITEAdd tags to an order, product, customer, draft order or collection — the cheapest reversible write in the API, and the standard way an agent records state that has nowhere else to live ('triaged', 'awaiting-stock'). Exactly reversible by Remove tags. Note the four scopes: Shopify's tag mutations publish no permission of their own and inherit the owner resource's, so this grant reaches every one of those resource types. Product tags are visible on the storefront and used for filtering; order and customer tags are internal.
shopify_adjust_inventoryWRITEDESTRUCTIVE — change how many units of one item the Shopify store will SELL at one location. Dropping the figure to zero takes the item off sale immediately; raising it above what physically exists lets the store take orders that cannot be filled. The change is RELATIVE, not absolute: `delta` of -3 removes three units from whatever the current figure is, so two agents adjusting the same item both apply their change. Only the sellable `available` quantity is touched, never the physical stock count.
shopify_approve_commentWRITEDESTRUCTIVE - approve a Shopify blog comment, publishing a member of the public's words on the merchant's storefront under the merchant's brand. shopify_mark_comment_spam takes it down again but does not retract what was already read or crawled.
shopify_approve_returnWRITEApprove a return the customer requested, moving it from REQUESTED to OPEN. No money moves — this is a decision about the goods, not about the refund. Its inverse, Decline a return, ships alongside it.
shopify_assign_shipping_originWRITESet the location the store's shipping rates are quoted from.
shopify_attach_media_to_variantWRITEAttach existing Shopify product media to a variant, so that selecting the variant shows that image. Takes the parent product id, the variant id and up to 100 media ids already on the product. Use shopify_detach_media_from_variant to undo.
shopify_begin_order_editWRITEOpen an order-edit session and return the current totals and the editable lines. NOTHING IS CHANGED OR CHARGED YET, and a session that is never committed changes nothing at all — which is why this is not destructive. The line ids it returns are a different namespace from the order's own line items; passing the wrong one is the mistake this action exists to make visible.
shopify_bulk_activate_discount_codesWRITEDESTRUCTIVE. Switch several discount codes back on at once. Destructive in the same sense one activation is: every code switched on starts giving margin away again. The bulk form multiplies that by the length of the list, which is why the list is explicit and capped. NO SAVED SEARCH AND NO SEARCH STRING. Shopify offers savedSearchId and search as alternatives to ids; neither is exposed. The effect ships via list-then-name - read the discounts with shopify_list_discounts, then name the ones to switch on. What is refused is a selector whose blast radius the caller cannot state and the audit row cannot record. Asynchronous: it returns a job. Poll it with shopify_get_job. Reversible by shopify_bulk_deactivate_discount_codes.
shopify_bulk_deactivate_discount_codesWRITESwitch several discount codes off at once. THE EMERGENCY STOP. The bulk form of shopify_deactivate_discount_code, and the reason it is not marked destructive is the same: it makes the store give away less, it keeps the usage history that explains what happened, and shopify_bulk_activate_discount_codes puts it back. When a code generator has misfired and fifty codes are loose, this is the one call that stops all of them. NO SAVED SEARCH AND NO SEARCH STRING - explicit ids only, capped at MAX_IDS_PER_CALL. The effect ships via list-then-name; what is refused is a selector whose blast radius the caller cannot state and the audit row cannot record. Asynchronous: it returns a job. Poll it with shopify_get_job.
shopify_bulk_delete_automatic_discountsWRITEDESTRUCTIVE. Delete several automatic discounts at once. Irreversible and unrecreatable by this connector, for the reason shopify_delete_automatic_discount gives. shopify_deactivate_automatic_discount is the reversible alternative and is the one to reach for first. NO SAVED SEARCH AND NO SEARCH STRING - explicit ids only, capped at MAX_IDS_PER_CALL. The effect ships via list-then-name; what is refused is a selector whose blast radius the caller cannot state and the audit row cannot record. Asynchronous: it returns a job. Poll it with shopify_get_job.
shopify_bulk_delete_discount_codesWRITEDESTRUCTIVE. Delete several discount codes and their history. Irreversible, and it takes the usage history with it. shopify_bulk_deactivate_discount_codes stops the same codes working just as completely, keeps the record of what they did, and can be undone - prefer it unless the codes genuinely must cease to exist. Orders already placed with these codes keep their discount. Deleting reprices nothing. NO SAVED SEARCH AND NO SEARCH STRING - explicit ids only, capped at MAX_IDS_PER_CALL. This is the operation where that matters most: a search string on a delete is an unbounded, unrecordable deletion. Asynchronous: it returns a job. Poll it with shopify_get_job.
shopify_bulk_delete_draft_ordersWRITEDESTRUCTIVE. Delete several draft orders at once. Irreversible. The blast radius is small by construction, the same way single deletion is: a draft is unpaid, so deleting one destroys a quote and touches no money, no stock and no customer. Shopify refuses a draft that has been completed, because at that point it is an order. There is no undelete. NO SAVED SEARCH AND NO SEARCH STRING - explicit ids only, capped at MAX_IDS_PER_CALL. On a delete this is the whole point: a search string is an unbounded deletion the audit row cannot describe. Asynchronous: it returns a job. Poll it with shopify_get_job.
shopify_bulk_delete_metaobjectsWRITEDESTRUCTIVE -- delete up to 100 metaobjects by id. Returns an asynchronous job; poll it with shopify_get_job. The open-ended 'delete every record of this type' form is not available.
shopify_bulk_delete_url_redirectsWRITERemove up to 100 Shopify URL redirects by explicit id. There is no search selector on purpose - list them with shopify_list_url_redirects and name the ones you mean. Asynchronous: check the returned job with shopify_get_job.
shopify_calculate_draft_orderWRITEPrice a basket WITHOUT creating anything — subtotal, tax, shipping and total, optionally for a specific customer whose address decides the tax. Nothing is written and no draft order exists afterwards. Shopify classifies it as a mutation, which is a schema artefact rather than a statement about its effect. It is the read that makes creating a draft order unnecessary for most questions.
shopify_calculate_refundWRITEPrice a refund before making one. Moves no money and writes nothing.
shopify_calculate_returnWRITECalculate the financial outcome of a Shopify return without creating it: per-line subtotals, taxes, restocking fees and the return shipping fee. Run this before shopify_refund_return so the refund amount is computed rather than guessed.
shopify_cancel_fulfillmentWRITEReverse a fulfilment so the items can be shipped again. THE UNDO FOR THIS CONNECTOR'S RISKIEST WRITE: Mark goods as shipped emails a shopper and, until this shipped, could not be reversed at all. It is not destructive because it IS the reversal — but note what it cannot reverse: a shipping-confirmation email that has already been sent has left, and cancelling the fulfilment sends no retraction. Shopify does not state this mutation's access scope; the fulfilment-order write scope is the strong inference from every neighbouring mutation and one live call settles it.
shopify_cancel_fulfillment_orderWRITEDESTRUCTIVE. Cancel the instruction to ship. A replacement is returned.
shopify_cancel_inventory_transferWRITEDESTRUCTIVE -- cancel an inventory transfer. Reserved quantity returns to available stock at the origin and the transfer stops being usable. There is no un-cancel; duplicate the transfer to make a new draft from it.
shopify_cancel_orderWRITEDESTRUCTIVE — cancel a Shopify order. There is no undo; Shopify has no 'uncancel'. It does NOT refund the shopper: refunding is shopify_refund_order, deliberately separate so an agent can be allowed to stop shipments without being allowed to move money. `restock` decides whether the goods go back on sale and has no default. `notify_customer` emails the shopper a cancellation notice that cannot be recalled. Shopify cancels ASYNCHRONOUSLY and returns a job, so success here means Shopify accepted the cancellation — confirm with shopify_get_order that `cancelledAt` is set before reporting it done.
shopify_cancel_returnWRITECancel a return. The inverse of opening one. Shopify refuses once the return has been refunded or the goods received, which stops this being used to erase a completed transaction.
shopify_capture_order_paymentWRITEDESTRUCTIVE. Take the money on an authorised order. No inverse.
shopify_close_orderWRITEArchive a completed order — REVERSIBLE, unlike cancelling. It changes nothing about the money, the goods or the shopper, and Re-open an order puts it back exactly. This exists because the only order-state write Agentic Fabriq previously offered was Cancel an order, which cannot be undone: an agent asked to clear out last month's completed orders would otherwise reach for the irreversible tool. Shopify also requires the staff user to hold the manage-orders-information permission.
shopify_close_returnWRITEClose a finished return. Housekeeping: it takes a completed return off the open list and moves no money. Reversible by Re-open a return.
shopify_commit_order_editWRITEDESTRUCTIVE — apply an order edit. It changes an order a real person placed: the amount owed moves, stock moves, and with notification enabled Shopify emails them about it. THERE IS NO UNCOMMIT — a committed edit is corrected by another edit, not undone — and an edit that raises the total can leave the order with a balance the merchant then has to collect. Check the financial status it returns.
shopify_complete_draft_orderWRITEDESTRUCTIVE — turn a quote into a real order. It creates an order in the merchant's books, commits the stock and starts every downstream automation wired to new orders. THERE IS NO UNCOMPLETE. Agentic Fabriq defaults to marking the new order as awaiting payment, which is the opposite of Shopify's own default: saying the money already arrived is an assertion nobody checked, so a caller that means it has to say so. This connector will never charge a stored payment method.
shopify_count_abandoned_checkoutsREADCount abandoned checkouts, returning no personal data at all.
shopify_count_blogsREADCount the Shopify store's blogs with one number. Returns a precision alongside the count.
shopify_count_catalogsREADCount catalogs without paging through them. precision is the field to read, not count: Shopify stops counting at limit and reports the bound instead of the truth, and precision is how it says so. Same shape as shopify_count_locations.
shopify_count_collectionsREADCount Shopify collections, optionally filtered with search syntax such as collection_type:smart. Returns count and precision.
shopify_count_customersREADCount customers, optionally matching a search, without reading any of them. 'How many customers do we have in Canada' is answerable with one integer and was previously answerable only by paging real people's names and email addresses into a model's context.
shopify_count_discount_codesREADCount redeem codes. Not the same number as the discount count.
shopify_count_discountsREADCount discounts without paging them. Size a bulk job before starting it.
shopify_count_draft_ordersREADCount draft orders without paging them.
shopify_count_eventsREADCount Shopify store events matching a search filter, without returning any of them. Capped by Shopify at 10,000; the precision field says EXACT or AT_LEAST.
shopify_count_gift_cardsREADCount gift cards. Report the precision, not the count alone.
shopify_count_locationsREADCount the store's locations, optionally filtered with Shopify search syntax. Check the returned precision: Shopify caps the count at the limit.
shopify_count_ordersREADCount orders, optionally matching a search, without paging them. 'How many orders this week' previously meant paging rows of order data into a model's context to produce one integer. Subject to the same roughly-60-day window as listing orders.
shopify_count_pagesREADCount the Shopify online store's pages with one number instead of paging them. Returns a precision alongside the count; an AT_LEAST count must not be reported as exact.
shopify_count_productsREADCount products, optionally matching a search, without paging them. Answers 'how many products do we have' with one number instead of pulling hundreds of rows through the store's shared query budget. Report the precision Shopify returns — an AT_LEAST count presented as exact is a wrong answer.
shopify_count_segmentsREADCount Shopify customer segments. Returns a number and a precision flag; Shopify caps the count at the given limit, default 10,000.
shopify_count_url_redirectsREADCount the Shopify store's URL redirects with one number. Run this before shopify_delete_all_url_redirects - it is the only way to find out how much that call would destroy.
shopify_count_variantsREADCount Shopify product variants, optionally filtered with search syntax. Returns count and precision; precision reads AT_LEAST on very large catalogues.
shopify_create_articleWRITECreate a Shopify blog article. It is ALWAYS created UNPUBLISHED and there is no publication argument - shopify_update_article publishes it as a separate act. A byline is required; get one from shopify_list_article_authors rather than inventing it. No image URL is accepted, because Shopify would fetch it; alt text alone is settable.
shopify_create_blogWRITECreate a Shopify blog - a container for articles. It publishes nothing by itself. The comment policy decides whether comments are MODERATED, CLOSED, or AUTO_PUBLISHED; AUTO_PUBLISHED means the public's text goes live on the storefront with no human review.
shopify_create_bxgy_discount_codeWRITEDESTRUCTIVE - Create a buy-X-get-Y discount code. IT GIVES AWAY REAL STOCK. THE "GET" SIDE IS THE BOUND AND IT IS MANDATORY. A BXGY discount is the one native type with no percentage or cash ceiling of its own - Shopify supports neither on DiscountCustomerGetsValueInput for BXGY - so get_quantity is the only ceiling that exists and it is capped at BXGY_MAX_GET_QUANTITY. usage_limit and ends_at are required for the same reason they are required on shopify_create_discount_code: an unbounded "get" is E4, and the provider's cap parameters are what turn it into a bounded operation. uses_per_order_limit defaults to 1. Shopify's own default is unlimited, which turns one code into "buy two, get twenty" on a single basket.
shopify_create_catalogWRITECreate a catalog for one or more markets. CREATED IN DRAFT BY DEFAULT. An ACTIVE catalog applies its price list and its product visibility to every shopper in its markets immediately. context accepts either markets or B2B company locations. Only the MARKET form is exposed: company-location catalogs are B2B, which needs Shopify Plus with B2B enabled, and that is an E7 the whole connector already carries. publicationId is NOT exposed, and this is the one worth knowing about. It controls which products the catalog shows, and obtaining a publication id needs read_publications - a scope that does not appear anywhere on Shopify's access-scopes reference, re-verified against the 110-name list on 2026-08-15. Shopify's own guidance covers the omission: "Do NOT create a publication if you want product availability determined by the sales channel", which is what happens when the field is left out.
shopify_create_collectionWRITECreate a manual collection, optionally with products in it. A collection is a grouping rather than merchandise: creating one publishes nothing. RULE-BASED SMART COLLECTIONS ARE NOT OFFERED — a rule keeps matching new products forever after the call returns, with no Agentic Fabriq action row behind anything it later includes. Manual membership is explicit and reversible one product at a time. Shopify refuses collection creation on the Starter and Retail plans.
shopify_create_customerWRITECreate a customer record. THIS IS AGENTIC FABRIQ CREATING PERSONAL DATA on the merchant's behalf, which is the sharpest edge in this connector. No marketing-consent field is settable: an agent asserting that a person agreed to be marketed to is a legal claim Agentic Fabriq has no basis to make. Creating a customer sends no email — Shopify's account-invitation mutation is separate and is not offered. Note that Agentic Fabriq offers no customer DELETE: erasing a person's record is a data-protection decision the merchant makes in their own admin.
shopify_create_customer_addressWRITEAdd a mailing address to an existing Shopify customer, optionally making it their default. Address keys are allow-listed (address1, address2, city, company, country_code, first_name, last_name, phone, province_code, zip); an unrecognised key is refused rather than ignored.
shopify_create_delivery_customizationWRITEBind an ALREADY INSTALLED function to checkout. Created disabled.
shopify_create_delivery_profileWRITECreate a shipping profile. coversAllItems is not exposed.
shopify_create_discount_codeWRITEDESTRUCTIVE — create a percentage discount code. IT GIVES AWAY REAL MARGIN, and the bounds are mandatory rather than defaulted: a usage limit and an end date must both be supplied, so no code Agentic Fabriq creates is open-ended. Percentage only — a fixed cash discount is unbounded against a small basket. It applies once per customer unless told otherwise, which is the opposite of Shopify's own default. AUTOMATIC discounts are not offered at all: a rule that discounts every matching cart forever has no action row behind anything it later gives away.
shopify_create_draft_orderWRITECreate a quote — a priced basket that has not been paid for. NOTHING IS CHARGED, NOTHING IS RESERVED AND NOBODY IS EMAILED: Shopify's mutation for mailing a quote to a customer is deliberately not offered, and completing the draft is a separate action. Only real catalogue variants at the merchant's own prices can be added; inventing a priced custom line is refused, because naming a price on a document a customer can pay is not an agent's decision. Reversible by Delete a draft order.
shopify_create_draft_order_from_orderWRITEBuild an unpaid quote from an existing order. NO MONEY MOVES. The reorder path. It copies a real order into a new DRAFT - unpaid, uncommitted, nobody emailed - which is what "same again, please" means operationally. The original order is not touched, not cancelled and not repriced; this creates a second document beside it. Turning the draft into a real order is the separate, destructive shopify_complete_draft_order. Reversible until then by shopify_delete_draft_order.
shopify_create_free_shipping_discount_codeWRITEDESTRUCTIVE - Create a free-shipping code. THE PRICE CAP IS A REQUIRED ARGUMENT. maximum_shipping_price HAS NO DEFAULT. Shopify's own words for the field: *"if set to 20.00, then only shipping rates that cost $20.00 or less will be made free. To apply the discount to all shipping rates, specify null."* Null is the version that pays freight on a pallet to another continent, and it is exactly the case E4 has in mind when it says that if the provider offers a cap parameter, use it and ship. This connector uses it and requires it. usage_limit and ends_at are required for the same reason they are on shopify_create_discount_code. Subscriptions are excluded and are not an argument: a free-shipping discount that applies to a subscription recurs on every billing cycle, and Shopify's recurringCycleLimit: 0 means indefinitely.
shopify_create_fulfillmentWRITEDESTRUCTIVE — mark goods as shipped against a Shopify fulfilment order. With `notify_customer` Shopify emails the shopper a shipping confirmation carrying whatever tracking details are supplied, AND THAT MAIL CANNOT BE RECALLED — a shipping notice for goods that were not actually shipped is worse than no notice at all. It also moves the order's fulfilment status, which feeds the merchant's own reporting and any automation wired to it.
shopify_create_fulfillment_eventWRITEDESTRUCTIVE -- create a Shopify fulfilment event recording shipment status (CARRIER_PICKED_UP, IN_TRANSIT, OUT_FOR_DELIVERY, DELIVERED and so on) against an existing fulfilment. Shown to the shopper and impossible to delete or edit -- verify the status before sending.
shopify_create_inventory_shipmentWRITECreate a DRAFT inventory shipment inside a transfer with up to 100 line items. Each line must not exceed the transfer line's shippableQuantity. Nothing moves until the shipment is marked in transit.
shopify_create_inventory_shipment_in_transitWRITEDESTRUCTIVE -- create an inventory shipment directly in IN_TRANSIT state. Stock leaves the origin location immediately. Shopify publishes no un-ship; the forward path is receiving at the destination.
shopify_create_inventory_transferWRITECreate a DRAFT inventory transfer between two store locations with up to 100 line items. Nothing is reserved and nothing goes off sale until the transfer is marked ready to ship.
shopify_create_inventory_transfer_ready_to_shipWRITEDESTRUCTIVE -- create an inventory transfer already in READY_TO_SHIP state. The quantity is reserved at the origin location immediately, so the storefront can no longer sell it. Use the plain create plus mark-ready when the transfer should be reviewed first.
shopify_create_marketWRITECreate a market - a country group with its own currency and prices. CREATED IN DRAFT BY DEFAULT, and that is a deliberate departure from Shopify. An ACTIVE market starts routing real shoppers into a different currency and a different set of prices the moment it exists. Pass market_status="ACTIVE" only after the market has been checked with shopify_resolve_market_for_country. marketCreate and marketUpdate are also the SUPERSEDING form of four mutations this connector will not call: marketRegionsCreate, marketRegionDelete, marketRegionsDelete and marketCurrencySettingsUpdate are all deprecated in favour of these two, and a deprecated mutation still compiles.
shopify_create_marketing_engagementWRITERecord a day's engagement figures - impressions, clicks, sessions, shares - against a Shopify external marketing activity. Nothing is sent and nothing is charged. is_cumulative is REQUIRED: true means running totals since the campaign began, false means that day alone, and the wrong answer silently corrupts the merchant's reporting. Ad spend is deliberately not settable here.
shopify_create_menuWRITECreate a Shopify navigation menu. It becomes visible when the theme references its handle, so creating one changes nothing on its own. Each item needs a title and a type; HTTP items carry a url, every other type carries a resource_id. Nest with an items key, up to three levels and 100 items per level.
shopify_create_metafield_definitionWRITECreate a metafield definition for PRODUCT, PRODUCTVARIANT, ORDER, CUSTOMER, COLLECTION or DRAFTORDER, with a type from shopify_list_metafield_definition_types and optional validations.
shopify_create_metaobjectWRITECreate a metaobject of an existing type with up to 100 field key/value pairs. Read the definition first to learn which keys are accepted.
shopify_create_metaobject_definitionWRITECreate a metaobject definition with up to 100 field definitions. The type string is permanent. Field types come from shopify_list_metafield_definition_types.
shopify_create_orderWRITEDESTRUCTIVE. Create a real order from catalogue variants. Sends no email.
shopify_create_order_risk_assessmentWRITEDESTRUCTIVE. Record a fraud verdict against a real person's order. THIS IS AN ACCUSATION WITH A PERMANENT RECORD AND NO DELETE. Shopify publishes no mutation that removes an assessment: it stays on the order, it changes risk.recommendation, it fires an orders/risk_assessment_changed webhook to everything the merchant has wired up, and the staff member who reads it next may cancel the order because of it. Correcting it means adding a second assessment beside the first, not replacing it. That is why this is marked destructive even though it moves no money. facts are the evidence, and they are what separate a useful assessment from an opinion. Each is {"description": ..., "sentiment": NEGATIVE | NEUTRAL | POSITIVE}; Shopify accepts at most MAX_RISK_FACTS and truncates a description past MAX_RISK_FACT_DESCRIPTION characters.
shopify_create_pageWRITECreate a Shopify online-store page. It is ALWAYS created UNPUBLISHED and there is no publication argument - a person, or a separate call to shopify_update_page, decides when shoppers can see it. The body is HTML and renders on the storefront once published.
shopify_create_productWRITECreate a Shopify product. It is ALWAYS created as a DRAFT and there is no way to ask for anything else — a draft is invisible to shoppers until a person publishes it in the store admin, which is the right number of humans between an agent and a shop window. No price and no variants are set; Shopify creates a default variant. Publishing is not available through Agentic Fabriq.
shopify_create_product_bundleWRITECreate a Shopify product bundle from existing products. Each component names a product id, an optional quantity and the option selections to expose on the bundle. Up to 30 components. Asynchronous: poll the returned operation id with shopify_get_product_operation. Requires the shop to have the bundles feature.
shopify_create_product_optionsWRITEAdd product options to a Shopify product. Takes the product id and up to three {name, values, position} entries. variant_strategy LEAVE_AS_IS (default) adds the axis only; CREATE fans out a variant for every combination. Variants created here have no price and must be priced in the Shopify admin.
shopify_create_returnWRITEOpen a return against a fulfilled order, naming the items and the reason. A RETURN IS A RECORD, NOT A REFUND — no money moves here. Refunding is a separate, separately-grantable action, the same separation cancelling and refunding an order already have. Reversible by Cancel a return. Before this, the only returns story Agentic Fabriq had was a raw refund, which gave money back with no record of why and no tracking of the goods coming the other way.
shopify_create_reverse_deliveryWRITECreate a Shopify reverse delivery for a reverse fulfilment order with carrier tracking details. Line items are required -- an empty list would mean 'everything', which is unbounded. No return label can be attached through this tool by design.
shopify_create_saved_searchWRITESave a search the merchant will see as a tab in their own admin.
shopify_create_segment_members_queryWRITECreate a Shopify customer-segment members query: returns an id, the current member count and whether the computation has finished. Feed the id to shopify_list_segment_members as query_id to page a stable snapshot. Creates no customer data.
shopify_create_url_redirectWRITEDESTRUCTIVE - create a Shopify URL redirect. Everyone visiting the path is silently 301'd to the target, including crawlers, and if the path currently resolves to a real page that page becomes unreachable. The target may be an absolute URL pointing off the store entirely - check it. Reversible with shopify_delete_url_redirect.
shopify_create_variantsWRITECreate variants on a Shopify product. Each entry needs option_values naming a value for every product option, and may carry sku, barcode, inventory_policy and taxable. Up to 100 per call. Price and compare-at price cannot be set by this tool.
shopify_create_web_presenceWRITEDESTRUCTIVE. Put a storefront on a domain or a subfolder. A WEB PRESENCE IS AN ADDRESS SHOPPERS AND SEARCH ENGINES REACH. Giving one a domain makes that domain serve a storefront; giving one a subfolder suffix makes /en-us-shaped URLs start resolving. Either way a URL that did not serve a shopfront a second ago now does, under whatever language default_locale names, and search engines will index it. It is flagged destructive for that reason rather than for deleting anything. domain_id and subfolder_suffix are MUTUALLY EXCLUSIVE and Shopify says so on the input type: each must be null if the other is not. Exactly one is required here. This is the SUPERSEDING form of marketWebPresenceCreate, which Shopify deprecated in favour of it. The deprecated mutation still compiles and still runs, which is why this connector names only webPresenceCreate anywhere.
shopify_credit_gift_cardWRITEDESTRUCTIVE. Add spendable money to a gift card. Creates liability.
shopify_deactivate_automatic_discountWRITESwitch OFF an automatic discount the merchant made. EMERGENCY STOP. AF DOES NOT CREATE AUTOMATIC DISCOUNTS AND CANNOT SWITCH ONE ON. An automatic discount applies itself to every matching cart with no AF action row behind any of it, which is why creating one and activating one are both refused. Switching one OFF is the opposite operation: it silences a rule the merchant already made, it makes the store give away less, and it is the fastest thing anyone can do when a badly-scoped promotion is discounting the whole catalogue. THE ASYMMETRY IS DELIBERATE. This is the only reversal in the connector whose forward direction is deliberately absent, and that is the safe way round: the half AF withholds is the half that creates a standing rule. Undoing this needs a person in the Shopify admin, which is the correct place for the decision to turn a self-applying discount back on.
shopify_deactivate_discount_codeWRITESwitch a discount code off without deleting it — THE EMERGENCY STOP for a code that has escaped. One call stops it working, Activate a discount code switches it back on if the panic was misplaced, and the usage history that explains what happened is kept.
shopify_deactivate_gift_cardWRITEDESTRUCTIVE. Stop a card being spent. Shopify publishes no reactivate.
shopify_deactivate_inventoryWRITEDESTRUCTIVE — stop stocking an item at a location. It takes the item off sale there AND discards the quantity recorded, which re-activating does not restore. Shopify refuses when the location has committed or incoming stock, which is the guard against using it on an item with unshipped orders against it.
shopify_deactivate_locationWRITEDESTRUCTIVE -- deactivate a location. Its inventory, pending orders and moving transfers go to destination_location_id, which is required here. Reversible by activating it again, but the stock does not come back with it.
shopify_debit_gift_cardWRITEDESTRUCTIVE. Take spendable money off a card, with no notice to the holder.
shopify_decline_returnWRITEDESTRUCTIVE — decline a return the customer requested. It tells a real person they cannot send goods back, and Shopify moves the return to DECLINED rather than back to REQUESTED, so the customer has to raise a new one. The reason is mandatory because it is the only explanation the merchant's own record will carry.
shopify_delete_all_external_marketing_activitiesWRITEDESTRUCTIVE - delete every external marketing activity Agentic Fabriq created on this store, along with the engagement history attributed to them. No selector, no undo. You must pass confirm exactly as "DELETE ALL". shopify_delete_external_marketing_activity removes one.
shopify_delete_all_url_redirectsWRITEDESTRUCTIVE - delete EVERY URL redirect in the Shopify store. No selector, no undo, no copy kept: every old link the merchant ever repaired starts 404ing. You must pass confirm exactly as "DELETE ALL". Run shopify_count_url_redirects first, or use shopify_bulk_delete_url_redirects to name the ones you actually mean.
shopify_delete_articleWRITEDESTRUCTIVE - delete a Shopify blog article and the comments on it. There is no undelete. Unpublishing it with shopify_update_article removes it from the storefront and keeps the text.
shopify_delete_automatic_discountWRITEDESTRUCTIVE. Delete an automatic discount the merchant made. Irreversible, and AF CANNOT RECREATE IT: creating an automatic discount is refused (E6), so nothing in this connector can put back what this removes. Prefer shopify_deactivate_automatic_discount, which stops the rule applying just as completely and leaves the object in the merchant's admin. Orders already placed keep their discount. Deleting reprices nothing.
shopify_delete_blogWRITEDESTRUCTIVE - delete a Shopify blog AND EVERY ARTICLE IN IT. There is no undelete for either. Check the article count with shopify_get_blog first.
shopify_delete_catalogWRITEDESTRUCTIVE. Delete a catalog. Its markets revert to base prices. Shopify has no undelete. Every market the catalog served goes back to the store's base prices and to sales-channel-determined product availability on the next page load. deleteDependentResources IS NOT EXPOSED, and that is the decision worth reading. It also deletes the price list and the publication the catalog owns. AF ships no mutation that can recreate either - the price-list mutations are refused (E6/E4) and publications need read_publications, which is not an obtainable scope - so forwarding the flag would be a one-way door with no inverse anywhere in AF's surface. Left at Shopify's default of false, the price list survives the catalog and can be attached to another one.
shopify_delete_collectionWRITEDESTRUCTIVE — delete a collection. THE PRODUCTS SURVIVE; the grouping and any storefront link to it do not. Ships as the inverse of creating one.
shopify_delete_commentWRITEDESTRUCTIVE - delete a Shopify blog comment. There is no undelete. shopify_mark_comment_spam removes it from the storefront just as completely, keeps the record, and is reversible - prefer it unless the text must genuinely cease to exist.
shopify_delete_customer_addressWRITEDESTRUCTIVE -- delete one address from a Shopify customer's record. Permanent -- Shopify publishes no undelete. Re-adding the address later creates a different id.
shopify_delete_delivery_customizationWRITEDESTRUCTIVE. Remove a delivery customisation and its configuration.
shopify_delete_delivery_profileWRITEDESTRUCTIVE. Delete a profile and every rate in it. Confirmation required.
shopify_delete_discount_codeWRITEDESTRUCTIVE — delete a discount code and its usage history. Irreversible. Deactivating stops a code working just as completely and keeps the record of what it did, so prefer that unless the code must genuinely cease to exist. Orders already placed with the code keep their discount; deleting it reprices nothing.
shopify_delete_discount_redeem_codesWRITEDESTRUCTIVE. Delete named redeem codes from a discount. The inverse of shopify_add_discount_redeem_codes, and the way to retire one leaked code without touching the discount everyone else is using. Irreversible: re-adding the same string creates a new code with no history behind it. NO SAVED SEARCH AND NO SEARCH STRING. Shopify offers savedSearchId and search here as alternatives to ids; neither is exposed. The effect ships via list-then-name - read the codes on the discount, then name the ones to delete. What is refused is a selector whose blast radius the caller cannot state and the audit row cannot record. Asynchronous: it returns a job. Poll it with shopify_get_job.
shopify_delete_draft_orderWRITEDESTRUCTIVE — delete a draft order. Irreversible, but the blast radius is small by construction: a draft is unpaid, so deleting one destroys a quote and touches no money, no stock and no customer. Shopify refuses once it has been completed, because at that point it is an order.
shopify_delete_external_marketing_activityWRITEDESTRUCTIVE - delete one Shopify external marketing activity and the engagement figures recorded against it. The store's attribution for that campaign disappears from Shopify's reports and re-creating it does not restore the history. Setting status INACTIVE instead keeps the record. Pass EXACTLY ONE identifier.
shopify_delete_inventory_shipmentWRITEDESTRUCTIVE -- delete an inventory shipment permanently. Its allocated quantity returns to the parent transfer.
shopify_delete_inventory_transferWRITEDESTRUCTIVE -- delete an inventory transfer permanently. Prefer cancelling: it achieves the same operational result and keeps the audit trail.
shopify_delete_locationWRITEDESTRUCTIVE -- delete a location permanently. There is no undelete anywhere in Shopify's API. Prefer deactivating, which moves the stock somewhere explicit and can be undone.
shopify_delete_marketWRITEDESTRUCTIVE. Delete a market. Its shoppers move somewhere else. Shopify has no undelete. Everything configured against the market goes with it: its currency settings, its tax and duty strategy, its region list, and its association with catalogs and web presences. The catalogs and web presences themselves survive - they are separate objects - but nothing routes shoppers to them through this market any more. Every shopper the market claimed falls through to whichever market claims them next, on their next page load, at that market's prices. The inverse shipped in the same migration is shopify_create_market, and it is an inverse only in the sense that it can build a market with the same countries again. It does not restore this one, and any catalog or web presence attachment has to be rebuilt by hand.
shopify_delete_marketing_engagementsWRITEDESTRUCTIVE - delete every engagement figure recorded for one Shopify marketing channel. That channel's attribution history disappears from the merchant's reports with no undo. The channel handle is required; there is no all-channels option.
shopify_delete_menuWRITEDESTRUCTIVE - delete a Shopify navigation menu. There is no undelete, and if the theme referenced its handle the storefront navigation goes empty for every shopper. Shopify refuses to delete a default menu.
shopify_delete_metafieldWRITERemove one metafield, identified by its owner, namespace and key. The exact inverse of writing one.
shopify_delete_metafield_definitionWRITEDESTRUCTIVE -- delete a metafield definition. delete_all_associated_metafields defaults to false, which keeps the stored values as loose metafields; setting it true destroys every value in the store.
shopify_delete_metaobjectWRITEDESTRUCTIVE -- delete a metaobject permanently. Theme references to it break.
shopify_delete_metaobject_definitionWRITEDESTRUCTIVE -- delete a metaobject definition and every metaobject of that type. Irreversible. Check metaobjectsCount with shopify_get_metaobject_definition before calling.
shopify_delete_orderWRITEDESTRUCTIVE. Delete an order and its financial history. Confirmation required.
shopify_delete_pageWRITEDESTRUCTIVE - delete a Shopify page. There is no undelete and the storefront URL stops resolving. Unpublishing it with shopify_update_page removes it from the storefront and keeps the text.
shopify_delete_productWRITEDESTRUCTIVE — delete a product, its variants and its media. SHOPIFY HAS NO UNDELETE. It ships as the inverse of creating a product, so a merchant is not left tidying up by hand — but Set product status to ARCHIVED is the reversible version of the same intent and is almost always the better answer.
shopify_delete_product_mediaWRITEDESTRUCTIVE -- permanently delete images, videos or 3D models from a Shopify product. Takes the product id and up to 100 media ids from shopify_list_product_media. There is no undo: re-uploading media is not offered by this connector. Deleting media also detaches it from any variant that referenced it.
shopify_delete_product_optionsWRITEDelete product options from a Shopify product. strategy NON_DESTRUCTIVE (default here) refuses if any variant would be deleted; DEFAULT is Shopify's own; POSITION deletes duplicate variants, highest position first, with no undo.
shopify_delete_saved_searchWRITEDESTRUCTIVE. Remove a saved search from the merchant's admin.
shopify_delete_url_redirectWRITERemove one Shopify URL redirect. The path returns to whatever the storefront would otherwise serve - usually a 404, occasionally the page the redirect was masking.
shopify_delete_variantsWRITEDESTRUCTIVE -- delete Shopify product variants. Takes the PARENT PRODUCT id -- Shopify addresses this mutation to the product -- and up to 100 variant ids. Irreversible. Shopify refuses to delete the last variant on a product.
shopify_delete_web_presenceWRITEDESTRUCTIVE. Take a storefront address offline. Links stop working. WHAT BREAKS: every URL this presence served stops being served. If it held a domain, that domain no longer answers with a shopfront; if it held a subfolder, those paths stop resolving. Anyone who arrives from a bookmark, an email, an ad or a search result lands on nothing. The market that used the presence keeps existing and falls back to the store's primary address. The inverse shipped in the same migration is shopify_create_web_presence, which can rebuild a presence on the same domain or suffix. It does not bring back the alternate-locale list or the market attachment; read those with shopify_list_web_presences BEFORE calling this.
shopify_detach_media_from_variantWRITEDetach media from a Shopify product variant. The image stays on the product and on other variants; only this variant's association is removed. Use shopify_delete_product_media if the media itself must go -- that one has no undo.
shopify_disable_local_pickupWRITEDESTRUCTIVE. Stop offering local pickup. The instructions are discarded.
shopify_disable_shop_localeWRITEDESTRUCTIVE. Remove a language AND every translation in it. Shopify's own sentence, and it is the whole hazard: "Deletes a locale for a shop. This also deletes all translations of this locale." Every product title, description, page, menu label and metafield value ever translated into this language is gone. Shopify has no undelete for them, and re-enabling the locale brings back an empty one. The inverse shipped in the same migration, shopify_enable_shop_locale, restores the LANGUAGE and none of the content. If the intent is only to hide a language from shoppers, use shopify_update_shop_locale with published=false instead - that is completely reversible and this is not.
shopify_dispose_reverse_fulfillment_orderWRITEDESTRUCTIVE -- dispose Shopify reverse fulfilment order line items as RESTOCKED, NOT_RESTOCKED, MISSING or PROCESSING_REQUIRED. RESTOCKED requires a location and makes the units sellable again. There is no un-dispose mutation -- check the goods before calling.
shopify_duplicate_collectionWRITEDuplicate a Shopify collection under a new title. The copy is always unpublished on every channel. It carries the original's manual product membership, description and sort order. For large collections a job id is returned; poll it with shopify_get_job.
shopify_duplicate_draft_orderWRITECopy a draft order into a new unpaid draft. NO MONEY MOVES. A draft order is an unpaid quote, so duplicating one charges nothing, reserves nothing and mails nothing. It is how a repeat wholesale order gets rebuilt without retyping forty lines, and unlike shopify_create_draft_order it carries across whatever the original had that AF's create deliberately does not expose. Reversible by shopify_delete_draft_order.
shopify_duplicate_inventory_transferWRITEDuplicate an inventory transfer as a new DRAFT with the same endpoints and lines. Use it to replace a cancelled transfer.
shopify_duplicate_productWRITEDuplicate a Shopify product. The copy is always created as DRAFT and carries the original's options, variants, tags and prices, but no inventory, history or channel publication. Optionally copy images (moved in a background job) and translations.
shopify_edit_inventory_transferWRITEEdit the header of an inventory transfer. Origin and destination are editable on DRAFT transfers only. Tags replace the existing list rather than adding to it.
shopify_edit_locationWRITEDESTRUCTIVE -- partial update of a location's name, address and whether it fulfils online orders. Turning off online fulfilment removes its stock from what the storefront can sell.
shopify_enable_local_pickupWRITEOffer local pickup at a location, with a promised readiness time.
shopify_enable_shop_localeWRITEAdd a language to the store. It starts UNPUBLISHED. Shopify's own words: "The newly added locale is in the unpublished state." Nothing is visible to a shopper until shopify_update_shop_locale publishes it, which is the safe order: enable, translate, then publish. The inverse is shopify_disable_shop_locale, and it is NOT a clean inverse - disabling deletes every translation stored against the locale. Read that method before using it.
shopify_enable_standard_metaobject_definitionWRITETurn on one of Shopify's ready-made metaobject definitions.
shopify_find_inventory_itemsREADSearch inventory items with Shopify search syntax on sku, id, created_at or updated_at, e.g. 'sku:ABC-1'. Returns the inventoryItem id needed by every inventory write, plus tracking, customs data and unit cost.
shopify_find_locationsREADSearch the store's locations with Shopify search syntax on name, address, city, country and active status. Set include_inactive to see deactivated locations, which the plain list action hides.
shopify_get_abandonmentREADRead one abandonment record. The signed cart URL is never returned.
shopify_get_articleREADRead one Shopify blog article: title, handle, full HTML body, summary, byline, tags, blog and comment count. The image is reported by alt text only; the image URL is deliberately not returned.
shopify_get_blogREADRead one Shopify blog: title, handle, comment policy, template and article count. Get the blog_id from shopify_list_blogs.
shopify_get_business_entityREADRead one legal entity the store trades as. Check archived.
shopify_get_carrier_serviceREADRead one carrier service and the countries it quotes for.
shopify_get_catalogREADRead one catalog: its markets, its status, its price list. priceList.parent.adjustment is the standing rule in numbers - a percentage off or on, applied to every product in the catalog. Reading it is how an agent answers "why is this product 12% cheaper in Germany". Changing it is not possible through AF and will not be; see the section comment and docs/coverage/shopify.md.
shopify_get_collectionREADRead one collection and the products in it. This is what answers 'what is in the sale collection', and it produces the product ids that removing products from a collection needs.
shopify_get_collection_by_identifierREADRead a collection by its storefront handle rather than its GID.
shopify_get_customerREADRead one customer by id. RETURNS PERSONAL DATA — name, email address, phone number, address and lifetime spend. Reading ONE person is strictly narrower than listing a page of them, so granting this instead of List customers REDUCES exposure for the common case. If the store's app does not hold Shopify's protected-customer-data Level 2 approval, those fields come back empty and Agentic Fabriq says so explicitly rather than reporting a generic failure.
shopify_get_customer_by_identifierREADLook up a single Shopify customer by id, email address, phone number or a merchant-defined unique metafield value. Returns that one record or nothing -- narrower than searching the customer list, which returns a page of real people.
shopify_get_customer_segment_membershipREADCheck whether a specific Shopify customer belongs to each of up to 100 segments. Returns segmentId/isMember pairs and no personal data. Pass segment_ids as a comma-separated list of GIDs.
shopify_get_customer_tax_exemptionsREADRead a Shopify customer's taxExempt flag and the list of TaxExemption members on their record. Required before replacing or removing exemptions, because it is the only record of the previous list.
shopify_get_delivery_customizationREADRead one delivery customisation, including its function error history.
shopify_get_delivery_profileREADRead one shipping profile: zones, rates and locations. The zones read.
shopify_get_delivery_promise_settingsREADRead whether delivery dates are shown, and the store's processing time.
shopify_get_discountREADRead one discount, including the codes attached to it and how many times it has been used.
shopify_get_discount_by_codeREADLook a discount up by the string the shopper typed. THE READ THAT ANSWERS THE ACTUAL SUPPORT TICKET. A customer says "SAVE20 isn't working"; every other discount read starts from an id nobody has. This starts from the string in the email and returns the status, the dates and the used-count against the usage limit, which is the whole diagnosis. It is also how a caller obtains the DiscountCodeNode id the update, activate, deactivate and delete actions need. Case-insensitive at Shopify. Covers all four code types.
shopify_get_discount_code_batchREADRead a redeem-code batch: what was created, and what failed. shopify_add_discount_redeem_codes is asynchronous and returns only an id, so without this read the operation is unverifiable. It reports importedCount against failedCount and, per code, the exact error - a duplicate code fails on its own without failing the batch, and nothing else in the API will tell you which one it was.
shopify_get_domainREADRead one storefront domain and the web presence bound to it. SHOPIFY PUBLISHES NO "Requires ... access scope" LINE ON THIS QUERY. The scope declared on the catalog row is read_markets, because the only field a caller can reach it through in this connector is webPresences[].domain.id, and because Domain.marketWebPresence is itself a markets object. If a live store answers ACCESS_DENIED for a connection that holds read_markets, the scope on this row is what needs correcting, not the document.
shopify_get_draft_orderREADRead one draft order and what it prices. The payable invoice link is deliberately NOT returned: anyone holding that string can pay the draft, which makes it a credential rather than a field.
shopify_get_eventREADRead one Shopify event by its full GID (gid://shopify/BasicEvent/123). Returns the action, the timestamp, whether an app or a staff user caused it, and the human-readable message -- which names staff and quotes changed values.
shopify_get_fulfillmentREADRead one fulfilment: what was shipped, when, and what tracking the shopper was given. The check to run after correcting tracking details.
shopify_get_fulfillment_orderREADRead a single Shopify fulfilment order. Returns status, assigned location, line items with remaining quantities, active holds, the supported next actions, and the fulfilment orders it is eligible to be merged with. Call this before splitting, merging, rescheduling or marking ready for pickup.
shopify_get_gift_cardREADRead one gift card and its transaction ledger. No redeemable code.
shopify_get_granted_scopesREADRead which access scopes this connection holds. Run this first on a 403.
shopify_get_inventory_itemREADRead a single inventory item: unit cost, SKU, whether Shopify tracks it, country and province of origin, HS code and weight.
shopify_get_inventory_levelREADRead a single inventory level: its quantities, its location, whether it is active, whether it can be deactivated and the deactivation alert explaining why not.
shopify_get_inventory_levelsREADRead how many units of one item exist at each location — available (what the storefront will sell), on hand, committed and incoming. THIS CLOSES THE LARGEST HOLE IN THIS CONNECTOR: Agentic Fabriq could change stock and could not read it, so an agent told 'set this SKU to 10' had to guess a delta against a number it could not see. It needs NO new permission — Shopify's inventory write scope already grants the read. Read the value here and pass it to Set stock level as the comparison, and a concurrent change makes the write fail loudly instead of silently overwriting.
shopify_get_inventory_propertiesREADRead the shop's inventory configuration: every quantity name, its display name, whether it is in use, and how the names compose.
shopify_get_inventory_shipmentREADRead a single inventory shipment, its tracking and its line items with accepted, rejected and unreceived quantities. Read it before receiving.
shopify_get_inventory_transferREADRead a single inventory transfer, its line items (including shippableQuantity, which bounds what a new shipment may carry) and its shipments. Read this before creating or editing a shipment.
shopify_get_jobREADAsk whether an asynchronous Shopify job has finished. Cancelling an order and changing collection membership both return a job and complete later; before this, the only advice was to re-read the affected object and infer completion from it. A job that is not done has not failed. At Shopify the job read inherits the scope of the work behind it, so a job from a collection change needs the product scopes that action already carries.
shopify_get_locationREADRead a single location: address, whether it fulfils online orders, and the activatable / deactivatable / deletable flags that predict whether the matching mutation will succeed. Omit the id for the shop's primary location.
shopify_get_location_by_identifierREADLook up a location by a custom id held in a metafield, e.g. the warehouse code 'WH-EU-02', and get back its Shopify global id.
shopify_get_marketREADRead one market in full: currency, tax strategy, regions, address. webPresences is the part worth reading before any write. It is the list of addresses this market answers on, and domain.id is the only place in this connector a domain id can be obtained - Shopify's domain query takes an id it does not hand out, and the shop-wide domain list belongs to the shop family, not this one.
shopify_get_market_localizable_contentREADRead per-market content and the digests its writes require. Run this IMMEDIATELY before shopify_register_market_localizations. digest is a hash of the source value at read time and is the only thing standing between a concurrent edit and a localization silently attached to content that has since changed. marketLocalizations[].outdated reports the same problem after the fact. Shopify publishes both marketLocalizableResource (one id) and marketLocalizableResourcesByIds (many); this tool uses the plural form for both, because a list of one is the singular query.
shopify_get_marketing_activityREADRead one Shopify marketing activity: title, status, tactic, channel, UTM parameters, ad spend and budget. Get the id from shopify_list_marketing_activities.
shopify_get_marketing_eventREADRead one Shopify marketing event: type, description, channel handle, UTM parameters and dates. Get the id from shopify_list_marketing_events.
shopify_get_menuREADRead one Shopify navigation menu and its complete item tree, three levels deep. CALL THIS BEFORE shopify_update_menu: that mutation replaces the whole tree, so anything you do not send back is deleted.
shopify_get_metafield_definitionREADRead a single metafield definition: its type, validations, validation status, pin position, access settings and how many metafields use it.
shopify_get_metafieldsREADRead the metafields attached to a product, variant, order, customer, collection or draft order. Metafields are where merchants and their other apps keep everything Shopify's own schema has no field for — a supplier code, a warranty period, a care instruction — and an agent that cannot read them is working from half the record. Note the scopes: this reaches every one of those owner types, and Shopify gates a metafield on its owner's own permission.
shopify_get_metaobjectREADRead a single metaobject by id: handle, type, display name and every field's key, type and raw value.
shopify_get_metaobject_by_handleREADRead a metaobject by its type plus handle, e.g. type 'size_guide' handle 'mens-shoes'.
shopify_get_metaobject_definitionREADRead a metaobject definition by id: field definitions, access settings and metaobjectsCount.
shopify_get_metaobject_definition_by_typeREADRead a metaobject definition by type, e.g. 'size_guide'. Its fieldDefinitions are the keys a create or update may name.
shopify_get_orderREADRead one Shopify order in full. RETURNS PERSONAL DATA: the shopper's name, email address, phone number and shipping address, plus every line item. Only call it when the task is about that specific order — shopify_list_orders answers status questions and returns none of it. The line-item ids returned here are what shopify_refund_order needs.
shopify_get_order_editREADRe-read an open edit session: totals, lines, shipping, discounts. THE READ EVERY REMOVAL IN THIS BLOCK DEPENDS ON. shopify_begin_order_edit returns the calculated line items and nothing else, so before this there was no way to obtain a calculated SHIPPING LINE id or a calculated DISCOUNT APPLICATION id - which means no way to call the four operations that remove or update one. A write whose arguments no read can supply is not a shipped feature. It is also the "show a human the numbers before committing" call: total_outstanding is what the customer would still owe after the edit, and it is the field that decides whether committing leaves the merchant chasing a balance. Nothing here is committed. The order is unchanged until shopify_commit_order_edit.
shopify_get_order_riskREADRead Shopify's fraud assessment of an order, and every app's. THE READ THAT BELONGS UNDER shopify_cancel_order. AF can already cancel an order and refund it, and neither can be undone - and until now nothing in this connector could answer the question that precedes both: is this order actually fraudulent, and who says so. recommendation is Shopify's own verdict (ACCEPT, INVESTIGATE, CANCEL, NONE), and each assessment carries the facts behind it plus the app that produced it - provider is null when the assessment is Shopify's own. Non-mutating and cheap. It is what makes the destructive order actions supportable rather than guesswork.
shopify_get_pageREADRead one Shopify page: title, handle, full HTML body, publication state and template. Get the page_id from shopify_list_pages.
shopify_get_price_listREADRead one price list and the per-variant prices it sets. READ ONLY. This is the tool that answers "why does this variant cost that in this market". originType says whether the price came from the list's percentage adjustment or was set by hand on the variant. AF cannot write any of it. See shopify_list_price_lists and docs/coverage/shopify.md for why every price-list mutation is refused.
shopify_get_productREADRead one Shopify product with its description, tags and variants. Each variant carries the `inventoryItem.id` that shopify_adjust_inventory requires — that id is neither the product id nor the variant id. Current stock LEVELS are deliberately not returned: reading them needs read_inventory on top of read_products, and requiring it would stop a read-only products grant from working at all.
shopify_get_product_operationREADRead a Shopify ProductOperation by id. Returns status (CREATED, ACTIVE, COMPLETE), the resulting product, and any userErrors the background mutation produced. Use it after shopify_set_product with synchronous=false, shopify_create_product_bundle or shopify_update_product_bundle.
shopify_get_refundREADRead one refund: what was given back, to whom, and by which staff member.
shopify_get_returnREADRead one return and its status. REQUESTED awaits a decision, OPEN has been approved and awaits the goods, CLOSED is finished, DECLINED and CANCELED ended early. Every other return action keys off that status.
shopify_get_returnable_fulfillmentREADRead a single Shopify returnable fulfilment by id, with every fulfilment line item and the quantity still available to return. Use it to re-check availability just before creating a return.
shopify_get_reverse_deliveryREADRead a Shopify reverse delivery: line items and carrier tracking (carrier, number, tracking URL). The return label's public download link is deliberately excluded from the response.
shopify_get_reverse_fulfillment_orderREADRead one Shopify reverse fulfilment order: line items with expected quantities, dispositions already applied, and the reverse deliveries attached. Supplies the ids for shopify_create_reverse_delivery and shopify_dispose_reverse_fulfillment_order.
shopify_get_segmentREADRead one Shopify customer segment by id -- its name, its ShopifyQL definition, and when it was created and last edited. No customer data.
shopify_get_shop_settingsREADRead the Shopify store's configuration - name, domains, currency, timezone, units, tax settings, plan, billing address - and the FULL TEXT of its refund, privacy, terms-of-service, shipping and contact policies. Quote the policy text rather than inferring it. Agentic Fabriq cannot change any policy. The analytics token and storefront access tokens Shopify exposes on this object are not returned.
shopify_get_taxonomyREADSearch Shopify's product taxonomy. Only a leaf category is accepted later.
shopify_get_translatable_contentREADRead the source content, its digests, and one language's version. This is the read to run IMMEDIATELY before shopify_register_translations, and running it any earlier is the bug this docstring exists to prevent. translatableContent.digest is a hash of the source text at the moment of reading. If somebody edits the product between this read and the write, the digest goes stale and Shopify refuses the write - which is the good outcome. The bad one is the reverse: a digest cached from an old read, applied to text that has since changed, silently attaching a translation to content nobody is showing any more. translations[].outdated is the same fact after the fact: it means the source changed since this translation was written.
shopify_get_url_redirectREADRead one Shopify URL redirect: id, source path and target. Get the id from shopify_list_url_redirects.
shopify_get_variantREADRead one variant directly, including the delivery profile that prices it.
shopify_hold_fulfillment_orderWRITEStop a shipment REVERSIBLY. This is the bounded version of the intent an agent otherwise satisfies with Cancel an order, which Shopify cannot undo: the goods stay where they are, the order stays open, no money moves, nobody is emailed, and Release a shipment restores it exactly. Shipping the reversible tool alongside the irreversible one is a net reduction in risk, because it is what an agent reaches for instead.
shopify_list_abandoned_checkoutsREADList carts that were started and not completed, with their value and item count. THIS IS A LIST OF PEOPLE WHO DID NOT BUY, and Agentic Fabriq has no consent signal for them — so it returns NO name, email, phone or address, and specifically not the checkout recovery link, which lets whoever holds it open that person's cart. It answers 'how much value are we losing at checkout'; turning it into outreach would need contact details it does not return. Shopify also requires the staff user to hold the manage-abandoned-checkouts permission.
shopify_list_all_fulfillment_ordersREADList Shopify fulfilment orders store-wide with search and paging. Supports Shopify search syntax over status, updated_at and assigned_location_id. Use it to find shipments to act on when you do not have an order id.
shopify_list_api_versionsREADList the Admin API versions Shopify still serves, against the pinned one.
shopify_list_article_authorsREADList the author names already used on the Shopify store's articles. Call this before shopify_create_article, which requires a byline: inventing one attributes an article to a person who did not write it.
shopify_list_article_commentsREADList the comments on one Shopify blog article with their moderation status, body and the commenter's display name. Shopify also exposes each commenter's email address, IP address and user agent; none of those is returned. Get the article_id from shopify_list_articles.
shopify_list_article_tagsREADList the tags already used across the Shopify store's articles, so tagging is a choice from an existing vocabulary rather than a guess.
shopify_list_articlesREADList Shopify blog articles with id, title, handle, byline, tags, blog and publication state. Bodies are not returned - use shopify_get_article. Filter with Shopify search syntax, e.g. `blog_title:News`.
shopify_list_available_carrier_servicesREADList carrier services paired with the locations they can ship from.
shopify_list_available_localesREADList every locale the store COULD publish, not the ones it does.
shopify_list_blogsREADList the Shopify store's blogs with id, title, handle, article count and comment policy. The id is what shopify_create_article needs. The comment policy tells you whether comments are moderated, closed, or auto-published without review.
shopify_list_business_entitiesREADList the legal entities the store trades as.
shopify_list_carrier_servicesREADList carrier services. The callback URL is never selected or returned.
shopify_list_catalogsREADList catalogs - what each market can see and what it pays. priceList is selected because it is the thing worth knowing before touching a catalog: fixedPricesCount says how many products this catalog re-prices. AF ships no mutation that can change those prices (see the section comment), so this read is how an agent explains a price a shopper is seeing rather than the one on the product.
shopify_list_collectionsREADList the store's collections with their handles and how many products each holds. Collections are how merchants think about their catalogue — 'the sale collection', 'new in' — and that whole vocabulary was unanswerable before this. Covered by the product scopes; no new permission.
shopify_list_customer_addressesREADList a Shopify customer's addresses with their ids, and the id of their default address. Required before updating, deleting or promoting an address, and the only record of the previous values if you intend to change them.
shopify_list_customer_saved_searchesREADList a Shopify store's customer saved searches -- the pre-segment way of saving a customer filter. Deprecated by Shopify in favour of segments; pair with shopify_list_segment_migrations to find each one's replacement.
shopify_list_customersREADList Shopify customers. EVERY FIELD RETURNED IS PERSONAL DATA — names, email addresses and phone numbers of members of the public who gave them to a shop. Use `query` to find the one customer the task is about rather than paging the store's whole customer list, and keep `first` small.
shopify_list_delivery_customizationsREADList the Shopify Functions intercepting checkout delivery options.
shopify_list_delivery_profile_locationsREADList locations a shipping profile may ship from.
shopify_list_delivery_profilesREADList shipping profiles. locationsWithoutRatesCount is the field to read.
shopify_list_discount_saved_searchesREADList the discount searches the merchant has saved in their admin. Shopify publishes three separate root fields rather than one filtered list, so kind selects between them: CODE (codeDiscountSavedSearches), AUTOMATIC (automaticDiscountSavedSearches) and REDEEM_CODE (discountRedeemCodeSavedSearches). Each saved search carries the merchant's own query string, which is the useful part: it says how this shop thinks about its discounts ("expiring this month", "influencer codes"), and the same string can be passed to shopify_list_discounts to see the rows. NOTE WHAT THIS DOES NOT ENABLE. Every bulk discount mutation accepts a savedSearchId, and none of AF's expose it - the ids returned here are readable, not actionable. Reading them is how a caller turns a merchant's saved search into an explicit list of ids it can then name.
shopify_list_discountsREADList discount codes and automatic discounts with their status, dates and usage. The used-count against the usage limit is the number that answers 'is this code being abused', which is the most common reason to look.
shopify_list_draft_order_delivery_optionsWRITEPrice a draft order's delivery options without creating it. Writes nothing.
shopify_list_draft_order_saved_searchesREADList the draft-order searches the merchant has saved. The useful field is query: it is the merchant's own filter string, and passing it to shopify_list_draft_orders reproduces the view they look at. The ids are readable but not actionable - the bulk draft-order mutations here take explicit ids and no savedSearchId.
shopify_list_draft_order_tagsREADList every tag already used on this shop's draft orders. The read that makes shopify_add_draft_order_tags usable. Tags are free text, so an agent inventing one produces a tag nobody's saved searches will match and nobody will ever look at again. This returns the vocabulary the shop actually uses. Shop.draftOrderTags takes first and no cursor, so it is a single page rather than a paginated walk.
shopify_list_draft_ordersREADList draft orders (quotes) with their status and total. Returns no customer details, for the same reason listing orders does not.
shopify_list_eventsREADList Shopify store events -- the platform's own audit trail of creates, edits, cancellations and deletions across orders, products, collections, customers and draft orders. Filter with action:destroy, subject_type:PRODUCT or created_at:>2026-08-01. Event messages name staff and quote changed values.
shopify_list_fulfillment_order_move_locationsREADList where a fulfilment order can be moved to, and why not where it cannot.
shopify_list_fulfillment_ordersREADList the fulfilment orders one Shopify order was split into, with the assigned location and the units still outstanding on each. A Shopify order is not shipped directly — it is split per location or third-party service — so this is the step that turns an order id into the fulfilment-order id and line-item ids that shopify_create_fulfillment requires.
shopify_list_fulfillmentsREADList the fulfilments recorded against an order, with their status and tracking. This is how an agent confirms that marking goods as shipped actually landed, and it produces the fulfilment ids that cancelling a fulfilment and correcting tracking both need — neither was reachable without it. Covered by the order read scope.
shopify_list_gift_cardsREADList gift cards. The redeemable code is never selected or returned.
shopify_list_held_fulfillment_ordersREADList Shopify fulfilment orders that are currently on hold, each with its hold reason and notes. Pairs with hold and release. Filter with Shopify search syntax over order_financial_status, order_risk_level and shipping_address_coordinates_validated.
shopify_list_inventory_shipmentsREADList inventory shipments. Filter with Shopify search syntax on id, status, barcode, tracking_number or destination_id.
shopify_list_inventory_transfersREADList inventory transfers: which items are moving from which location to which, their status (draft, ready to ship, transferred, cancelled) and how much has arrived. Filter with Shopify search syntax on id, origin_id, destination_id, status or created_at.
shopify_list_locationsREADList the Shopify store's active stock locations with their ids and addresses. Call this BEFORE shopify_adjust_inventory: a stock level in Shopify is always a quantity of one item AT one location, and there is no store-wide number to move. A store with a warehouse and two shops has three separate answers to 'how many are there'.
shopify_list_market_localizable_resourcesREADList metafields and metaobjects that can hold per-market values. MARKET LOCALIZATION IS NOT TRANSLATION. A translation says the same thing in another language; a market localization says a DIFFERENT thing in one market - a different size chart for the US, a different care label for the EU. Shopify's enum has exactly two members, METAFIELD and METAOBJECT, so this surface is narrow by construction. Like the translation reads, this is where digest comes from, and shopify_register_market_localizations cannot be called without one.
shopify_list_marketing_activitiesREADList the Shopify store's marketing activities with id, title, status, tactic, channel, ad spend and budget. Check isExternal: only external activities can be updated or deleted through Agentic Fabriq.
shopify_list_marketing_eventsREADList Shopify marketing events - the records store traffic is attributed to - with channel handle, UTM source, medium and campaign, and dates. The channel handle is what shopify_delete_marketing_engagements needs.
shopify_list_marketsREADList the store's markets, with the currency each one prices in. This is the read every other tool in this family depends on: a market id is an argument to shopify_update_market, shopify_create_catalog, shopify_register_translations (as the optional market scope) and shopify_register_market_localizations, and nothing else in the connector produces one.
shopify_list_menusREADList the Shopify storefront's navigation menus with id, title, handle and top-level items. The handle is what a theme references, so it decides whether a menu appears in the storefront. Use shopify_get_menu for the full nested item tree - you need it before shopify_update_menu, which replaces the whole tree.
shopify_list_metafield_definition_typesREADList Shopify's metafield types with their categories and supported validations. Read it before creating a metafield definition or a metaobject field.
shopify_list_metafield_definitionsREADList metafield definitions for PRODUCT, PRODUCTVARIANT, ORDER, CUSTOMER, COLLECTION or DRAFTORDER. Returns each field's key, namespace, type, validations and how many values exist.
shopify_list_metaobject_definitionsREADList metaobject definitions with their type strings, names, record counts and access settings. Start here before listing or writing metaobjects.
shopify_list_metaobjectsREADList metaobjects of a given type with their handles, display names and field values. Filter with Shopify search syntax including fields.{key}:{value} for filterable fields.
shopify_list_order_transactionsREADList payments, captures, refunds and voids. receiptJson is never selected.
shopify_list_ordersREADList Shopify orders, newest first, with id, order number, dates, payment and fulfilment status and total. Deliberately returns NO customer name, email, phone or shipping address — use shopify_get_order for one specific order when you genuinely need those. Reaches roughly the last 60 days; older orders require a Shopify approval Agentic Fabriq does not hold, so an empty result for an old date range is a permission boundary and not a bug.
shopify_list_pagesREADList the Shopify online store's pages with id, title, handle, publication state and dates. START HERE for anything touching a page: the id returned is the Shopify global id (gid://shopify/Page/...) that the other page tools need. Bodies are not returned - use shopify_get_page for one page when you need its HTML.
shopify_list_payment_disputesREADList chargebacks and their evidence deadlines. Read only, by Shopify's rule.
shopify_list_payment_terms_templatesREADList the payment terms a draft order can be issued on.
shopify_list_payoutsREADList payouts and the fees behind them. Bank account detail is not selected.
shopify_list_price_listsREADList the store's price lists. READ ONLY - AF cannot change them. THIS READ EXISTS SO THAT PRICES ARE EXPLICABLE. AF's standing position is that it never sets a price: shopify_create_product refuses one and shopify_update_variant has no price argument. A price list is the other way a price gets set - a standing rule that re-prices every product for a market until somebody removes it, with no AF action row behind any of the re-pricings, which is the E6 test. Every price-list mutation is refused on that basis and the FixedPrices forms are also E4, naming an absolute amount with no cap. Refusing the writes and withholding the read would have been the worse combination: an agent asked why a German shopper sees a different price would have had no way to find out.
shopify_list_product_mediaREADList the media attached to a Shopify product. Returns each item's media id, alt text, content type (IMAGE, VIDEO, EXTERNAL_VIDEO, MODEL_3D), processing status and any media errors. Use the ids with the media update, delete, reorder, attach and detach tools. No image URL is returned.
shopify_list_productsREADList products in the Shopify store with their id, title, handle, status, vendor and type. START HERE for anything touching a product: the `id` returned is the Shopify global id (gid://shopify/Product/...) that every other product tool needs — it is NOT the number in the admin URL bar. Paginate with `after`, using `page_info.endCursor` from the previous page.
shopify_list_resource_eventsREADRead the event timeline of a single Shopify Order, Product, Customer, DraftOrder or Collection, given its full GID. Answers 'what has happened to this record and who did it'. Other resource types are refused.
shopify_list_return_reasonsREADList Shopify return reason definitions with handle, localised name and whether the reason has been retired. Use it to present accurate reason choices rather than guessing from the enum.
shopify_list_returnable_fulfillmentsREADList Shopify returnable fulfilments for an order, each with the fulfilment line items and the quantity still available to return. Call this before shopify_create_return or shopify_calculate_return.
shopify_list_returnsREADList the returns raised against one order. Reached through the order rather than store-wide on purpose: a store-wide return list is a survey of unhappy customers, and every use of this is anchored to an order someone is already looking at.
shopify_list_reverse_fulfillment_ordersREADList the reverse fulfilment orders for a Shopify return, with status and any third-party confirmation. Start here before creating a reverse delivery or disposing of returned goods.
shopify_list_segment_filtersREADList Shopify's segment filter vocabulary: the query handles usable in a ShopifyQL segment condition, with their localized names and whether each accepts multiple values.
shopify_list_segment_membersREADList the customers in a Shopify segment -- real people, with names, emails and phone numbers. Returns total_count so you can see the size of the segment before paging it. Prefer shopify_get_customer_segment_membership when you only need to know whether one specific customer is a member.
shopify_list_segment_migrationsREADList Shopify segment migrations: each row pairs a legacy savedSearchId with the segmentId that replaced it. Narrow to one saved search with saved_search_id.
shopify_list_segmentsREADList Shopify customer segments with their names and the ShopifyQL query that defines each one. No personal data -- a segment is a rule. Required to obtain a segment id.
shopify_list_shop_localesREADList the store's languages: which exist, which shoppers can see. published: false on the query means "do not filter to published only" - unpublished locales are included, which is the point: a locale has to exist before it can be translated, and it should not be published until it has been. This read is a hard prerequisite for three writes. translationsRegister and translationsRemove both say the locale must be one returned here, and shopify_create_web_presence needs a locale that is already enabled.
shopify_list_standard_metafield_templatesREADList Shopify's ready-made metafield definitions the storefront understands.
shopify_list_tender_transactionsREADList money received by the store, for reconciliation against a statement.
shopify_list_translatable_resourcesREADList what can be translated for one resource type, with digests. THE digest FIELD IS WHY THIS READ EXISTS. shopify_register_translations will not accept a translation without the digest of the source content it translates, and this query and its sibling shopify_get_translatable_content are the only two places Shopify produces one. resource_type is restricted to twenty-two of Shopify's thirty members. The seven ONLINE_STORE_THEME* members and SHOP_POLICY are not offered: theme content is theme source (E3) and a shop policy is the store's legal text (E8). Both are recorded in docs/coverage/shopify.md.
shopify_list_url_redirectsREADList the Shopify store's URL redirects with id, source path and target. Filter with Shopify search syntax, e.g. `path:/old-page`. The ids are what the update, delete and bulk-delete actions need.
shopify_list_variantsREADList Shopify product variants across the store, with optional search syntax such as sku:ABC-123, inventory_quantity:<5 or product_id:123. Returns each variant's id, SKU, barcode, selected options, inventory policy and inventory item id.
shopify_list_web_presencesREADList every address the storefront answers on, and what serves it. READ THIS BEFORE ANY WEB-PRESENCE WRITE. rootUrls is the live URL a shopper actually lands on for each locale, and it is the only way to tell, before changing something, which of the store's addresses is already in use and by which market.
shopify_mark_comment_not_spamWRITEUn-mark a Shopify blog comment as spam. It returns to the moderation queue rather than being published, so this publishes nothing - shopify_approve_comment does that separately.
shopify_mark_comment_spamWRITEDESTRUCTIVE - mark a Shopify blog comment as spam, removing it from the storefront. It is not a delete: the comment survives and shopify_mark_comment_not_spam puts it back, so prefer this over shopify_delete_comment.
shopify_mark_inventory_shipment_in_transitWRITEDESTRUCTIVE -- mark an inventory shipment IN_TRANSIT. The origin location's stock drops immediately. There is no un-ship; recovery is receiving at the destination.
shopify_mark_inventory_transfer_ready_to_shipWRITEDESTRUCTIVE -- move an inventory transfer from DRAFT to READY_TO_SHIP. The quantities are reserved at the origin location and stop being sellable. Reversible by cancelling the transfer.
shopify_mark_order_as_paidWRITEDESTRUCTIVE. Record an order as paid without any money moving.
shopify_mark_prepared_for_pickupWRITEDESTRUCTIVE -- mark all remaining line items on Shopify fulfilment orders as ready for customer pickup. Shopify ALWAYS sends a Ready For Pickup email to the shopper and there is no way to suppress or undo it. Verify the goods are physically present first.
shopify_merge_fulfillment_ordersWRITEDESTRUCTIVE -- merge sets of Shopify fulfilment orders into one. Each group needs at least two fulfilment orders and produces one NEW fulfilment order; the merged-away ids stop being live. Build the argument from the merge_candidates returned by shopify_get_fulfillment_order. Reversed by shopify_split_fulfillment_orders.
shopify_move_fulfillment_orderWRITEReassign a fulfilment order to a different location — 'ship this from the warehouse instead of the shop'. Shopify refuses if the new location does not stock the items, which is the guard against creating an unfulfillable shipment. Reversible by moving it back; it moves no money and mails nobody.
shopify_move_inventoryWRITEDESTRUCTIVE — move sellable stock from one location to another, atomically. Without it an agent does two separate adjustments, and between them the store's total is short by the quantity — if the second fails, the stock has simply vanished. Destructive because it changes what each storefront location will sell.
shopify_open_fulfillment_orderWRITEMark a scheduled Shopify fulfilment order as open so it can be fulfilled now. Also reverses shopify_report_fulfillment_progress for merchant-managed fulfilment orders.
shopify_open_orderWRITERe-open a closed order. The exact inverse of archiving one. It does NOT un-cancel: a cancelled order stays cancelled, because Shopify has no mutation for that — which is why holding a fulfilment order is the reversible way to stop a shipment.
shopify_pin_metafield_definitionWRITEPin a metafield definition so merchants see it first in the admin. No data changes.
shopify_receive_inventory_shipmentWRITEDESTRUCTIVE -- receive an inventory shipment. Give per-line quantities with reason ACCEPTED or REJECTED, or a bulk action applied to every outstanding line. Accepted units become sellable stock at the destination. Pass the same idempotency key when retrying, or a retry receives the goods twice.
shopify_refund_orderWRITEDESTRUCTIVE — refund a Shopify order. REAL MONEY LEAVES THE MERCHANT'S ACCOUNT AND THERE IS NO REVERSAL. You cannot specify an amount: Agentic Fabriq asks Shopify what the named line items are worth (including tax and any discount already applied) and submits exactly that, through exactly the payment transaction Shopify names. Omit `refund_line_items` to refund the whole refundable balance. Restocking is a SEPARATE decision from refunding and defaults to not restocking.
shopify_refund_returnWRITEDESTRUCTIVE — refund against a return. REAL MONEY LEAVES THE MERCHANT'S ACCOUNT AND THERE IS NO REVERSAL. The difference from refunding an order is the record, not the money: this one is attached to a return, so the books show what came back and why. The bound is structural — money can only be returned against line items that are on this return, so the ceiling is what the customer paid for the goods they actually sent back. Shopify additionally requires the staff user to hold the refund-orders permission.
shopify_register_market_localizationsWRITEGive a metafield a different value in one market. Needs a digest. EVERY ENTRY CARRIES A market_localizable_content_digest AND IT IS NOT OPTIONAL, for the same reason shopify_register_translations does: the digest is a hash of the source value at read time, it comes only from shopify_get_market_localizable_content, and a stale one is how a concurrent edit gets clobbered. Read then write, in the same task. This is an UPSERT - the same key and market replaces the previous value, and the previous value is kept nowhere. The inverse shipped in the same migration is shopify_remove_market_localizations.
shopify_register_translationsWRITEDESTRUCTIVE - Write translated text shoppers will read. Needs a fresh digest. EVERY TRANSLATION CARRIES A translatable_content_digest AND IT IS NOT OPTIONAL. The digest is a hash of the source content, and the only source of one is shopify_get_translatable_content (or shopify_list_translatable_resources). Read it, then write, in that order, in the same task. A digest carried over from an earlier read is how a concurrent edit gets clobbered: somebody changes the product description, the digest AF holds no longer matches, and either Shopify rejects the write - the good case - or the translation ends up attached to text that is no longer the text. This mutation is an UPSERT: a translation for the same key, locale and market replaces the previous one. The previous value is not kept anywhere, which is why the paired read matters.
shopify_release_fulfillment_orderWRITERelease a held fulfilment order so it can be shipped normally. The exact inverse of holding one, and it ships in the same migration — a hold with no release is a shipment nobody can restart through Agentic Fabriq.
shopify_remove_customer_tax_exemptionsWRITEDESTRUCTIVE -- remove TaxExemption members from a Shopify customer. They are charged that tax again from their next order. Read the current list with shopify_get_customer_tax_exemptions first.
shopify_remove_discount_tagsWRITERemove tags from several discounts at once. The exact inverse. Worth knowing before using it: a discount tag can be what allows two product discounts to stack on one cart line, so removing one can change what a shopper is charged even though no discount was edited. NO SAVED SEARCH AND NO SEARCH STRING - explicit ids only, capped at MAX_IDS_PER_CALL.
shopify_remove_draft_order_tagsWRITERemove tags from several draft orders at once. The exact inverse. NO SAVED SEARCH AND NO SEARCH STRING - explicit ids only, capped at MAX_IDS_PER_CALL. Asynchronous: it returns a job. Poll it with shopify_get_job.
shopify_remove_inventory_shipment_itemsWRITEDESTRUCTIVE -- remove up to 100 shipment line items. The quantity returns to the parent transfer as unshipped. Reversible by adding them back.
shopify_remove_inventory_transfer_itemsWRITEDESTRUCTIVE -- remove up to 100 transfer line items. Takes TRANSFER LINE ITEM ids, not inventory item ids. On a ready-to-ship transfer the reserved quantity returns to available stock at the origin.
shopify_remove_market_localizationsWRITEDESTRUCTIVE. Delete per-market values. Markets fall back to source. The deleted values are not recoverable from Shopify. Shoppers in the named markets see the unlocalized metafield value from the next page load, which for a size chart or a care label is a real content change, not a cosmetic one. market_ids and localization_keys multiply, and both are required - there is no "every market" or "every key" form. The inverse shipped in the same migration is shopify_register_market_localizations. Read the values first with shopify_get_market_localizable_content if they might be wanted back.
shopify_remove_order_edit_discountWRITETake an ORDER-LEVEL discount off an open edit session. The order-level twin of shopify_remove_order_edit_line_discount: that one removes a discount attached to a single line, this one removes a discount applied across the whole order - a discount code the shopper used, or a manual reduction a colleague applied. It RAISES what the customer would owe, so read total_outstanding before committing. AF has no forward twin for this one. Adding a fresh order-level discount is reached through shopify_add_order_edit_line_discount per line, which keeps every reduction attributable to something on the order. Nothing has moved. The order is unchanged until shopify_commit_order_edit.
shopify_remove_order_edit_line_discountWRITETake a line discount off an open edit session. NOT COMMITTED. The exact inverse of shopify_add_order_edit_line_discount, and the undo for a discount staged in error. It RAISES what the customer would owe, which is why the returned total_outstanding is worth reading before committing: an edit that increases the total can leave the order with a balance the merchant then has to collect. Nothing has moved. The order is unchanged until shopify_commit_order_edit.
shopify_remove_order_edit_shipping_lineWRITETake a shipping charge off an open edit session. NOT COMMITTED. The correction for "we charged them for expedited delivery and then sent it by post". It only ever reduces what the customer owes, and it is bounded by what was already charged - the same property that makes a refund safe to expose and a charge not. Its forward twin is deliberately absent: adding a shipping line takes a mandatory price the agent names, with no cap parameter, so orderEditAddShippingLine is refused. Putting a removed shipping line back therefore needs a person in the Shopify admin, and the removal is only staged until commit in any case. Nothing has moved. The order is unchanged until shopify_commit_order_edit.
shopify_remove_products_from_collectionWRITETake products out of a manual collection. The exact inverse of adding them, and it does not delete, unpublish or otherwise touch the products themselves. Asynchronous, like its twin.
shopify_remove_tagsWRITERemove tags from an order, product, customer, draft order or collection. The exact inverse of adding them, over the same resource types and the same four scopes. Removing a tag that is not there is not an error, so it is safe to call when clearing workflow state.
shopify_remove_translationsWRITEDESTRUCTIVE. Delete translations. Shoppers fall back to the source. The deleted text is not recoverable from Shopify. Anyone reading the store in one of these languages sees the primary-language text for those fields from the next page load. BOTH SELECTORS ARE REQUIRED AND NEITHER HAS A DEFAULT. locales and translation_keys multiply: three locales and four keys delete twelve translations. There is deliberately no "all keys" or "all locales" form here even though the intersection is the whole point - naming what is being deleted is what makes the audit row mean something. The inverse shipped in the same migration is shopify_register_translations, which can write the text back if the caller still has it. Read it first with shopify_get_translatable_content.
shopify_reopen_returnWRITERe-open a closed return. The exact inverse of closing one.
shopify_reorder_collection_productsWRITEReorder products inside a Shopify collection whose sort order is MANUAL. Send only the products whose position changed, as {product_id, new_position} entries with zero-based positions evaluated in order. Returns a job id; poll it with shopify_get_job.
shopify_reorder_product_mediaWRITEReorder a Shopify product's media. Send only the items whose position changed, as {media_id, new_position} entries with zero-based positions evaluated in order. Position 0 is the featured image. Returns a job id; poll it with shopify_get_job.
shopify_reorder_product_optionsWRITEReorder a Shopify product's options and option values. Send every option, in the order you want, as {option_id, value_names} entries; value_names is optional. Presentation only.
shopify_reorder_variantsWRITEReorder a Shopify product's variants. Pass the variant ids in the order you want; 1-based positions are assigned automatically. The first variant leads the product page and supplies the price shown in collection grids.
shopify_replace_customer_tax_exemptionsWRITEDESTRUCTIVE -- replace a Shopify customer's complete list of TaxExemption members. Anything omitted is withdrawn. Read the current list with shopify_get_customer_tax_exemptions first -- that read is the only way to undo this.
shopify_report_fulfillment_progressWRITEReport progress on an open Shopify fulfilment order, moving it to in progress with optional notes. Reversed by shopify_open_fulfillment_order.
shopify_reroute_fulfillment_ordersWRITEReroute Shopify fulfilment orders to an alternative location using the shop's order-routing settings. Optionally restrict or exclude candidate locations. Read moved_fulfillment_orders to see where each one landed; reverse with shopify_move_fulfillment_order.
shopify_reschedule_fulfillment_orderWRITEReschedule a Shopify fulfilment order to a future date and time. Shopify may merge it with another fulfilment order sharing the same fulfillAt and return that one instead; read the returned id.
shopify_resolve_market_for_countryREADAnswer "what would a shopper in COUNTRY actually see?". THIS IS THE REPLACEMENT FOR marketByGeography, which Shopify deprecated. It resolves a buyer signal - in 2026-07 BuyerSignalInput has exactly one field, countryCode - into the currency, the tax and duty treatment, the web presences and the catalogs that shopper gets. It is the diagnostic read for this whole family: after changing a market or a web presence, this is how an agent checks what it actually did without waiting for a real shopper to find out.
shopify_run_analytics_queryREADRun a read-only ShopifyQL analytics query against the Shopify store's own data, e.g. `FROM sales SHOW total_sales GROUP BY month SINCE -3m ORDER BY month`. It writes nothing. Syntax errors come back in parse_errors alongside an empty table rather than as a failure, so an empty result with parse errors is a bad query, not a permission problem. Queries touching customer fields also need Shopify's protected-customer-data Level 2 approval.
shopify_set_customerWRITEDESTRUCTIVE -- upsert a Shopify customer: matched by id, email, phone or a merchant-defined custom id, created if absent and overwritten if present. tags, tax_exemptions and addresses each REPLACE the whole list they name; addresses deletes the ones you omit. Prefer shopify_create_customer or shopify_update_customer where you know which you mean.
shopify_set_default_customer_addressWRITEMake one of a Shopify customer's existing addresses their default shipping address. Exactly reversible -- read the current default from shopify_list_customer_addresses first if you may need to put it back.
shopify_set_delivery_customization_activationWRITEDESTRUCTIVE. Switch delivery customisations on or off at checkout.
shopify_set_fulfillment_deadlineWRITESet the fulfilment deadline on up to 100 named Shopify fulfilment orders. Returns whether Shopify accepted it. Reversed by setting the previous deadline.
shopify_set_inventoryWRITEDESTRUCTIVE — set an exact sellable quantity at one location, guarded by compare-and-set. SAFER THAN THE RELATIVE ADJUSTMENT, not riskier: the caller must state the quantity it believes is there, and if anything moved in between Shopify refuses and writes nothing. The relative path is the one where two agents both apply their change. The comparison quantity is REQUIRED and has no default, and the option Shopify offers to skip it is not exposed at all — it is what makes an absolute set safe enough to offer.
shopify_set_inventory_on_handWRITEDESTRUCTIVE -- set the on_hand quantity of one inventory item at one location, guarded by compare-and-set. on_hand is the physical count; shopify_set_inventory writes the sellable 'available' count instead and is the right tool for almost every case.
shopify_set_inventory_shipment_barcodeWRITESet an inventory shipment's barcode. Unique store-wide; Shopify refuses a duplicate.
shopify_set_inventory_shipment_trackingWRITESet an inventory shipment's carrier tracking. Unlike fulfilment tracking this never emails a customer.
shopify_set_inventory_transfer_itemsWRITEDESTRUCTIVE -- set quantities for up to 100 named inventory items on a transfer. This SETS rather than adds, and lines not named keep their quantities. On READY_TO_SHIP transfers the change moves reserved stock at the origin.
shopify_set_metafieldWRITEWrite one metafield onto a product, variant, order, customer, collection or draft order. Create-or-replace rather than additive, and exactly reversible by Delete a custom field. Worth knowing: a metafield can be bound to a definition the storefront theme reads, so overwriting one can change what a shopper sees on a product page. Shopify gates it on the owner resource's own write permission, which is why four write scopes are listed.
shopify_set_order_edit_quantityWRITEChange a line quantity inside an open edit session, and see what the customer WOULD be charged. Still uncommitted, so still nothing has moved. Zero removes the line. Reduced units go back on sale by default, because the alternative silently loses stock.
shopify_set_productWRITEDESTRUCTIVE -- replace a Shopify product declaratively. Any list you pass -- tags, collection_ids, options, variants -- REPLACES the existing one, and entries you leave out are DELETED. Read the product first and send the whole list back. Set synchronous=false for very large products; that returns an operation id for shopify_get_product_operation instead of the product.
shopify_set_product_statusWRITEDESTRUCTIVE — change a product's status between ACTIVE, DRAFT, ARCHIVED and UNLISTED. Status is not publication: Shopify does not put an active product in front of shoppers by itself. But for a product that is ALREADY published to the online store, DRAFT stops it being sold and ACTIVE starts it again, and this action cannot tell which case it is in — reading a product's publication state needs a scope Agentic Fabriq could not establish is obtainable. Treat it as changing what the store sells.
shopify_set_variant_componentsWRITEDESTRUCTIVE -- set the component variants of a Shopify bundle variant. components_to_set adds or re-quantifies components; component_variant_ids_to_remove drops them; remove_all empties the list. Up to 30 components. Changing components changes the bundle's sellable stock immediately. Price is not settable here.
shopify_split_fulfillment_ordersWRITEDESTRUCTIVE -- split Shopify fulfilment orders by moving specific line items and quantities into new fulfilment orders. Returns the original, the remaining and any replacement fulfilment order -- read the returned ids, because the ones you sent may no longer be live. Reversed by shopify_merge_fulfillment_orders.
shopify_submit_fulfillment_cancellation_requestWRITESend a cancellation request to the fulfilment service handling a Shopify fulfilment order. The service may refuse. Poll requestStatus on the fulfilment order to learn the outcome.
shopify_submit_fulfillment_requestWRITEDESTRUCTIVE -- send a fulfilment request to the fulfilment service assigned to a Shopify fulfilment order. Omit line_items to request everything; naming line items splits the fulfilment order and returns an unsubmitted_fulfillment_order for the remainder. The service accepts or rejects and AF cannot do either -- poll requestStatus.
shopify_suggest_segment_filtersREADSearch Shopify's segment filter vocabulary by keyword and return the matching query handles. Both the search term and a page size are required by Shopify.
shopify_suggest_segment_valuesREADSuggest values for a Shopify segment filter -- the tags, countries or states actually present in this store's customer data. Narrow with filter_query_name from shopify_list_segment_filters. A search term is required by Shopify.
shopify_toggle_inventory_locationsWRITEDESTRUCTIVE -- activate or deactivate one inventory item at up to 100 locations at once. Deactivating removes the item's quantities at that location permanently.
shopify_unpin_metafield_definitionWRITEUnpin a metafield definition so it no longer appears at the top of the admin editor.
shopify_update_articleWRITEDESTRUCTIVE - edit a Shopify blog article and optionally publish or unpublish it. The body REPLACES the previous one and tags REPLACE the whole list. Publishing exposes it to the public and to search engines; unpublishing does not retract what was already crawled. Changing the handle breaks the old URL with no redirect.
shopify_update_blogWRITEDESTRUCTIVE - edit a Shopify blog. Changing the handle changes the URL of the blog and every article under it, with no redirect, so every existing link breaks. Setting the comment policy to AUTO_PUBLISHED turns off human review of public comments.
shopify_update_bxgy_discount_codeWRITEDESTRUCTIVE - Change a live buy-X-get-Y code. IT REPRICES A CODE SHOPPERS HOLD. ends_at AND usage_limit ARE REQUIRED ON UPDATE, NOT ONLY ON CREATE. Shopify treats both as nullable and documents null as "no expiry" and "unlimited usage", so an update is the shortest path from a bounded code to an unbounded one. Requiring them here means no code AF has touched is open-ended, whoever created it. The buy/get block is all-or-nothing: supply all five of buy_product_ids, buy_quantity, get_product_ids, get_quantity and get_percentage, or none of them. Shopify's input replaces each side wholesale rather than patching it, and a half-supplied side silently drops the other half. Shoppers who already hold the code see the new terms immediately. Orders already placed are not repriced.
shopify_update_catalogWRITEDESTRUCTIVE - Change a catalog's name, status, markets or price list. WHAT MOVES: setting catalog_status="ACTIVE" starts applying this catalog's prices and product visibility to its markets on the next page load. Setting market_ids REPLACES the market list rather than adding to it - markets left out stop being served by this catalog. Attaching a different price_list_id re-prices every product in the catalog's markets at once. publicationId is not exposed here for the same reason as on create: read_publications is not an obtainable scope.
shopify_update_catalog_contextWRITEDESTRUCTIVE - Add or remove the markets a catalog applies to, without replacing. WHAT MOVES: removing a market withdraws this catalog's prices and its product visibility from that market on the next page load. If the catalog carried a price list, shoppers there go back to the base price; if it carried a publication, the set of products they can see changes. Adding a market does the reverse, immediately, if the catalog is ACTIVE. It is reversible by calling this again with the arguments swapped, which is why it is not flagged destructive - but it is not quiet. Use this rather than shopify_update_catalog when the intent is "also serve Mexico" instead of "serve exactly these markets"; update_catalog replaces the whole list.
shopify_update_collectionWRITEUpdate a Shopify collection's title, description, SEO fields or product sort order. Rule sets, images, handles and channel publication are not offered by this tool. Only sort_order=MANUAL preserves a hand-set product order.
shopify_update_customerWRITEDESTRUCTIVE — overwrite a real person's name, email address, phone number or note. The previous value is gone and Agentic Fabriq never saw it, which is what makes this destructive rather than merely a write. Changing an email address also changes where that person's order confirmations go. The bounded case is real and common: correcting a misspelled address on an order that has not shipped.
shopify_update_customer_addressWRITEDESTRUCTIVE -- overwrite fields on one of a Shopify customer's addresses. There is no revert -- read the current values with shopify_list_customer_addresses first. Omitted fields are left alone; unrecognised keys are refused.
shopify_update_delivery_customizationWRITEChange a delivery customisation. It cannot switch one on.
shopify_update_delivery_profileWRITEDESTRUCTIVE. Change a profile's rates, zones or membership.
shopify_update_discount_codeWRITEDESTRUCTIVE - Change a live percentage discount code. IT REPRICES A LIVE CODE. The missing half of shopify_create_discount_code: before this, a code with the wrong percentage or the wrong end date could only be deleted and recreated, which loses its usage history and strands whoever already has the old string. ends_at AND usage_limit ARE REQUIRED HERE TOO. Shopify documents null on both as "no expiry" and "unlimited", so an update is how a bounded code becomes an unbounded one. PERCENTAGE ONLY, for the reason creation is percentage only: a fixed cash discount is unbounded against a small basket, and a percentage cannot exceed the value of what is being bought.
shopify_update_draft_orderWRITEChange an unpaid draft order. The line items REPLACE the whole basket rather than patching it, so read the current contents first. Not destructive: the draft is unpaid, so nothing here reaches a customer or the merchant's books.
shopify_update_external_marketing_activityWRITEDESTRUCTIVE - change an existing Shopify external marketing activity. The previous values are not recoverable. Nothing is sent to anybody. Pass EXACTLY ONE of marketing_activity_id or remote_id.
shopify_update_free_shipping_discount_codeWRITEDESTRUCTIVE - Change a live free-shipping code. THE CAP STAYS REQUIRED. maximum_shipping_price, ends_at and usage_limit are all required on update, not only on create. Every one of them is nullable in Shopify's input and every null means "no limit", so an update is the shortest path from a bounded code to an unbounded one. A code that passes through this method leaves it bounded whoever created it. Shoppers already holding the code get the new terms immediately.
shopify_update_gift_cardWRITECorrect a card's note, expiry, owner or template. Never its balance.
shopify_update_inventory_itemWRITEDESTRUCTIVE -- partial update of an inventory item: cost, SKU, tracked, requires_shipping, country and province of origin, HS code and weight. Setting tracked=false discards every stock level for the item.
shopify_update_inventory_shipment_quantitiesWRITEDESTRUCTIVE -- set absolute quantities on up to 100 shipment line items. On an in-transit shipment this changes stock at the origin location.
shopify_update_marketWRITEDESTRUCTIVE - Change a market: countries, currency, tax treatment, what serves it. WHAT MOVES: removing a country from a market sends every shopper in it back to whichever market claims them next - a different currency, a different catalog, possibly a different domain - on their next page load. Setting market_status="DRAFT" does the same for every country in the market at once. Both are reversible by calling this again, which is why it is not flagged destructive, but neither is quiet. makeDuplicateUniqueMarketsDraft is NOT exposed. It sets OTHER markets to draft as a side effect of editing this one, and an argument whose blast radius is a resource the caller did not name has no place on an update. See COVERAGE_ARG_EXCLUSIONS.
shopify_update_menuWRITEDESTRUCTIVE - replace a Shopify navigation menu's title, handle and ENTIRE item tree. Anything you omit is deleted, and the shop's navigation bar changes for every shopper immediately. ALWAYS call shopify_get_menu first and send the complete tree back. Changing the handle detaches the menu from the theme and usually empties the navigation bar.
shopify_update_metafield_definitionWRITEDESTRUCTIVE -- update a metafield definition. Changing validations revalidates every existing value asynchronously; the returned validation job id can be polled with shopify_get_job.
shopify_update_metaobjectWRITEDESTRUCTIVE -- update a metaobject's fields and optionally its handle. Only the keys given are written; omitted keys keep their values.
shopify_update_metaobject_definitionWRITEDESTRUCTIVE -- update a metaobject definition: rename it, change access, append field definitions or delete them by key. Deleting a field key destroys that value on every record of the type.
shopify_update_orderWRITERecord an internal note, a purchase-order reference or tags on an order. Deliberately narrow: it accepts no email address and no shipping address, because those are the shopper's own contact details and belong to the customer actions where the personal-data write is explicit and separately grantable. Nothing here reaches the shopper. Passing tags REPLACES the whole list.
shopify_update_order_edit_discountWRITEChange a discount already staged on an edit. PERCENTAGE ONLY. The correction for "make it 20%, not 10%" without removing the discount and re-adding it, which would lose the description the customer sees. PERCENTAGE ONLY, for the reason shopify_add_order_edit_line_discount gives: fixedValue is a cash figure the agent names with no ceiling, and a share is bounded by the value it applies to. Nothing has moved. The order is unchanged until shopify_commit_order_edit.
shopify_update_order_edit_shipping_lineWRITERelabel a shipping line in an open edit session. TITLE ONLY. OrderEditUpdateShippingLineInput has exactly two fields, title and price, and both are optional. ONLY THE TITLE IS EXPOSED. The price is an agent-named figure a real person is then charged, with no cap parameter anywhere in the input - the same refusal shopify_create_draft_order makes for a custom priced line, and the same one that keeps orderEditAddShippingLine off this connector entirely. Repricing freight on somebody's order is a merchant decision made in the Shopify admin. What is left is genuinely useful: correcting "Standard" to "Standard (signed for)" on a document the customer will read, without touching the amount. Nothing has moved. The order is unchanged until shopify_commit_order_edit.
shopify_update_pageWRITEDESTRUCTIVE - edit a Shopify page and optionally publish or unpublish it. The body REPLACES the previous one. Publishing puts the text in front of the public and unpublishing does not retract what was already crawled or cached. Changing the handle breaks the old URL with no redirect.
shopify_update_productWRITECorrect a product's title, description, vendor, type, tags or SEO fields. Everything it changes is correctable by calling it again, which is why it is not destructive. STATUS IS NOT ONE OF THEM — changing what the catalogue advertises is Set product status, a separate grant. Passing tags REPLACES the whole tag list; Add tags adds one without dropping the others.
shopify_update_product_bundleWRITEDESTRUCTIVE -- update a Shopify product bundle. Passing components REPLACES the existing list -- omitted components are removed and the bundle's stock is recomputed. Omit components to rename only. Asynchronous: poll the returned operation id with shopify_get_product_operation.
shopify_update_product_mediaWRITESet the alt text on a Shopify product image, video or 3D model. Takes the parent product id, the media id from shopify_list_product_media, and the replacement text. Pass an empty string to clear it. No URL argument exists on this tool.
shopify_update_product_optionWRITEDESTRUCTIVE -- update one Shopify product option: rename it, reposition it, add values, rename values, or delete values. variant_strategy LEAVE_AS_IS (default) errors rather than deleting variants; MANAGE deletes every variant that referenced a deleted value, permanently. Check hasVariants on each option value first.
shopify_update_reverse_delivery_shippingWRITEUpdate the tracking number and URL on an existing Shopify reverse delivery. No return label can be attached through this tool by design.
shopify_update_saved_searchWRITERename a saved search or change what it matches.
shopify_update_shop_localeWRITEPublish or unpublish a language, or change where it is served. published=true IS THE MOMENT SHOPPERS SEE IT. Shopify: "Only published locales are visible to the buyer." Publishing a language whose translations are half-written shows shoppers a mixture of two languages, and every untranslated field falls back to the primary one. web_presence_ids REPLACES the set of addresses that serve this language. Shopify's own note on the field: "Pass in an empty array to remove the locale across all market web presences." This connector forwards an explicit empty list as an empty list for exactly that reason, so passing [] is a real instruction, not a no-op.
shopify_update_trackingWRITEDESTRUCTIVE — correct the carrier, tracking number or tracking URL on a fulfilment. A mistyped tracking number was permanent before this, and had very likely already been emailed to the shopper. Destructive for one reason: with notification enabled it sends a SECOND shipping email, which cannot be recalled. It defaults to not notifying, though the case for saying yes is stronger here than usual — the shopper is holding a number that does not work.
shopify_update_url_redirectWRITEDESTRUCTIVE - repoint an existing Shopify URL redirect. Traffic that was going one place starts going another, silently, and the previous target is not recoverable. Read it first with shopify_get_url_redirect.
shopify_update_variantWRITEDESTRUCTIVE — correct one variant's SKU, barcode, tax flag or inventory policy. PRICE IS NOT A PARAMETER: repricing live merchandise is not a decision an agent makes unattended, and this connector never sets a price anywhere. Destructive because a SKU or barcode change reaches the merchant's own warehouse, accounting and channel feeds, and the inventory policy decides whether the store will sell an item it does not have.
shopify_update_web_presenceWRITEDESTRUCTIVE. Change a live storefront's address or its language. WHAT BREAKS: changing subfolder_suffix changes the URL of every page the presence serves. Existing links, bookmarks, ad campaigns and search-engine results that pointed at the old path stop pointing at anything Shopify serves under that name. Changing default_locale changes the language a shopper is shown by default at that address. Neither is a delete, and both are why this is flagged destructive. alternate_locales REPLACES the list rather than adding to it. Read the current value with shopify_list_web_presences and send the whole list back, or the locales you leave out stop being served. This is the SUPERSEDING form of marketWebPresenceUpdate.
shopify_upsert_external_marketing_activityWRITEDESTRUCTIVE - create or replace the Shopify record of a marketing campaign that ran somewhere else. Nothing is sent to anybody; this is bookkeeping so Shopify's analytics can attribute traffic to it. It is an UPSERT keyed on remote_id, so reusing an id overwrites that record's previous values irrecoverably.
shopify_upsert_metaobjectWRITEDESTRUCTIVE -- create or overwrite a metaobject identified by type plus handle. The sync-friendly form: no existence check needed first.
Put Shopify behind one governed endpoint.
Same permissions, same audit trail, whatever else you connect next.