Now liveThe Skillselion MCP - thousands of ranked skills, loaded into your agent mid-task. No install.Get it →
40rty-ai avatar

Shopify Admin Product Tag Bulk Update

  • 7 installs
  • 173 repo stars
  • Updated June 26, 2026
  • 40rty-ai/shopify-admin-skills

shopify-admin-product-tag-bulk-update is a Claude Code skill that bulk adds or removes product tags across a filtered set of Shopify products using the Shopify Admin GraphQL API.

About

This skill adds or removes one or more product tags in bulk across every product matching a collection, an existing tag, or a search query. Merchants use it for campaign setup, campaign teardown, and catalog reorganization since tags drive collection rules, marketing segments, and reporting filters. It runs against the Shopify Admin GraphQL API and defaults to a dry run so the target product list can be reviewed before mutations run. It writes a CSV recording each tag change.

  • Adds or removes tags across all products in a collection, existing tag, or search query in one run
  • Uses the Shopify Admin GraphQL tagsAdd and tagsRemove mutations against api version 2025-01
  • Replaces manual Shopify admin bulk editing and CSV import/export for campaign setup and teardown

Shopify Admin Product Tag Bulk Update by the numbers

  • 7 all-time installs (skills.sh)
  • Ranked #1,587 of 2,715 Automation & Workflows skills by installs in the Skillselion catalog
  • Data as of Aug 1, 2026 (Skillselion catalog sync)
At a glance

shopify-admin-product-tag-bulk-update capabilities & compatibility

Free; requires an authenticated Shopify store session with read_products and write_products scopes

Capabilities
bulk tagging · product tags update · catalog management
Works with
github
Use cases
database · marketing
Pricing
Free
From the docs

What shopify-admin-product-tag-bulk-update says it does

Add or remove tags on all products matching a collection, existing tag, or search query — for campaign setup, teardown, or catalog organization.
SKILL.md
Replaces manual Shopify admin bulk editing and CSV import/export workflows.
SKILL.md
npx skills add https://github.com/40rty-ai/shopify-admin-skills --skill shopify-admin-product-tag-bulk-update

Add your badge

Show developers this skill is listed on Skillselion. Paste this into your README.

Listed on Skillselion
Installs7
repo stars173
Last updatedJune 26, 2026
Repository40rty-ai/shopify-admin-skills

What it does

Add or remove one or more tags across a filtered set of Shopify products for campaign setup, teardown, or catalog reorganization.

Who is it for?

Campaign setup and teardown and catalog reorganization where many products need retagging at once

When should I use this skill?

You need to add or remove a tag across a whole collection or filter of Shopify products

What you get

Every targeted product has the specified tags added or removed, with each change logged to a CSV.

  • tag-update CSV with product_id, product_title, action, tags_changed, previous_tags, result

By the numbers

  • 3 GraphQL operations (products query, tagsAdd, tagsRemove)
  • Shopify tag max length is 255 characters

Files

SKILL.mdMarkdownGitHub ↗

Purpose

Adds or removes one or more tags across a set of products in bulk — replacing manual product-by-product editing in the Shopify admin. Use for campaign setup (add summer-sale to a collection before launch), campaign teardown (remove flash-sale after it ends), or catalog reorganization (retag products moving between categories). Tags drive collection rules, marketing segments, and reporting filters, so bulk accuracy matters. Replaces manual Shopify admin bulk editing and CSV import/export workflows.

Prerequisites

  • shopify auth login --store <domain>
  • API scopes: read_products, write_products

Parameters

Universal (store, format, dry_run) + skill-specific:

ParameterTypeRequiredDefaultDescription
actionstringyesadd or remove
tagsarrayyesOne or more tag strings to add or remove (e.g., ["summer-sale", "clearance"])
collection_idstringno*GID of a collection — target all products in this collection
filter_tagstringno*Target all products that currently have this tag
query_filterstringno*Shopify product search query (e.g., "product_type:Apparel")

*One of collection_id, filter_tag, or query_filter is required.

Safety

⚠️ Step 2 executes bulk tag mutations. tagsRemove is irreversible — if you remove the wrong tag, you must re-add it manually or run this skill again with action: add. Run with dry_run: true to see the full product list before committing. For large catalogs (1000+ products), dry_run is strongly recommended before any removal operation.

Workflow Steps

1. OPERATION: products — query Inputs: first: 250, query built from collection_id, filter_tag, or query_filter; paginate until all matching products fetched Expected output: List of product GIDs and current tag arrays; confirm target set before proceeding

