# JsWorkflows Template Catalog Browse production-ready Shopify workflow templates for the JsWorkflows app, including inventory sync, product imports, customer tagging, order operations, notifications, cleanup jobs, and advanced store automation. Canonical URL: https://templates.jsworkflows.com/ ## Categories - [B2B](https://templates.jsworkflows.com/categories/b2b/): Templates for capturing business buyer details, enriching order data, and supporting B2B operational workflows. - [Customers](https://templates.jsworkflows.com/categories/customers/): Templates for customer tagging, lifecycle cleanup, reminders, and customer-level automation. - [Fulfillment](https://templates.jsworkflows.com/categories/fulfillment/): Templates for fulfillment review, delayed follow-up, holds, and operational exception handling. - [Inventory and merch](https://templates.jsworkflows.com/categories/inventory-and-merch/): Templates for inventory sync, product imports, catalog maintenance, stock visibility, and merchandising operations. - [Notifications](https://templates.jsworkflows.com/categories/notifications/): Templates that send alerts, summaries, and operational updates to Slack, email, or other connected services. - [Orders](https://templates.jsworkflows.com/categories/orders/): Templates for order tagging, reporting, cleanup, note updates, and order-operation workflows. - [Promotions](https://templates.jsworkflows.com/categories/promotions/): Templates for promotion logic, order edits, gifts, and customer-facing offer workflows. - [Risk](https://templates.jsworkflows.com/categories/risk/): Templates for review queues, return-abuse detection, fraud signals, and operational risk controls. ## Templates - [Add free gift over order threshold](https://templates.jsworkflows.com/templates/add-free-gift-over-300/) - Promotions, Order paid. Adds a configured free-gift variant to paid orders above a threshold using Shopify order edits. - [Advanced return abuse detection](https://templates.jsworkflows.com/templates/advanced-return-abuse-detection/) - Risk, Returns approve. Tracks processed returns in a rolling window and tags customers who cross configurable abuse thresholds. - [Capture order company name to metafield](https://templates.jsworkflows.com/templates/capture-order-company-name-to-metafield/) - B2B, Order created. Copies the company name from order addresses into an order metafield at creation time. - [Daily sales summary → Slack](https://templates.jsworkflows.com/templates/daily-sales-summary-to-slack/) - Notifications, Daily schedule. Posts a daily paid-orders count and revenue summary to a Slack channel on a recurring schedule. - [Delete inactive customers older than N years](https://templates.jsworkflows.com/templates/delete-inactive-customers-older-than-5-years-monthly/) - Customers, Monthly schedule. Runs monthly, finds customers older than a configurable age with no orders, and deletes them only when deletion is explicitly enabled. - [Delete stale draft orders after N days](https://templates.jsworkflows.com/templates/delete-stale-draft-orders-after-30-days/) - Orders, Draft order created. Deletes draft orders that still exist after a configurable waiting period. - [Flag unfulfilled orders after N days](https://templates.jsworkflows.com/templates/flag-unfulfilled-orders/) - Fulfillment, Order created. Checks paid orders after a set number of days and tags any that are still unfulfilled for review. - [Import products from CSV URL](https://templates.jsworkflows.com/templates/import-products-from-csv-url/) - Inventory and merch, Daily schedule. Imports or updates products, variants, images, and multi-location inventory from a public CSV URL with optional publication targeting. - [Import products from Google Sheets](https://templates.jsworkflows.com/templates/import-products-from-google-sheets/) - Inventory and merch, Daily schedule. Imports or updates products, variants, metafields, and multi-location inventory from a Google Sheet with row-level error reporting. - [New order → Google Sheets](https://templates.jsworkflows.com/templates/new-order-to-google-sheets/) - Orders, Order created. Appends a new row to a Google Sheet every time an order is placed. - [Notify customers of expiring gift cards](https://templates.jsworkflows.com/templates/notify-expiring-gift-cards/) - Customers, Daily schedule. Runs daily, finds all enabled gift cards expiring within a set number of days, and sends each customer a reminder email via SendGrid. - [Request or hold ready fulfillment orders](https://templates.jsworkflows.com/templates/request-or-hold-ready-fulfillment-orders/) - Fulfillment, Scheduled fulfillment order ready. Requests fulfillment for eligible ready fulfillment orders and places the rest on hold with a reason note. - [Slack low inventory alert](https://templates.jsworkflows.com/templates/slack-low-inventory-alert/) - Notifications, Inventory level updated. Posts a Slack alert when inventory for an updated item drops below a configured threshold. - [Sync inventory from CSV URL](https://templates.jsworkflows.com/templates/sync-inventory-from-csv-url/) - Inventory and merch, Daily schedule. Updates Shopify inventory from a CSV URL using Variant SKU or Handle matching, with optional product-level auto publish and auto unpublish rules. - [Sync inventory from email CSV](https://templates.jsworkflows.com/templates/sync-inventory-from-email-csv/) - Inventory and merch, Inbound email. Updates Shopify inventory from a CSV attachment sent to the workflow email address, with optional product-level auto publish and auto unpublish rules. - [Sync inventory from Google Sheets](https://templates.jsworkflows.com/templates/sync-inventory-from-google-sheets/) - Inventory and merch, Daily schedule. Updates Shopify inventory from Google Sheets using Variant SKU or Handle matching, with optional product-level auto publish and auto unpublish rules. - [Sync inventory from Google Sheets (OAuth)](https://templates.jsworkflows.com/templates/sync-inventory-from-google-sheets-oauth/) - Inventory and merch, Daily schedule. Updates Shopify inventory from a Google Sheet selected through a Google OAuth connection, with optional product-level auto publish and auto unpublish rules. - [Tag customer after N orders](https://templates.jsworkflows.com/templates/tag-customer-after-n-orders/) - Customers, Order created. Automatically adds a tag to a customer when they reach a specified number of orders. - [Tag EDU customers on signup](https://templates.jsworkflows.com/templates/tag-edu-customers-on-signup/) - Customers, Customer created. Tags new customers whose email ends in .edu. - [Tag high-intent first-time customers on fulfillment](https://templates.jsworkflows.com/templates/tag-high-intent-first-time-customers-on-fulfillment/) - Customers, Order fulfilled. Tags first-time customers who converted quickly and appends a customer note when their order is fulfilled. - [Tag low-stock products](https://templates.jsworkflows.com/templates/tag-low-stock-products/) - Inventory and merch, Daily schedule. Runs daily and adds a 'low-stock' tag to any product with inventory below a threshold. Removes the tag when the product is restocked. - [Tag new orders by payment gateway](https://templates.jsworkflows.com/templates/tag-new-orders-by-payment-gateway/) - Orders, Order created. Adds one or more payment-gateway tags to each new order based on the gateway names in the webhook payload. - [Tag new products and remove after N days](https://templates.jsworkflows.com/templates/tag-new-products-remove-new-arrival-30-days/) - Inventory and merch, Product created. Adds a configurable tag to new products and removes it again after a configurable number of days. - [Tag orders by shipping method](https://templates.jsworkflows.com/templates/tag-orders-by-shipping-method/) - Orders, Order paid. Adds an order tag derived from the order’s first shipping method. - [Update order note with customer total orders](https://templates.jsworkflows.com/templates/update-order-note-customer-total-orders/) - Orders, Order paid. Looks up a customer’s total Shopify order count and writes it into the paid order note. --- # Add free gift over order threshold Adds a configured free-gift variant to paid orders above a threshold using Shopify order edits. Canonical URL: https://templates.jsworkflows.com/templates/add-free-gift-over-300/ ## When to use this template This template is built for Shopify stores using the JsWorkflows app. Use this template when you want a ready-made workflow for this use case: Adds a configured free-gift variant to paid orders above a threshold using Shopify order edits. It is designed for Shopify promotion workflows and gives you a production-ready starting point instead of building the automation from scratch. This workflow uses the Shopify webhook trigger model and starts from the "Order paid" trigger. It includes setup fields for merchant-facing values, so you can configure the workflow before installing it. ## Metadata - Category: Promotions - Trigger: Order paid - Workflow type: Shopify webhook - Complexity: advanced - Usage class: growth-friendly ## Connected services - None ## Additional Shopify scopes - read_order_edits - read_orders - write_order_edits ## Setup fields - Order total threshold (`ORDER_TOTAL_THRESHOLD`) - Type: number - Storage: config - Required: yes - Description: Minimum paid order total in shop currency required before the gift is added. - Free gift variant ID (`FREE_GIFT_VARIANT_ID`) - Type: text - Storage: config - Required: yes - Description: Shopify product variant GID to add as the free gift. - Gift quantity (`FREE_GIFT_QUANTITY`) - Type: number - Storage: config - Required: yes - Description: How many units of the free gift variant to add. - Notify customer on edit (`NOTIFY_CUSTOMER_ON_EDIT`) - Type: checkbox - Storage: config - Required: yes - Description: If enabled, Shopify sends the customer an order update email after the order edit is committed. ## Setup guide ## Before you start This template watches paid orders and uses Shopify order edits to add a configured free gift when the order total exceeds your threshold. ## Configure in setup - `Order total threshold`: minimum paid order total required before the free gift is added - `Free gift variant ID`: Shopify product variant GID for the free gift item - `Gift quantity`: how many free units to add - `Notify customer on edit`: whether Shopify should email the customer about the order edit ## Notes - The template skips orders that already contain the configured gift variant - Shopify must allow order edits for the order when the workflow runs - The free gift is discounted to 100% using the order edit API --- # Advanced return abuse detection Tracks processed returns in a rolling window and tags customers who cross configurable abuse thresholds. Canonical URL: https://templates.jsworkflows.com/templates/advanced-return-abuse-detection/ ## When to use this template This template is built for Shopify stores using the JsWorkflows app. Use this template when you want a ready-made workflow for this use case: Tracks processed returns in a rolling window and tags customers who cross configurable abuse thresholds. It is designed for Shopify risk review workflows and gives you a production-ready starting point instead of building the automation from scratch. This workflow uses the Shopify webhook trigger model and starts from the "Returns approve" trigger. It includes setup fields for merchant-facing values, so you can configure the workflow before installing it. ## Metadata - Category: Risk - Trigger: Returns approve - Workflow type: Shopify webhook - Complexity: advanced - Usage class: growth-friendly ## Connected services - None ## Additional Shopify scopes - read_returns ## Setup fields - Return count threshold (`RETURN_COUNT_THRESHOLD`) - Type: number - Storage: config - Required: yes - Description: Number of approved returns inside the rolling window required before the customer is flagged. - Return value threshold (`RETURN_VALUE_THRESHOLD`) - Type: number - Storage: config - Required: yes - Description: Total approved returned value in shop currency required before the customer is flagged. - Rolling window days (`ROLLING_WINDOW_DAYS`) - Type: number - Storage: config - Required: yes - Description: How many days of approved return history are kept for threshold evaluation. - Customer risk tag (`CUSTOMER_RISK_TAG`) - Type: text - Storage: config - Required: yes - Description: Customer tag applied when the configured thresholds are crossed. - Order risk tag (`ORDER_RISK_TAG`) - Type: text - Storage: config - Required: no - Description: Optional order tag applied to the triggering order when thresholds are crossed. Leave blank to disable order tagging. - Metafield namespace (`METAFIELD_NAMESPACE`) - Type: text - Storage: config - Required: yes - Description: Namespace used for the customer metafield that stores the rolling return history JSON. - Metafield key (`METAFIELD_KEY`) - Type: text - Storage: config - Required: yes - Description: Metafield key used for the customer state JSON. ## Setup guide ## Before you start This template watches approved returns and keeps a rolling abuse history on each customer. ## How it works - Trigger: `returns/approve` - Each approved return is added to a rolling history stored in a customer metafield - The workflow totals return count and returned value over the configured window - If both thresholds are crossed, it tags the customer and can optionally tag the triggering order - Compare-digest metafield writes are used so concurrent return approvals do not overwrite each other ## Configure in setup - `Return count threshold`: number of approved returns required inside the rolling window - `Return value threshold`: total approved returned value required inside the rolling window - `Rolling window days`: how many days of return history to keep - `Customer risk tag`: customer tag applied when thresholds are crossed - `Order risk tag`: optional order tag applied to the triggering order; leave blank to disable - `Metafield namespace` and `Metafield key`: where the compact JSON history is stored on the customer ## Notes - This template is intended for operational review and risk flagging, not automatic enforcement - The stored state lives on the customer, so the history moves with the customer record inside Shopify --- # Capture order company name to metafield Copies the company name from order addresses into an order metafield at creation time. Canonical URL: https://templates.jsworkflows.com/templates/capture-order-company-name-to-metafield/ ## When to use this template This template is built for Shopify stores using the JsWorkflows app. Use this template when you want a ready-made workflow for this use case: Copies the company name from order addresses into an order metafield at creation time. It is designed for Shopify B2B operations and gives you a production-ready starting point instead of building the automation from scratch. This workflow uses the Shopify webhook trigger model and starts from the "Order created" trigger. It includes setup fields for merchant-facing values, so you can configure the workflow before installing it. ## Metadata - Category: B2B - Trigger: Order created - Workflow type: Shopify webhook - Complexity: easy - Usage class: starter-friendly ## Connected services - None ## Additional Shopify scopes - write_orders ## Setup fields - Metafield namespace (`ORDER_METAFIELD_NAMESPACE`) - Type: text - Storage: config - Required: yes - Description: Namespace for the order metafield that will store the company name. - Metafield key (`ORDER_METAFIELD_KEY`) - Type: text - Storage: config - Required: yes - Description: Key for the order metafield that will store the company name. - Metafield type (`ORDER_METAFIELD_TYPE`) - Type: text - Storage: config - Required: yes - Description: Metafield type used when writing the company name. ## Setup guide ## Before you start This template writes the company name found on a new order into an order metafield. It uses the shipping company when available and falls back to the billing company. ## Configure in setup - `Metafield namespace`: namespace to write on the order - `Metafield key`: key to write on the order - `Metafield type`: metafield type, usually `single_line_text_field` ## Notes - Orders with no company name in either address are skipped - The workflow writes directly to the order metafield using Shopify GraphQL --- # Daily sales summary → Slack Posts a daily paid-orders count and revenue summary to a Slack channel on a recurring schedule. Canonical URL: https://templates.jsworkflows.com/templates/daily-sales-summary-to-slack/ ## When to use this template This template is built for Shopify stores using the JsWorkflows app. Use this template when you want a ready-made workflow for this use case: Posts a daily paid-orders count and revenue summary to a Slack channel on a recurring schedule. It is designed for Shopify notification workflows and gives you a production-ready starting point instead of building the automation from scratch. It can work with Slack as part of the workflow. This workflow uses the scheduled trigger model and starts from the "Daily schedule" trigger. It includes setup fields for merchant-facing values, so you can configure the workflow before installing it. ## Metadata - Category: Notifications - Trigger: Daily schedule - Workflow type: Scheduled - Complexity: medium - Usage class: starter-friendly ## Connected services - slack ## Additional Shopify scopes - read_orders ## Setup fields - Slack OAuth handle (`OAUTH_HANDLE`) - Type: text - Storage: config - Required: yes - Description: OAuth handle for the Slack connection used to post the summary message. - Slack channel ID (`SLACK_CHANNEL`) - Type: text - Storage: config - Required: yes - Description: Target Slack channel ID to post the summary into, for example C12345678. - Report window hours (`REPORT_WINDOW_HOURS`) - Type: number - Storage: config - Required: yes - Description: How many trailing hours of paid orders each run should summarize. ## Setup guide ## Before you start This template runs on a schedule and posts a paid-orders summary into Slack using a saved Slack OAuth connector. ## How it works - It looks back over the configured reporting window - It loads all paid orders created during that period - It totals order count and revenue in shop currency - It posts a single summary message to the target Slack channel ## Configure in setup - `Slack OAuth handle`: connector handle for the Slack connection used to post the message - `Slack channel ID`: target Slack channel ID, for example `C12345678` - `Report window hours`: how many hours of order activity each run should summarize ## Notes - Use a private channel only if the Slack app has already been invited to that channel - Set your preferred schedule start time and timezone when saving --- # Delete inactive customers older than N years Runs monthly, finds customers older than a configurable age with no orders, and deletes them only when deletion is explicitly enabled. Canonical URL: https://templates.jsworkflows.com/templates/delete-inactive-customers-older-than-5-years-monthly/ ## When to use this template This template is built for Shopify stores using the JsWorkflows app. Use this template when you want a ready-made workflow for this use case: Runs monthly, finds customers older than a configurable age with no orders, and deletes them only when deletion is explicitly enabled. It is designed for Shopify customer operations and gives you a production-ready starting point instead of building the automation from scratch. This workflow uses the scheduled trigger model and starts from the "Monthly schedule" trigger. It includes setup fields for merchant-facing values, so you can configure the workflow before installing it. ## Metadata - Category: Customers - Trigger: Monthly schedule - Workflow type: Scheduled - Complexity: advanced - Usage class: growth-friendly ## Connected services - None ## Additional Shopify scopes - None ## Setup fields - Customer age in years (`CUSTOMER_AGE_YEARS`) - Type: number - Storage: config - Required: yes - Description: Delete only customers created more than this many years ago. - Maximum customers per run (`MAX_CUSTOMERS_PER_RUN`) - Type: number - Storage: config - Required: yes - Description: Safety cap for how many eligible customers this workflow can process in one monthly run. - Delete enabled (`DELETE_ENABLED`) - Type: checkbox - Storage: config - Required: yes - Description: When off, the workflow only logs customers that would be deleted. Turn on after reviewing a dry run. ## Setup guide ## Before you start This template is destructive when `Delete enabled` is turned on. Run it once with deletion disabled and review the logs before enabling deletion. ## How it works - Trigger: monthly scheduled workflow - Searches customers using `orders_count:0` and `customer_date` - Processes customers page by page - Rechecks each customer before deletion using their current `createdAt`, `numberOfOrders`, and `canDelete` values - Deletes only customers that still match the criteria and are deletable ## Configure in setup - `Customer age in years`: minimum customer account age before deletion - `Maximum customers per run`: safety cap for one monthly run - `Delete enabled`: off means dry-run logging only; on performs deletion ## Notes - No extra Shopify scopes are requested by this template because customer write access is already part of the app's default install scopes. - If a customer has placed an order, Shopify will not allow deletion and this workflow also skips them before attempting deletion. --- # Delete stale draft orders after N days Deletes draft orders that still exist after a configurable waiting period. Canonical URL: https://templates.jsworkflows.com/templates/delete-stale-draft-orders-after-30-days/ ## When to use this template This template is built for Shopify stores using the JsWorkflows app. Use this template when you want a ready-made workflow for this use case: Deletes draft orders that still exist after a configurable waiting period. It is designed for Shopify order operations and gives you a production-ready starting point instead of building the automation from scratch. This workflow uses the Shopify webhook trigger model and starts from the "Draft order created" trigger. It includes setup fields for merchant-facing values, so you can configure the workflow before installing it. ## Metadata - Category: Orders - Trigger: Draft order created - Workflow type: Shopify webhook - Complexity: medium - Usage class: starter-friendly ## Connected services - None ## Additional Shopify scopes - read_draft_orders - write_draft_orders ## Setup fields - Delete after days (`DELETE_AFTER_DAYS`) - Type: number - Storage: config - Required: yes - Description: How many days to wait before re-checking and deleting the draft order if it still exists. ## Setup guide ## Before you start This template watches new draft orders and deletes them after a configurable delay if they still exist. ## Configure in setup - `Delete after days`: how long to wait before checking and deleting the draft order ## Notes - If the draft order has already been deleted or converted, the workflow does nothing - The delay is scheduled at workflow runtime, so changing the setting only affects future draft orders --- # Flag unfulfilled orders after N days Checks paid orders after a set number of days and tags any that are still unfulfilled for review. Canonical URL: https://templates.jsworkflows.com/templates/flag-unfulfilled-orders/ ## When to use this template This template is built for Shopify stores using the JsWorkflows app. Use this template when you want a ready-made workflow for this use case: Checks paid orders after a set number of days and tags any that are still unfulfilled for review. It is designed for Shopify fulfillment operations and gives you a production-ready starting point instead of building the automation from scratch. This workflow uses the Shopify webhook trigger model and starts from the "Order created" trigger. It includes setup fields for merchant-facing values, so you can configure the workflow before installing it. ## Metadata - Category: Fulfillment - Trigger: Order created - Workflow type: Shopify webhook - Complexity: easy - Usage class: starter-friendly ## Connected services - None ## Additional Shopify scopes - None ## Setup fields - Days before review (`DAYS_BEFORE_REVIEW`) - Type: number - Storage: config - Required: yes - Description: How many days to wait after order creation before checking payment and fulfillment status. - Review tag (`UNFULFILLED_TAG`) - Type: text - Storage: config - Required: yes - Description: Exact Shopify order tag to add when a paid order is still unfulfilled at review time. ## Setup guide ## Before you start This template schedules a follow-up check for each new order. After the configured number of days, it checks whether the order is paid and still unfulfilled, then adds a review tag if needed. ## How it works - Trigger: `orders/create` - Each order schedules a delayed review step - At review time, the workflow loads the latest financial and fulfillment status from Shopify - Paid but still unfulfilled orders get the configured tag - Orders that are unpaid, fulfilled, or already tagged are skipped ## Configure in setup - `Days before review`: how many days to wait before checking fulfillment status - `Review tag`: exact order tag to add when a paid order is still unfulfilled ## Notes - This template is useful for manual review queues, operational alerts, or follow-up reporting - Because the check happens later, it handles orders that become paid after the original order-created webhook --- # Import products from CSV URL Imports or updates products, variants, images, and multi-location inventory from a public CSV URL with optional publication targeting. Canonical URL: https://templates.jsworkflows.com/templates/import-products-from-csv-url/ ## When to use this template This template is built for Shopify stores using the JsWorkflows app. Use this template when you want a ready-made workflow for this use case: Imports or updates products, variants, images, and multi-location inventory from a public CSV URL with optional publication targeting. It is designed for Shopify inventory and merchandising operations and gives you a production-ready starting point instead of building the automation from scratch. This workflow uses the scheduled trigger model and starts from the "Daily schedule" trigger. It includes setup fields for merchant-facing values, so you can configure the workflow before installing it. ## Metadata - Category: Inventory and merch - Trigger: Daily schedule - Workflow type: Scheduled - Complexity: advanced - Usage class: heavy-operation ## Connected services - None ## Additional Shopify scopes - read_products - write_products - read_locations - read_inventory - read_publications - write_publications - write_inventory ## Setup fields - CSV URL (`CSV_URL`) - Type: text - Storage: config - Required: yes - Description: CSV URL, pre-signed download URL, or Google Sheets share URL. Google Sheets links are converted to the CSV export URL automatically. - Publish to channels (`PUBLICATION_IDS`) - Type: shopify_publication_multiselect - Storage: config - Required: no - Description: Optional Shopify sales channels to publish ACTIVE products to after a successful sync. ## Setup guide ## Before you start This template reads a CSV URL and uses Shopify `productSet` to create or update products by **Handle**. ## Source requirements - The URL must ultimately return raw CSV data - Google Sheets share/edit URLs are accepted and automatically converted to the CSV export URL - The CSV may be public or use a pre-signed URL - Authenticated pages, login redirects, or HTML landing pages will not work - Rows for the same `Handle` must stay **contiguous** in the CSV ## Supported data - product title, description, vendor, product type, tags, status, gift card flag - category IDs and variant-level tax/origin fields - variants and option values - product and variant metafields - product images from `Image Src` - variant-specific images from `Variant Image` - multi-location inventory through `Inventory: Location Name` columns - optional publishing to selected Shopify sales channels ## Required headers - `Handle` - `Title` - `Variant SKU` ## Common optional headers - `Body HTML` - `Vendor` - `Product Type` - `Tags` - `Status` - `Gift Card` - `Category: ID` - `Image Src` - `Image Alt Text` - `Variant Price` - `Variant Compare At Price` - `Variant Barcode` - `Variant Image` - `Variant Position` - `Variant Taxable` - `Variant Tax Code` - `Variant Inventory Policy` - `Variant Cost` - `Variant Weight` - `Variant Weight Unit` - `Variant Grams` - `Variant Requires Shipping` - `Variant Tracked` - `Variant HS Code` - `Variant Country of Origin` - `Variant Province of Origin` ## Variant options Use option columns when a product has multiple variants: - `Option1 Name` / `Option1 Value` - `Option2 Name` / `Option2 Value` - `Option3 Name` / `Option3 Value` For the same `Handle`, option names and product-level fields must stay internally consistent across all rows. ## Dynamic headers You can add these dynamic columns: - `Product Metafield: namespace.key|type` - `Variant Metafield: namespace.key|type` - `Inventory: Shopify Location Name` Examples: - `Product Metafield: custom.material|single_line_text_field` - `Variant Metafield: specs.origin_country|single_line_text_field` - `Inventory: Sydney Warehouse` ## Additional supported fields - `Category: ID` must be a valid Shopify taxonomy category ID - `Image Alt Text` is applied to each image URL listed on that row - `Variant Image` attaches an image URL to a specific variant and also includes it in the product file list - `Variant Weight` should be paired with `Variant Weight Unit` (`g`, `kg`, `oz`, or `lb`) - `Variant Grams` still works and is used as a fallback when `Variant Weight` is not provided ## Publishing behavior If you select one or more Shopify sales channels during setup, ACTIVE products are published to those destinations after a successful sync. The setup UI loads the shop's live publications and stores their publication IDs, so the workflow publishes by Shopify publication ID instead of typed names. ## Error handling Validation failures, publish errors, inventory lookup errors, and metafield write errors are written to the workflow logs with row numbers and handles. ## Sample file - [Download sample CSV](https://sample.jsworkflows.com/sample-import-products.csv) Execution pacing is determined automatically based on CSV size, inventory columns, and publishing settings. --- # Import products from Google Sheets Imports or updates products, variants, metafields, and multi-location inventory from a Google Sheet with row-level error reporting. Canonical URL: https://templates.jsworkflows.com/templates/import-products-from-google-sheets/ ## When to use this template This template is built for Shopify stores using the JsWorkflows app. Use this template when you want a ready-made workflow for this use case: Imports or updates products, variants, metafields, and multi-location inventory from a Google Sheet with row-level error reporting. It is designed for Shopify inventory and merchandising operations and gives you a production-ready starting point instead of building the automation from scratch. It can work with Google as part of the workflow. This workflow uses the scheduled trigger model and starts from the "Daily schedule" trigger. It includes setup fields for merchant-facing values, so you can configure the workflow before installing it. ## Metadata - Category: Inventory and merch - Trigger: Daily schedule - Workflow type: Scheduled - Complexity: advanced - Usage class: heavy-operation ## Connected services - google ## Additional Shopify scopes - read_products - write_products - read_locations - read_inventory - read_publications - write_publications - write_inventory ## Setup fields - Spreadsheet ID (`SPREADSHEET_ID`) - Type: text - Storage: config - Required: yes - Description: The Google Sheet ID that contains the product import tab. - Source sheet name (`SHEET_NAME`) - Type: text - Storage: config - Required: yes - Description: The tab name to read product rows from. - Report sheet name (`REPORT_SHEET_NAME`) - Type: text - Storage: config - Required: no - Description: Optional tab used for row-level error reporting. Leave blank to disable report logging. - Products per batch (`PRODUCTS_PER_BATCH`) - Type: number - Storage: config - Required: yes - Description: How many product jobs are grouped into each orchestration batch. - Batch stagger seconds (`BATCH_STAGGER_SECONDS`) - Type: number - Storage: config - Required: yes - Description: Delay between orchestration batches. Increase this if you see heavy throttling. - Product stagger seconds (`PRODUCT_STAGGER_SECONDS`) - Type: number - Storage: config - Required: yes - Description: Delay between product syncs within a batch. - Publish to channels (`PUBLICATION_IDS`) - Type: shopify_publication_multiselect - Storage: config - Required: no - Description: Optional Shopify sales channels to publish ACTIVE products to after a successful sync. - Google client email (`GOOGLE_CLIENT_EMAIL`) - Type: text - Storage: env - Required: yes - Description: The Google service account client email used to access Sheets. - Google private key (`GOOGLE_PRIVATE_KEY`) - Type: textarea - Storage: env - Required: yes - Description: The full Google service account private key in PEM format, including the BEGIN/END lines. This is saved as an encrypted workflow variable after the workflow is created. ## Setup guide ## Before you start This template reads a Google Sheet and uses Shopify `productSet` to create or update products by **Handle**. Use this template when you want a sheet-driven product import with support for: - full variant sync per product - category IDs and variant-level tax/origin fields - product and variant metafields - product and variant images - multi-location inventory updates - optional auto-publishing to Shopify publications - row-level error reporting to a report sheet Sample file: - [Download sample CSV](https://sample.jsworkflows.com/sample-import-products.csv) ## Sheet model - One row = one variant - Rows are grouped by `Handle` - Header names matter; column order does not - The sheet is authoritative for the variant list of each product If a product has three desired variants, all three variants must be present in the sheet for that `Handle`. ## Required headers - `Handle` - `Title` - `Variant SKU` ## Common optional headers - `Body HTML` - `Vendor` - `Product Type` - `Tags` - `Status` - `Gift Card` - `Category: ID` - `Image Src` - `Image Alt Text` - `Variant Price` - `Variant Compare At Price` - `Variant Barcode` - `Variant Image` - `Variant Position` - `Variant Taxable` - `Variant Tax Code` - `Variant Inventory Policy` - `Variant Cost` - `Variant Weight` - `Variant Weight Unit` - `Variant Grams` - `Variant Requires Shipping` - `Variant Tracked` - `Variant HS Code` - `Variant Country of Origin` - `Variant Province of Origin` ## Variant options Use option columns when a product has multiple variants: - `Option1 Name` / `Option1 Value` - `Option2 Name` / `Option2 Value` - `Option3 Name` / `Option3 Value` For the same `Handle`, option names and product-level fields must stay internally consistent across all rows. ## Dynamic headers You can add these dynamic columns: - `Product Metafield: namespace.key|type` - `Variant Metafield: namespace.key|type` - `Inventory: Shopify Location Name` Examples: - `Product Metafield: custom.material|single_line_text_field` - `Variant Metafield: specs.origin_country|single_line_text_field` - `Inventory: Sydney Warehouse` ## Additional supported fields - `Category: ID` must be a valid Shopify taxonomy category ID - `Image Alt Text` is applied to each image URL listed on that row - `Variant Image` attaches an image URL to a specific variant and also includes it in the product file list - `Variant Weight` should be paired with `Variant Weight Unit` (`g`, `kg`, `oz`, or `lb`) - `Variant Grams` still works and is used as a fallback when `Variant Weight` is not provided ## Publishing behavior If you select one or more Shopify sales channels during setup, ACTIVE products are published to those destinations after a successful sync. The setup UI loads the shop's live publications and stores their publication IDs, so the workflow publishes by Shopify publication ID instead of typed names. ## Error reporting If `Report sheet name` is set, the template appends row-level failures to that tab. Create the report tab before running the template. Leave the field blank to disable report logging. ## Google credentials The template setup form saves these as workflow secrets: - `GOOGLE_CLIENT_EMAIL` - `GOOGLE_PRIVATE_KEY` Paste the full PEM private key including the `BEGIN` and `END` lines. ## Operational notes - `productSet` replaces the variant list for each Handle - Inventory columns must match Shopify location names exactly, or be a unique case-insensitive match - This template updates only fields represented in the sheet; it does not clear unrelated scalar product fields - Increase pacing delays if you see throttling on large catalogs --- # New order → Google Sheets Appends a new row to a Google Sheet every time an order is placed. Canonical URL: https://templates.jsworkflows.com/templates/new-order-to-google-sheets/ ## When to use this template This template is built for Shopify stores using the JsWorkflows app. Use this template when you want a ready-made workflow for this use case: Appends a new row to a Google Sheet every time an order is placed. It is designed for Shopify order operations and gives you a production-ready starting point instead of building the automation from scratch. It can work with Google as part of the workflow. This workflow uses the Shopify webhook trigger model and starts from the "Order created" trigger. It includes setup fields for merchant-facing values, so you can configure the workflow before installing it. ## Metadata - Category: Orders - Trigger: Order created - Workflow type: Shopify webhook - Complexity: easy - Usage class: starter-friendly ## Connected services - google ## Additional Shopify scopes - read_orders ## Setup fields - Google OAuth handle (`OAUTH_HANDLE`) - Type: text - Storage: config - Required: yes - Description: OAuth handle for the Google connection that can access the selected spreadsheet. - Spreadsheet ID (`SPREADSHEET_ID`) - Type: google_drive_file_picker - Storage: config - Required: yes - Description: Select the Google Sheet with the picker or paste an already-accessible spreadsheet ID. - Sheet name (`SHEET_NAME`) - Type: text - Storage: config - Required: yes - Description: Tab name inside the spreadsheet where rows are appended. ## Setup guide ## Before you start This template appends one row to Google Sheets for every new Shopify order using a saved Google OAuth connector. ## Sheet columns written The workflow appends these columns in order: - Order ID - Order Name - Email - Total Price - Currency - Financial Status - Created At ## Configure in setup - `Google OAuth handle`: connector handle for the Google account used to access the spreadsheet - `Spreadsheet ID`: use the Google picker or paste an already-accessible spreadsheet ID - `Sheet name`: target tab name inside the spreadsheet ## Notes - The connected Google account must already have access to the spreadsheet - The destination tab must already exist - Duplicate webhook deliveries for the same order are deduplicated automatically --- # Notify customers of expiring gift cards Runs daily, finds all enabled gift cards expiring within a set number of days, and sends each customer a reminder email via SendGrid. Canonical URL: https://templates.jsworkflows.com/templates/notify-expiring-gift-cards/ ## When to use this template This template is built for Shopify stores using the JsWorkflows app. Use this template when you want a ready-made workflow for this use case: Runs daily, finds all enabled gift cards expiring within a set number of days, and sends each customer a reminder email via SendGrid. It is designed for Shopify customer operations and gives you a production-ready starting point instead of building the automation from scratch. It can work with SendGrid as part of the workflow. This workflow uses the scheduled trigger model and starts from the "Daily schedule" trigger. It includes setup fields for merchant-facing values, so you can configure the workflow before installing it. ## Metadata - Category: Customers - Trigger: Daily schedule - Workflow type: Scheduled - Complexity: medium - Usage class: starter-friendly ## Connected services - sendgrid ## Additional Shopify scopes - read_gift_cards ## Setup fields - Days before expiry (`DAYS_BEFORE_EXPIRY`) - Type: number - Storage: config - Required: yes - Description: How many days before the expiry date the reminder email should be sent. - From name (`SENDGRID_FROM_NAME`) - Type: text - Storage: env - Required: yes - Description: Sender display name shown in the reminder email. - From email (`SENDGRID_FROM_EMAIL`) - Type: text - Storage: env - Required: yes - Description: Verified SendGrid sender email address used in the reminder email. - SendGrid API key (`SENDGRID_API_KEY`) - Type: textarea - Storage: env - Required: yes - Description: SendGrid API key used to send the gift card reminder emails. ## Setup guide ## Before you start This template runs daily and sends gift card expiry reminders through SendGrid. ## How it works - It calculates one exact reminder date based on the configured number of days before expiry - It finds enabled gift cards expiring on that date - It schedules one reminder email per gift card customer - Gift cards without a customer or customer email are skipped ## Configure in setup - `Days before expiry`: how many days ahead of the expiry date the reminder should be sent - `SendGrid API key`: API key used to send the emails - `From email`: verified SendGrid sender email address - `From name`: sender display name shown in the message ## Notes - This template is best scheduled to run once per day - The reminder is based on the workflow run date and the gift card expiry date returned by Shopify --- # Request or hold ready fulfillment orders Requests fulfillment for eligible ready fulfillment orders and places the rest on hold with a reason note. Canonical URL: https://templates.jsworkflows.com/templates/request-or-hold-ready-fulfillment-orders/ ## When to use this template This template is built for Shopify stores using the JsWorkflows app. Use this template when you want a ready-made workflow for this use case: Requests fulfillment for eligible ready fulfillment orders and places the rest on hold with a reason note. It is designed for Shopify fulfillment operations and gives you a production-ready starting point instead of building the automation from scratch. This workflow uses the Shopify webhook trigger model and starts from the "Scheduled fulfillment order ready" trigger. It includes setup fields for merchant-facing values, so you can configure the workflow before installing it. ## Metadata - Category: Fulfillment - Trigger: Scheduled fulfillment order ready - Workflow type: Shopify webhook - Complexity: advanced - Usage class: growth-friendly ## Connected services - None ## Additional Shopify scopes - read_assigned_fulfillment_orders - read_merchant_managed_fulfillment_orders - read_third_party_fulfillment_orders - read_inventory - read_locations - read_markets_home - read_orders - write_merchant_managed_fulfillment_orders - write_third_party_fulfillment_orders ## Setup fields - Target fulfillment location name (`TARGET_FULFILLMENT_LOCATION_NAME`) - Type: text - Storage: config - Required: yes - Description: Only fulfillment orders assigned to this exact location name are auto-requested. - Hold note prefix (`HOLD_NOTE_PREFIX`) - Type: text - Storage: config - Required: yes - Description: Prefix to use in the hold note when the fulfillment order is not eligible for auto-request. ## Setup guide ## Before you start This template runs when a scheduled fulfillment order becomes ready. It requests fulfillment only for orders that meet the configured location and shipping rules; everything else is placed on hold with a note. ## Configure in setup - `Target fulfillment location name`: exact assigned location name that should be auto-requested - `Hold note prefix`: prefix used when creating the hold note for ineligible fulfillment orders ## Notes - The template only auto-requests shipping fulfillment orders that are already paid - Orders that do not match the configured location are put on hold instead of being silently skipped - The app needs the appropriate fulfillment order write scope for the shop --- # Slack low inventory alert Posts a Slack alert when inventory for an updated item drops below a configured threshold. Canonical URL: https://templates.jsworkflows.com/templates/slack-low-inventory-alert/ ## When to use this template This template is built for Shopify stores using the JsWorkflows app. Use this template when you want a ready-made workflow for this use case: Posts a Slack alert when inventory for an updated item drops below a configured threshold. It is designed for Shopify notification workflows and gives you a production-ready starting point instead of building the automation from scratch. It can work with Slack as part of the workflow. This workflow uses the Shopify webhook trigger model and starts from the "Inventory level updated" trigger. It includes setup fields for merchant-facing values, so you can configure the workflow before installing it. ## Metadata - Category: Notifications - Trigger: Inventory level updated - Workflow type: Shopify webhook - Complexity: medium - Usage class: starter-friendly ## Connected services - slack ## Additional Shopify scopes - read_inventory - read_locations - read_markets_home - read_products ## Setup fields - Low stock threshold (`LOW_STOCK_THRESHOLD`) - Type: number - Storage: config - Required: yes - Description: Send an alert when available quantity drops below this number. - Slack OAuth handle (`OAUTH_HANDLE`) - Type: text - Storage: config - Required: yes - Description: OAuth handle for the Slack connection used to send the alert. - Slack channel (`SLACK_CHANNEL`) - Type: text - Storage: config - Required: yes - Description: Slack channel name or ID where low inventory alerts should be posted. ## Setup guide ## Before you start This template listens for inventory level updates and sends a Slack alert when the available quantity falls below your configured threshold. ## Configure in setup - `Low stock threshold`: alert only when available quantity is below this value - `Slack OAuth handle`: connector handle for the Slack connection - `Slack channel`: channel name or channel ID where the alert should be posted ## Notes - Duplicate inventory update deliveries are deduplicated for a short window - The alert includes the product title, variant, SKU, location, and current available quantity --- # Sync inventory from CSV URL Updates Shopify inventory from a CSV URL using Variant SKU or Handle matching, with optional product-level auto publish and auto unpublish rules. Canonical URL: https://templates.jsworkflows.com/templates/sync-inventory-from-csv-url/ ## When to use this template This template is built for Shopify stores using the JsWorkflows app. Use this template when you want a ready-made workflow for this use case: Updates Shopify inventory from a CSV URL using Variant SKU or Handle matching, with optional product-level auto publish and auto unpublish rules. It is designed for Shopify inventory and merchandising operations and gives you a production-ready starting point instead of building the automation from scratch. This workflow uses the scheduled trigger model and starts from the "Daily schedule" trigger. It includes setup fields for merchant-facing values, so you can configure the workflow before installing it. ## Metadata - Category: Inventory and merch - Trigger: Daily schedule - Workflow type: Scheduled - Complexity: advanced - Usage class: heavy-operation ## Connected services - None ## Additional Shopify scopes - read_products - read_locations - read_inventory - read_markets_home - write_inventory - read_publications - write_publications ## Setup fields - CSV URL (`CSV_URL`) - Type: text - Storage: config - Required: yes - Description: CSV URL, pre-signed download URL, or Google Sheets share URL. - Identifier mode (`IDENTIFIER_MODE`) - Type: select - Storage: config - Required: yes - Description: Use SKU for most catalogs. Use Handle only for single-variant products. - Identifier source header override (`IDENTIFIER_COLUMN`) - Type: text - Storage: config - Required: no - Description: Optional source header name to use instead of the default 'Variant SKU' or 'Handle' column. - Inventory header mappings (`INVENTORY_COLUMN_MAPPINGS`) - Type: textarea - Storage: config - Required: no - Description: Optional line-by-line mapping when supplier stock columns do not use the 'Inventory: Location Name' format. Use one line per mapping: Source Header => Shopify Location Name - Channels for auto publish/unpublish (`PUBLICATION_IDS`) - Type: shopify_publication_multiselect - Storage: config - Required: no - Description: Optional Shopify sales channels used by the auto publish and auto unpublish rules. - Auto publish when in stock (`AUTO_PUBLISH_WHEN_IN_STOCK`) - Type: checkbox - Storage: config - Required: no - Description: Publish affected products to the selected channels when Shopify's live tracked inventory is above zero after sync. - Auto unpublish when out of stock (`AUTO_UNPUBLISH_WHEN_OUT_OF_STOCK`) - Type: checkbox - Storage: config - Required: no - Description: Unpublish affected products from the selected channels when all tracked variants are at zero or below after sync. ## Setup guide ## Before you start This template reads a CSV URL and updates Shopify inventory for **existing** products. ## Matching modes - `Variant SKU` mode: best for catalogs with unique SKUs - `Handle` mode: only for **single-variant** products ## Source requirements - The URL must return raw CSV data - Google Sheets share/edit URLs are accepted and automatically converted to the CSV export URL - Blank inventory cells are skipped - A quantity of `0` is treated as a real update and sets that location to zero ## Required headers When Identifier mode is `sku`: - `Variant SKU` - one or more `Inventory: Location Name` columns When Identifier mode is `handle`: - `Handle` - one or more `Inventory: Location Name` columns Examples: - `Inventory: Sydney Warehouse` - `Inventory: Melbourne Warehouse` ## Multi-location inventory Use one inventory column per Shopify location. Any non-empty integer value in those columns is synced to that location. If an inventory item is not yet stocked at a target location, the workflow automatically activates it before retrying the quantity update. ## Sample file - [Download sample CSV](https://sample.jsworkflows.com/sample-sync-inventory-from-csv-url.csv) ## Publishing behavior Optional auto publish and auto unpublish rules work at the **product** level. After a successful inventory update, the workflow checks Shopify's live tracked inventory for the affected product and then: - publishes the product when any tracked variant has inventory above zero - unpublishes the product when all tracked variants are at zero or below Selected Shopify publications are loaded live in the setup UI and stored by publication ID. Products with untracked variants are skipped for auto publish and auto unpublish, because tracked inventory alone would not be a reliable visibility signal for them. ## Internal pacing This template automatically chooses internal row batch sizing and chunk staggering based on CSV size, inventory-column complexity, and whether auto publish or auto unpublish is enabled. Shopify throttling is handled internally with deferred retries so the workflow can slow down instead of surfacing throttle failures as row errors. ## Important limits - `Handle` mode only supports single-variant products - `Variant SKU` mode is the recommended mode for multi-variant catalogs - This template updates inventory only. It does not change price, cost, metafields, or product content ## Header mapping overrides If your supplier or source file uses different column names, you can keep the original file and configure mappings in setup: - `Identifier source header override` lets you point the template at a custom SKU or handle column - `Inventory header mappings` lets you map supplier stock columns to Shopify locations using one line per mapping Example: - `Supplier SKU =>` set in the identifier override field - `Sydney Qty => Sydney Warehouse` - `Melbourne Stock => Melbourne Warehouse` --- # Sync inventory from email CSV Updates Shopify inventory from a CSV attachment sent to the workflow email address, with optional product-level auto publish and auto unpublish rules. Canonical URL: https://templates.jsworkflows.com/templates/sync-inventory-from-email-csv/ ## When to use this template This template is built for Shopify stores using the JsWorkflows app. Use this template when you want a ready-made workflow for this use case: Updates Shopify inventory from a CSV attachment sent to the workflow email address, with optional product-level auto publish and auto unpublish rules. It is designed for Shopify inventory and merchandising operations and gives you a production-ready starting point instead of building the automation from scratch. This workflow uses the email trigger model and starts from the "Inbound email" trigger. It includes setup fields for merchant-facing values, so you can configure the workflow before installing it. ## Metadata - Category: Inventory and merch - Trigger: Inbound email - Workflow type: Email trigger - Complexity: advanced - Usage class: heavy-operation ## Connected services - None ## Additional Shopify scopes - read_products - read_locations - read_inventory - read_markets_home - write_inventory - read_publications - write_publications ## Setup fields - Identifier mode (`IDENTIFIER_MODE`) - Type: select - Storage: config - Required: yes - Description: Use SKU for most catalogs. Use Handle only for single-variant products. - Identifier source header override (`IDENTIFIER_COLUMN`) - Type: text - Storage: config - Required: no - Description: Optional source header name to use instead of the default 'Variant SKU' or 'Handle' column. - Inventory header mappings (`INVENTORY_COLUMN_MAPPINGS`) - Type: textarea - Storage: config - Required: no - Description: Optional line-by-line mapping when supplier stock columns do not use the 'Inventory: Location Name' format. Use one line per mapping: Source Header => Shopify Location Name - Channels for auto publish/unpublish (`PUBLICATION_IDS`) - Type: shopify_publication_multiselect - Storage: config - Required: no - Description: Optional Shopify sales channels used by the auto publish and auto unpublish rules. - Auto publish when in stock (`AUTO_PUBLISH_WHEN_IN_STOCK`) - Type: checkbox - Storage: config - Required: no - Description: Publish affected products to the selected channels when Shopify's live tracked inventory is above zero after sync. - Auto unpublish when out of stock (`AUTO_UNPUBLISH_WHEN_OUT_OF_STOCK`) - Type: checkbox - Storage: config - Required: no - Description: Unpublish affected products from the selected channels when all tracked variants are at zero or below after sync. ## Setup guide ## Before you start This template reads a CSV attachment from an inbound email and updates Shopify inventory for **existing** products. ## How the trigger works - After saving the workflow, JsWorkflows gives it a dedicated inbound email address - Send or forward an email with **one CSV attachment** to that address - The workflow processes the first supported CSV attachment it finds - Additional attachments are ignored ## Matching modes - `Variant SKU` mode: best for catalogs with unique SKUs - `Handle` mode: only for **single-variant** products ## Source requirements - The inventory file must be attached directly to the email as a CSV file - The template processes the first attachment with a `.csv` filename or `text/csv` content type - Blank inventory cells are skipped - A quantity of `0` is treated as a real update and sets that location to zero ## Required headers When Identifier mode is `sku`: - `Variant SKU` - one or more `Inventory: Location Name` columns When Identifier mode is `handle`: - `Handle` - one or more `Inventory: Location Name` columns Examples: - `Inventory: Sydney Warehouse` - `Inventory: Melbourne Warehouse` ## Multi-location inventory Use one inventory column per Shopify location. Any non-empty integer value in those columns is synced to that location. If an inventory item is not yet stocked at a target location, the workflow automatically activates it before retrying the quantity update. ## Sample file - [Download sample CSV](https://sample.jsworkflows.com/sample-sync-inventory-from-csv-url.csv) ## Publishing behavior Optional auto publish and auto unpublish rules work at the **product** level. After a successful inventory update, the workflow checks Shopify's live tracked inventory for the affected product and then: - publishes the product when any tracked variant has inventory above zero - unpublishes the product when all tracked variants are at zero or below Selected Shopify publications are loaded live in the setup UI and stored by publication ID. Products with untracked variants are skipped for auto publish and auto unpublish, because tracked inventory alone would not be a reliable visibility signal for them. ## Internal pacing This template automatically chooses internal row batch sizing and chunk staggering based on CSV size, inventory-column complexity, and whether auto publish or auto unpublish is enabled. Shopify throttling is handled internally with deferred retries so the workflow can slow down instead of surfacing throttle failures as row errors. ## Important limits - `Handle` mode only supports single-variant products - `Variant SKU` mode is the recommended mode for multi-variant catalogs - This template updates inventory only. It does not change price, cost, metafields, or product content - Send one CSV attachment per email for predictable run summaries ## Header mapping overrides If your supplier or source file uses different column names, you can keep the original file and configure mappings in setup: - `Identifier source header override` lets you point the template at a custom SKU or handle column - `Inventory header mappings` lets you map supplier stock columns to Shopify locations using one line per mapping Example: - `Supplier SKU =>` set in the identifier override field - `Sydney Qty => Sydney Warehouse` - `Melbourne Stock => Melbourne Warehouse` --- # Sync inventory from Google Sheets Updates Shopify inventory from Google Sheets using Variant SKU or Handle matching, with optional product-level auto publish and auto unpublish rules. Canonical URL: https://templates.jsworkflows.com/templates/sync-inventory-from-google-sheets/ ## When to use this template This template is built for Shopify stores using the JsWorkflows app. Use this template when you want a ready-made workflow for this use case: Updates Shopify inventory from Google Sheets using Variant SKU or Handle matching, with optional product-level auto publish and auto unpublish rules. It is designed for Shopify inventory and merchandising operations and gives you a production-ready starting point instead of building the automation from scratch. It can work with Google as part of the workflow. This workflow uses the scheduled trigger model and starts from the "Daily schedule" trigger. It includes setup fields for merchant-facing values, so you can configure the workflow before installing it. ## Metadata - Category: Inventory and merch - Trigger: Daily schedule - Workflow type: Scheduled - Complexity: advanced - Usage class: heavy-operation ## Connected services - google ## Additional Shopify scopes - read_products - read_locations - read_inventory - read_markets_home - write_inventory - read_publications - write_publications ## Setup fields - Spreadsheet ID (`SPREADSHEET_ID`) - Type: text - Storage: config - Required: yes - Description: The Google Sheet ID that contains the inventory sync tab. - Source sheet name (`SHEET_NAME`) - Type: text - Storage: config - Required: yes - Description: The tab name to read inventory rows from. - Report sheet name (`REPORT_SHEET_NAME`) - Type: text - Storage: config - Required: no - Description: Optional tab used for row-level error reporting. Leave blank to disable report logging. - Identifier mode (`IDENTIFIER_MODE`) - Type: select - Storage: config - Required: yes - Description: Use SKU for most catalogs. Use Handle only for single-variant products. - Identifier source header override (`IDENTIFIER_COLUMN`) - Type: text - Storage: config - Required: no - Description: Optional source header name to use instead of the default 'Variant SKU' or 'Handle' column. - Inventory header mappings (`INVENTORY_COLUMN_MAPPINGS`) - Type: textarea - Storage: config - Required: no - Description: Optional line-by-line mapping when supplier stock columns do not use the 'Inventory: Location Name' format. Use one line per mapping: Source Header => Shopify Location Name - Channels for auto publish/unpublish (`PUBLICATION_IDS`) - Type: shopify_publication_multiselect - Storage: config - Required: no - Description: Optional Shopify sales channels used by the auto publish and auto unpublish rules. - Auto publish when in stock (`AUTO_PUBLISH_WHEN_IN_STOCK`) - Type: checkbox - Storage: config - Required: no - Description: Publish affected products to the selected channels when Shopify's live tracked inventory is above zero after sync. - Auto unpublish when out of stock (`AUTO_UNPUBLISH_WHEN_OUT_OF_STOCK`) - Type: checkbox - Storage: config - Required: no - Description: Unpublish affected products from the selected channels when all tracked variants are at zero or below after sync. - Google client email (`GOOGLE_CLIENT_EMAIL`) - Type: text - Storage: env - Required: yes - Description: The Google service account client email used to access Sheets. - Google private key (`GOOGLE_PRIVATE_KEY`) - Type: textarea - Storage: env - Required: yes - Description: The full Google service account private key in PEM format, including the BEGIN/END lines. This is saved as an encrypted workflow variable after the workflow is created. ## Setup guide ## Before you start This template reads a Google Sheet and updates Shopify inventory for **existing** products. ## Matching modes - `Variant SKU` mode: best for catalogs with unique SKUs - `Handle` mode: only for **single-variant** products ## Sheet model - Row 1 must contain headers - Header names matter; column order does not - Each row represents one identifier update row - Blank inventory cells are skipped - A quantity of `0` is treated as a real update and sets that location to zero ## Required headers When Identifier mode is `sku`: - `Variant SKU` - one or more `Inventory: Location Name` columns When Identifier mode is `handle`: - `Handle` - one or more `Inventory: Location Name` columns Examples: - `Inventory: Sydney Warehouse` - `Inventory: Melbourne Warehouse` ## Multi-location inventory Use one inventory column per Shopify location. Any non-empty integer value in those columns is synced to that location. If an inventory item is not yet stocked at a target location, the workflow automatically activates it before retrying the quantity update. ## Sample file - [Download sample CSV](https://sample.jsworkflows.com/sample-sync-inventory-from-csv-url.csv) ## Publishing behavior Optional auto publish and auto unpublish rules work at the **product** level. After a successful inventory update, the workflow checks Shopify's live tracked inventory for the affected product and then: - publishes the product when any tracked variant has inventory above zero - unpublishes the product when all tracked variants are at zero or below Selected Shopify publications are loaded live in the setup UI and stored by publication ID. Products with untracked variants are skipped for auto publish and auto unpublish, because tracked inventory alone would not be a reliable visibility signal for them. ## Error reporting If `Report sheet name` is set, the template appends row-level failures to that tab. Create the report tab before running the template. Leave the field blank to disable report logging. ## Google credentials The template setup form saves these as workflow secrets: - `GOOGLE_CLIENT_EMAIL` - `GOOGLE_PRIVATE_KEY` Paste the full PEM private key including the `BEGIN` and `END` lines. ## Internal pacing This template automatically chooses internal row batch sizing and chunk staggering based on sheet size, inventory-column complexity, and whether auto publish or auto unpublish is enabled. Shopify throttling is handled internally with deferred retries so the workflow can slow down instead of surfacing throttle failures as row errors. ## Important limits - `Handle` mode only supports single-variant products - `Variant SKU` mode is the recommended mode for multi-variant catalogs - This template updates inventory only. It does not change price, cost, metafields, or product content ## Header mapping overrides If your supplier or source file uses different column names, you can keep the original file and configure mappings in setup: - `Identifier source header override` lets you point the template at a custom SKU or handle column - `Inventory header mappings` lets you map supplier stock columns to Shopify locations using one line per mapping Example: - `Supplier SKU =>` set in the identifier override field - `Sydney Qty => Sydney Warehouse` - `Melbourne Stock => Melbourne Warehouse` --- # Sync inventory from Google Sheets (OAuth) Updates Shopify inventory from a Google Sheet selected through a Google OAuth connection, with optional product-level auto publish and auto unpublish rules. Canonical URL: https://templates.jsworkflows.com/templates/sync-inventory-from-google-sheets-oauth/ ## When to use this template This template is built for Shopify stores using the JsWorkflows app. Use this template when you want a ready-made workflow for this use case: Updates Shopify inventory from a Google Sheet selected through a Google OAuth connection, with optional product-level auto publish and auto unpublish rules. It is designed for Shopify inventory and merchandising operations and gives you a production-ready starting point instead of building the automation from scratch. It can work with Google as part of the workflow. This workflow uses the scheduled trigger model and starts from the "Daily schedule" trigger. It includes setup fields for merchant-facing values, so you can configure the workflow before installing it. ## Metadata - Category: Inventory and merch - Trigger: Daily schedule - Workflow type: Scheduled - Complexity: advanced - Usage class: heavy-operation ## Connected services - google ## Additional Shopify scopes - read_products - read_locations - read_inventory - read_markets_home - write_inventory - read_publications - write_publications ## Setup fields - Google OAuth handle (`OAUTH_HANDLE`) - Type: text - Storage: config - Required: yes - Description: OAuth handle for the Google connection that can access the selected spreadsheet. - Spreadsheet ID (`SPREADSHEET_ID`) - Type: google_drive_file_picker - Storage: config - Required: yes - Description: Select the Google Sheet with the picker or paste an already-accessible spreadsheet ID. - Source sheet name (`SHEET_NAME`) - Type: text - Storage: config - Required: yes - Description: The tab name to read inventory rows from. - Report sheet name (`REPORT_SHEET_NAME`) - Type: text - Storage: config - Required: no - Description: Optional tab used for row-level error reporting. Leave blank to disable report logging. - Identifier mode (`IDENTIFIER_MODE`) - Type: select - Storage: config - Required: yes - Description: Use SKU for most catalogs. Use Handle only for single-variant products. - Identifier source header override (`IDENTIFIER_COLUMN`) - Type: text - Storage: config - Required: no - Description: Optional source header name to use instead of the default 'Variant SKU' or 'Handle' column. - Inventory header mappings (`INVENTORY_COLUMN_MAPPINGS`) - Type: textarea - Storage: config - Required: no - Description: Optional line-by-line mapping when supplier stock columns do not use the 'Inventory: Location Name' format. Use one line per mapping: Source Header => Shopify Location Name - Channels for auto publish/unpublish (`PUBLICATION_IDS`) - Type: shopify_publication_multiselect - Storage: config - Required: no - Description: Optional Shopify sales channels used by the auto publish and auto unpublish rules. - Auto publish when in stock (`AUTO_PUBLISH_WHEN_IN_STOCK`) - Type: checkbox - Storage: config - Required: no - Description: Publish affected products to the selected channels when Shopify's live tracked inventory is above zero after sync. - Auto unpublish when out of stock (`AUTO_UNPUBLISH_WHEN_OUT_OF_STOCK`) - Type: checkbox - Storage: config - Required: no - Description: Unpublish affected products from the selected channels when all tracked variants are at zero or below after sync. ## Setup guide ## Before you start This template reads a Google Sheet and updates Shopify inventory for **existing** products using a Google OAuth connection. ## Matching modes - `Variant SKU` mode: best for catalogs with unique SKUs - `Handle` mode: only for **single-variant** products ## Sheet model - Row 1 must contain headers - Header names matter; column order does not - Each row represents one identifier update row - Blank inventory cells are skipped - A quantity of `0` is treated as a real update and sets that location to zero ## Required headers When Identifier mode is `sku`: - `Variant SKU` - one or more `Inventory: Location Name` columns When Identifier mode is `handle`: - `Handle` - one or more `Inventory: Location Name` columns Examples: - `Inventory: Sydney Warehouse` - `Inventory: Melbourne Warehouse` ## Multi-location inventory Use one inventory column per Shopify location. Any non-empty integer value in those columns is synced to that location. If an inventory item is not yet stocked at a target location, the workflow automatically activates it before retrying the quantity update. ## Google OAuth setup This version uses a Google OAuth handle instead of a service account. Provide: - `OAUTH_HANDLE` - `SPREADSHEET_ID` using the Google picker or an already-accessible spreadsheet ID - `SHEET_NAME` - optional `REPORT_SHEET_NAME` If you use the picker, the saved spreadsheet reference includes metadata such as the file name and resource key when available. ## Error reporting If `Report sheet name` is set, the template appends row-level failures to that tab in the same selected spreadsheet. Create the report tab before running the template. Leave the field blank to disable report logging. ## Publishing behavior Optional auto publish and auto unpublish rules work at the **product** level. After a successful inventory update, the workflow checks Shopify's live tracked inventory for the affected product and then: - publishes the product when any tracked variant has inventory above zero - unpublishes the product when all tracked variants are at zero or below Selected Shopify publications are loaded live in the setup UI and stored by publication ID. Products with untracked variants are skipped for auto publish and auto unpublish, because tracked inventory alone would not be a reliable visibility signal for them. ## Internal pacing This template automatically chooses internal row batch sizing and chunk staggering based on sheet size, inventory-column complexity, and whether auto publish or auto unpublish is enabled. Shopify throttling is handled internally with deferred retries so the workflow can slow down instead of surfacing throttle failures as row errors. ## Important limits - `Handle` mode only supports single-variant products - `Variant SKU` mode is the recommended mode for multi-variant catalogs - This template updates inventory only. It does not change price, cost, metafields, or product content ## Header mapping overrides If your supplier or source file uses different column names, you can keep the original file and configure mappings in setup: - `Identifier source header override` lets you point the template at a custom SKU or handle column - `Inventory header mappings` lets you map supplier stock columns to Shopify locations using one line per mapping Example: - `Supplier SKU =>` set in the identifier override field - `Sydney Qty => Sydney Warehouse` - `Melbourne Stock => Melbourne Warehouse` --- # Tag customer after N orders Automatically adds a tag to a customer when they reach a specified number of orders. Canonical URL: https://templates.jsworkflows.com/templates/tag-customer-after-n-orders/ ## When to use this template This template is built for Shopify stores using the JsWorkflows app. Use this template when you want a ready-made workflow for this use case: Automatically adds a tag to a customer when they reach a specified number of orders. It is designed for Shopify customer operations and gives you a production-ready starting point instead of building the automation from scratch. This workflow uses the Shopify webhook trigger model and starts from the "Order created" trigger. It includes setup fields for merchant-facing values, so you can configure the workflow before installing it. ## Metadata - Category: Customers - Trigger: Order created - Workflow type: Shopify webhook - Complexity: easy - Usage class: starter-friendly ## Connected services - None ## Additional Shopify scopes - None ## Setup fields - Order count threshold (`ORDER_COUNT_THRESHOLD`) - Type: number - Storage: config - Required: yes - Description: Minimum number of Shopify orders required before the customer tag is added. - Customer tag (`CUSTOMER_TAG`) - Type: text - Storage: config - Required: yes - Description: Exact Shopify customer tag to add when the threshold is reached. ## Setup guide ## Before you start This template listens for new orders and adds a customer tag once the customer's Shopify order count reaches your configured threshold. ## How it works - Trigger: `orders/create` - The workflow skips guest checkouts with no attached customer - It waits briefly, loads the customer's current Shopify order count, and applies the tag once the threshold is reached - If the customer already has the tag, nothing else happens ## Configure in setup - `Order count threshold`: minimum Shopify order count required before the tag is added - `Customer tag`: the exact tag to add, such as `vip`, `repeat-buyer`, or `wholesale-lead` ## Notes - Shopify order count comes from the customer record, so historical orders are included - The workflow is safe to re-run because it checks whether the tag already exists before trying to add it --- # Tag EDU customers on signup Tags new customers whose email ends in .edu. Canonical URL: https://templates.jsworkflows.com/templates/tag-edu-customers-on-signup/ ## When to use this template This template is built for Shopify stores using the JsWorkflows app. Use this template when you want a ready-made workflow for this use case: Tags new customers whose email ends in .edu. It is designed for Shopify customer operations and gives you a production-ready starting point instead of building the automation from scratch. This workflow uses the Shopify webhook trigger model and starts from the "Customer created" trigger. It includes setup fields for merchant-facing values, so you can configure the workflow before installing it. ## Metadata - Category: Customers - Trigger: Customer created - Workflow type: Shopify webhook - Complexity: easy - Usage class: starter-friendly ## Connected services - None ## Additional Shopify scopes - write_customers ## Setup fields - Customer tag (`EDU_TAG`) - Type: text - Storage: config - Required: yes - Description: Customer tag to add when a new customer signs up with an .edu email address. ## Setup guide ## Before you start This template listens for new customers and tags those whose email ends with `.edu`. ## Configure in setup - `Customer tag`: tag to add to matching customers ## Notes - Customers whose email is missing or does not end with `.edu` are skipped - The workflow only adds the configured tag and does not remove other tags --- # Tag high-intent first-time customers on fulfillment Tags first-time customers who converted quickly and appends a customer note when their order is fulfilled. Canonical URL: https://templates.jsworkflows.com/templates/tag-high-intent-first-time-customers-on-fulfillment/ ## When to use this template This template is built for Shopify stores using the JsWorkflows app. Use this template when you want a ready-made workflow for this use case: Tags first-time customers who converted quickly and appends a customer note when their order is fulfilled. It is designed for Shopify customer operations and gives you a production-ready starting point instead of building the automation from scratch. This workflow uses the Shopify webhook trigger model and starts from the "Order fulfilled" trigger. It includes setup fields for merchant-facing values, so you can configure the workflow before installing it. ## Metadata - Category: Customers - Trigger: Order fulfilled - Workflow type: Shopify webhook - Complexity: easy - Usage class: starter-friendly ## Connected services - None ## Additional Shopify scopes - read_customers - read_orders - write_customers ## Setup fields - Days-to-conversion threshold (`CONVERSION_DAYS_THRESHOLD`) - Type: number - Storage: config - Required: yes - Description: Maximum number of days between the customer's first visit and the fulfilled order. - Customer tag (`TARGET_TAG`) - Type: text - Storage: config - Required: yes - Description: Exact Shopify customer tag to add for qualifying customers. - Customer note template (`NOTE_TEMPLATE`) - Type: textarea - Storage: config - Required: yes - Description: Text appended to the customer note for qualifying customers. Supports {{order_name}}, {{days_to_conversion}}, and {{tag}} placeholders. ## Setup guide ## Before you start This template watches fulfilled orders and identifies customers who placed their first order after a short conversion window. ## Configure in setup - `Days-to-conversion threshold`: maximum number of days allowed between first visit and order creation - `Customer tag`: the exact customer tag to add when the customer qualifies - `Customer note template`: note text appended to the customer record when the customer qualifies ## Supported note placeholders - `{{order_name}}` - `{{days_to_conversion}}` - `{{tag}}` ## Notes - Guest checkouts are skipped because there is no customer record to update - The template only acts when the fulfilled order is the customer's first Shopify order - If Shopify hasn't attributed customer journey data yet, the workflow skips the order instead of guessing - The note is appended once and won't be duplicated if the same note line is already present --- # Tag low-stock products Runs daily and adds a 'low-stock' tag to any product with inventory below a threshold. Removes the tag when the product is restocked. Canonical URL: https://templates.jsworkflows.com/templates/tag-low-stock-products/ ## When to use this template This template is built for Shopify stores using the JsWorkflows app. Use this template when you want a ready-made workflow for this use case: Runs daily and adds a 'low-stock' tag to any product with inventory below a threshold. Removes the tag when the product is restocked. It is designed for Shopify inventory and merchandising operations and gives you a production-ready starting point instead of building the automation from scratch. This workflow uses the scheduled trigger model and starts from the "Daily schedule" trigger. It includes setup fields for merchant-facing values, so you can configure the workflow before installing it. ## Metadata - Category: Inventory and merch - Trigger: Daily schedule - Workflow type: Scheduled - Complexity: medium - Usage class: starter-friendly ## Connected services - None ## Additional Shopify scopes - read_products - write_products ## Setup fields - Low-stock threshold (`LOW_STOCK_THRESHOLD`) - Type: number - Storage: config - Required: yes - Description: Any product with at least one tracked variant below this quantity is tagged as low stock. - Low-stock tag (`LOW_STOCK_TAG`) - Type: text - Storage: config - Required: yes - Description: Exact Shopify product tag to add when stock is low and remove when stock recovers. ## Setup guide ## Before you start This template runs on a schedule and keeps a product tag in sync with Shopify inventory levels. ## How it works - The workflow scans products page by page - If any tracked variant on a product has inventory below the configured threshold, the product gets the low-stock tag - If a tagged product is fully restocked, the tag is removed - Large catalogs and products with many variants are paginated safely ## Configure in setup - `Low-stock threshold`: inventory quantity below which a product is considered low stock - `Low-stock tag`: exact Shopify product tag to add and remove ## Notes - This uses Shopify tracked inventory quantities on variants - It works well for merchandising, collection rules, and operational reporting based on product tags - Set your preferred schedule start time and timezone when saving --- # Tag new orders by payment gateway Adds one or more payment-gateway tags to each new order based on the gateway names in the webhook payload. Canonical URL: https://templates.jsworkflows.com/templates/tag-new-orders-by-payment-gateway/ ## When to use this template This template is built for Shopify stores using the JsWorkflows app. Use this template when you want a ready-made workflow for this use case: Adds one or more payment-gateway tags to each new order based on the gateway names in the webhook payload. It is designed for Shopify order operations and gives you a production-ready starting point instead of building the automation from scratch. This workflow uses the Shopify webhook trigger model and starts from the "Order created" trigger. It includes setup fields for merchant-facing values, so you can configure the workflow before installing it. ## Metadata - Category: Orders - Trigger: Order created - Workflow type: Shopify webhook - Complexity: easy - Usage class: starter-friendly ## Connected services - None ## Additional Shopify scopes - write_orders ## Setup fields - Tag prefix (`PAYMENT_TAG_PREFIX`) - Type: text - Storage: config - Required: yes - Description: Prefix to use when building payment gateway tags. ## Setup guide ## Before you start This template tags each new order based on the payment gateway names in the webhook payload. ## Configure in setup - `Tag prefix`: prefix prepended to each normalized payment gateway name ## Notes - Gateway names are lowercased and normalized to tag-safe text - If Shopify does not include any gateway names, the workflow adds an `unknown` tag under the configured prefix --- # Tag new products and remove after N days Adds a configurable tag to new products and removes it again after a configurable number of days. Canonical URL: https://templates.jsworkflows.com/templates/tag-new-products-remove-new-arrival-30-days/ ## When to use this template This template is built for Shopify stores using the JsWorkflows app. Use this template when you want a ready-made workflow for this use case: Adds a configurable tag to new products and removes it again after a configurable number of days. It is designed for Shopify inventory and merchandising operations and gives you a production-ready starting point instead of building the automation from scratch. This workflow uses the Shopify webhook trigger model and starts from the "Product created" trigger. It includes setup fields for merchant-facing values, so you can configure the workflow before installing it. ## Metadata - Category: Inventory and merch - Trigger: Product created - Workflow type: Shopify webhook - Complexity: easy - Usage class: starter-friendly ## Connected services - None ## Additional Shopify scopes - write_products ## Setup fields - Product tag (`NEW_ARRIVAL_TAG`) - Type: text - Storage: config - Required: yes - Description: Tag to add to new products immediately after creation. - Remove after days (`REMOVE_AFTER_DAYS`) - Type: number - Storage: config - Required: yes - Description: How many days after product creation the tag should be removed. ## Setup guide ## Before you start This template marks new products with a tag and removes that tag after a configurable number of days. ## Configure in setup - `Product tag`: tag to add when the product is created - `Remove after days`: how long to wait before removing the tag ## Notes - The tag is added immediately on product creation - The removal delay is scheduled when the product-create webhook is received --- # Tag orders by shipping method Adds an order tag derived from the order’s first shipping method. Canonical URL: https://templates.jsworkflows.com/templates/tag-orders-by-shipping-method/ ## When to use this template This template is built for Shopify stores using the JsWorkflows app. Use this template when you want a ready-made workflow for this use case: Adds an order tag derived from the order’s first shipping method. It is designed for Shopify order operations and gives you a production-ready starting point instead of building the automation from scratch. This workflow uses the Shopify webhook trigger model and starts from the "Order paid" trigger. It includes setup fields for merchant-facing values, so you can configure the workflow before installing it. ## Metadata - Category: Orders - Trigger: Order paid - Workflow type: Shopify webhook - Complexity: easy - Usage class: starter-friendly ## Connected services - None ## Additional Shopify scopes - write_orders ## Setup fields - Tag prefix (`TAG_PREFIX`) - Type: text - Storage: config - Required: yes - Description: Prefix to prepend to the normalized shipping method value. ## Setup guide ## Before you start This template tags paid orders based on the first shipping method included in the order payload. ## Configure in setup - `Tag prefix`: prefix prepended to the normalized shipping method text ## Notes - Shipping method text is lowercased and normalized into a Shopify-safe tag value - Orders without shipping lines receive an `unknown` suffix under the configured prefix --- # Update order note with customer total orders Looks up a customer’s total Shopify order count and writes it into the paid order note. Canonical URL: https://templates.jsworkflows.com/templates/update-order-note-customer-total-orders/ ## When to use this template This template is built for Shopify stores using the JsWorkflows app. Use this template when you want a ready-made workflow for this use case: Looks up a customer’s total Shopify order count and writes it into the paid order note. It is designed for Shopify order operations and gives you a production-ready starting point instead of building the automation from scratch. This workflow uses the Shopify webhook trigger model and starts from the "Order paid" trigger. It includes setup fields for merchant-facing values, so you can configure the workflow before installing it. ## Metadata - Category: Orders - Trigger: Order paid - Workflow type: Shopify webhook - Complexity: easy - Usage class: starter-friendly ## Connected services - None ## Additional Shopify scopes - read_orders - write_orders ## Setup fields - Note prefix (`NOTE_PREFIX`) - Type: text - Storage: config - Required: yes - Description: Prefix written ahead of the customer order count in the order note. ## Setup guide ## Before you start This template updates the paid order note with the customer’s current total Shopify order count. ## Configure in setup - `Note prefix`: text prefix that appears before the numeric order count ## Notes - Guest checkouts are skipped because there is no customer to count - The workflow overwrites the order note with the generated note line