2. OPERATION: tagsAdd — mutation (if action: add) Inputs: id: <productId>, tags: <tags array> per product Expected output: Updated node.id with userErrors

OR

2. OPERATION: tagsRemove — mutation (if action: remove) Inputs: id: <productId>, tags: <tags array> per product Expected output: Updated node with userErrors

GraphQL Operations

# products:query — validated against api_version 2025-01
query ProductsForTagUpdate($first: Int!, $after: String, $query: String) {
  products(first: $first, after: $after, query: $query) {
    edges {
      node {
        id
        title
        tags
      }
    }
    pageInfo {
      hasNextPage
      endCursor
    }
  }
}
# tagsAdd:mutation — validated against api_version 2025-01
mutation TagsAdd($id: ID!, $tags: [String!]!) {
  tagsAdd(id: $id, tags: $tags) {
    node {
      id
    }
    userErrors {
      field
      message
    }
  }
}
# tagsRemove:mutation — validated against api_version 2025-01
mutation TagsRemove($id: ID!, $tags: [String!]!) {
  tagsRemove(id: $id, tags: $tags) {
    node {
      id
    }
    userErrors {
      field
      message
    }
  }
}

Session Tracking

Claude MUST emit the following output at each stage. This is mandatory.

On start, emit:

╔══════════════════════════════════════════════╗
║  SKILL: product-tag-bulk-update              ║
║  Store: <store domain>                       ║
║  Started: <YYYY-MM-DD HH:MM UTC>             ║
╚══════════════════════════════════════════════╝

After each step, emit:

[N/TOTAL] <QUERY|MUTATION>  <OperationName>
          → Params: <brief summary of key inputs>
          → Result: <count or outcome, e.g., "143 records returned">

If dry_run: true, prefix every mutation step with [DRY RUN] and do not execute it.

On completion, emit:

For format: human (default):

══════════════════════════════════════════════
OUTCOME SUMMARY
  Products targeted:    <count>
  Tags added/removed:   <tags list>
  Action:               <add|remove>
  Errors:               <count, 0 if none>
  Output:               <filename or "none">
══════════════════════════════════════════════

For format: json, emit a JSON object with this schema:

{
  "skill": "product-tag-bulk-update",
  "store": "<domain>",
  "started_at": "<ISO8601>",
  "completed_at": "<ISO8601>",
  "dry_run": false,
  "steps": [
    {
      "step": 1,
      "operation": "<OperationName>",
      "type": "query|mutation",
      "params_summary": "<string>",
      "result_summary": "<string>",
      "skipped": false
    }
  ],
  "outcome": {
    "action": "<add|remove>",
    "tags": ["<tag1>", "<tag2>"],
    "products_targeted": 0,
    "mutations_succeeded": 0,
    "errors": 0,
    "output_file": "<filename|null>"
  }
}

Output Format

CSV file tag-update-<YYYY-MM-DD>.csv with columns: product_id, product_title, action, tags_changed, previous_tags, result.

Error Handling

ErrorCauseRecovery
No products returnedFilter matches nothingCheck collection GID or filter_tag spelling
userErrors from tagsAdd/tagsRemoveTag string too long or invalid charactersShopify tag max length is 255 characters; no commas allowed
Large product count (1000+)Many API calls needed for paginationExpected — the skill paginates automatically; may take longer
Tag not present (on remove)Product doesn't have the tag you're removingSilently skips — tagsRemove on a non-existent tag is a no-op

Best Practices

1. Run dry_run: true before any action: remove — the CSV preview shows exactly which products will lose the tag. 2. To set up a campaign cleanly, run action: add at launch and action: remove at the end — keeping your product tags tidy prevents collection rule drift. 3. Use query_filter: "tag:old-campaign-name" for teardown — it will find exactly the products tagged from the previous run. 4. You can add multiple tags in one run — pass tags: ["sale", "homepage-featured", "clearance"] to apply all three atomically. 5. Tags are case-insensitive in Shopify collection rules but case-preserving in the API — use consistent casing to avoid duplicates like Sale and sale.

Related skills

FAQ

Can I target products by collection or search query?

Yes; you supply one of collection_id, filter_tag, or query_filter to select the products to tag.

Is tag removal reversible?

tagsRemove is irreversible, so the skill defaults to dry_run:true and recommends previewing the full product list before any removal, especially on catalogs of 1000+ products.

This week in AI coding

Five minutes, every Monday - the tools, releases and tactics for developers.

unsubscribe anytime.