Agent skill

Shopify Admin Customer Merge

by 40RTY-ai in 40RTY-ai/shopify-admin-skills

Merges duplicate customer records: invokes Shopify's native customer merge API where supported, otherwise consolidates the loser record's tags and notes into the winner via customerUpdate.

MITAuto-check passedSales & Support

Install Shopify Admin Customer Merge

skills CLI
$ npx skills add 40RTY-ai/shopify-admin-skills --skill shopify-admin-customer-merge -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install 40RTY-ai/shopify-admin-skills shopify-admin-customer-merge --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/40RTY-ai/shopify-admin-skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/customer-support/shopify-admin-customer-merge .claude/skills/shopify-admin-customer-merge && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
shopify-admin-customer-merge
GitHub stars
194
Token cost
~2.4k tokens
SKILL.md length
801 words
Files
1
Skills in repo
116
Repo updated
First seen
Licence
MIT

At a glance

Merges duplicate customer records: invokes Shopify's native customer merge API where supported, otherwise consolidates the loser record's tags and notes into the winner via customerUpdate.

  • Works in 4 steps: OPERATION: customer — query (called… → OPERATION: customerMerge — mutation… → OPERATION: customerUpdate — mutation… → …
  • Tasks that involve Customer support
  • SKILL.md covers Purpose, Prerequisites, Parameters and Safety, plus 6 more sections
  • Calls shopify

What it does

Shopify Admin Customer Merge is an agent skill from 40RTY-ai/shopify-admin-skills. Merges duplicate customer records: invokes Shopify's native customer merge API where supported, otherwise consolidates the loser record's tags and notes into the winner via customerUpdate.

Its SKILL.md is about 2.4k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts. Compatibility notes: Claude Code, Cursor, Codex, Gemini CLI

It sits in Sales & Support, covering Customer support. It works with Shopify. The repository describes itself as: Community-maintained AI agent skills for operating Shopify stores — workflows, optimization, reports and more. The licence is MIT.

When your agent uses it

  • Tasks that involve Customer support

Example prompts

  • “Use the shopify-admin-customer-merge skill to merge duplicate customer records: invokes Shopify's native customer merge API where supported…”
  • “/shopify-admin-customer-merge”

Requirements

  • Compatibility (from SKILL.md): Claude Code, Cursor, Codex, Gemini CLI

Workflow steps

4 steps, taken from the first numbered list in SKILL.md.

  1. OPERATION: customer — query (called twice: winner and loser)
  2. OPERATION: customerMerge — mutation (only if use_native_merge: true and not dry_run)
  3. OPERATION: customerUpdate — mutation (winner) — fallback path or when use_native_merge: false
  4. OPERATION: customerUpdate — mutation (loser) — only if annotate_loser: true

What it can do on your machine

Read from SKILL.md and the folder at commit 6765cb4. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • shopify

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

  • Compatibility

    Claude Code, Cursor, Codex, Gemini CLI

    From compatibility in the SKILL.md frontmatter.

Context cost

Shopify Admin Customer Merge loads about 2.4k tokens when it runs. Until then it costs about 54 tokens; SKILL.md has 801 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~54
When it runs · the whole SKILL.md, loaded when a task matches
~2.4k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from 40RTY-ai/shopify-admin-skills at commit 6765cb4, republished under its MIT licence (© 40RTY-ai). 801 words, ~2,394 tokens.

Download SKILL.mdSave it as .claude/skills/shopify-admin-customer-merge/SKILL.md (or your agent's skills folder).
name
shopify-admin-customer-merge
description
Merges duplicate customer records: invokes Shopify's native customer merge API where supported, otherwise consolidates the loser record's tags and notes into the winner via customerUpdate.
compatibility
Claude Code, Cursor, Codex, Gemini CLI
role
customer-support
toolkit
shopify-admin, shopify-admin-execution
api_version
2025-01
graphql_operations
customer:query, customerMerge:mutation, customerUpdate:mutation
status
stable

Purpose

Resolves duplicate customer records identified by duplicate-customer-finder. Where the Shopify Admin API exposes customerMerge (a native merge that moves orders, addresses, subscriptions, and metafields onto a winner record), this skill calls it directly. When customerMerge is unavailable or fails for the given account pair, the skill falls back to consolidating searchable metadata — tags, notes, marketing consent — onto the winner via customerUpdate, then writes a clear annotation to the loser record so staff can complete the merge manually in Shopify Admin.

Prerequisites

  • Authenticated Shopify CLI session: shopify store auth --store <domain> --scopes read_customers,write_customers
  • API scopes: read_customers, write_customers

Parameters

ParameterTypeRequiredDefaultDescription
storestringyes—Store domain (e.g., mystore.myshopify.com)
formatstringnohumanOutput format: human or json
dry_runboolnotruePreview merge plan without executing mutations
customer_winner_idstringyes—GID of the customer record to keep (e.g., gid://shopify/Customer/12345)
customer_loser_idstringyes—GID of the customer record to merge into the winner
use_native_mergeboolnotrueTry customerMerge first; if it fails or is unavailable, fall back to consolidation via customerUpdate
merge_tagsboolnotrueUnion the loser's tags onto the winner
merge_noteboolnotrueAppend the loser's note to the winner (with timestamp prefix)
annotate_loserboolnotrueWrite a note on the loser record pointing to the winner GID for manual cleanup

Safety

⚠️ Steps 2–4 execute mutations that modify customer records. customerMerge is irreversible — once orders and addresses are moved to the winner, the loser record is closed and cannot be split back. Run with dry_run: true first to confirm winner/loser GIDs and the merge plan. The default is dry_run: true. Always verify both records belong to the same human (matching email, phone, name) using duplicate-customer-finder output before committing. Do not merge a customer with active subscriptions or unfulfilled orders without confirming downstream systems will follow the new owner GID.

Workflow Steps

  1. OPERATION: customer — query (called twice: winner and loser) Inputs: id: <customer_id>, select id, displayName, firstName, lastName, defaultEmailAddress { emailAddress }, phone, tags, note, numberOfOrders, amountSpent, emailMarketingConsent { marketingState }, smsMarketingConsent { marketingState }, addresses(first: 25) { id }, createdAt Expected output: Both records' full identity payload — abort if either GID does not resolve

  2. OPERATION: customerMerge — mutation (only if use_native_merge: true and not dry_run) Inputs: customerOneId: <customer_winner_id>, customerTwoId: <customer_loser_id>, overrideFields: prefer winner's name/email/phone/locale/marketing-consent Expected output: job.id (merge runs asynchronously), userErrors. If userErrors indicates merge is not supported for this pair (B2B, gift card holder, subscriber, etc.), proceed to step 3 fallback.

  3. OPERATION: customerUpdate — mutation (winner) — fallback path or when use_native_merge: false Inputs: input.id: <customer_winner_id>, input.tags: <union of winner.tags and loser.tags> (only if merge_tags), input.note: <winner.note + "\n[YYYY-MM-DD] Merged from <loser_email>:\n" + loser.note> (only if merge_note) Expected output: customer.id, customer.tags, customer.note, userErrors

  4. OPERATION: customerUpdate — mutation (loser) — only if annotate_loser: true Inputs: input.id: <customer_loser_id>, input.note: "<existing note>\n[YYYY-MM-DD] DUPLICATE — merge target: <customer_winner_id>. Manually close in Shopify Admin once orders are reviewed.", input.tags: <existing + ["duplicate", "merged-loser"]> Expected output: customer.id, customer.tags, customer.note, userErrors

GraphQL Operations

graphql
# customer:query — validated against api_version 2025-01
query CustomerForMerge($id: ID!) {
  customer(id: $id) {
    id
    displayName
    firstName
    lastName
    defaultEmailAddress { emailAddress }
    phone
    tags
    note
    numberOfOrders
    amountSpent { amount currencyCode }
    emailMarketingConsent { marketingState marketingOptInLevel consentUpdatedAt }
    smsMarketingConsent { marketingState marketingOptInLevel consentUpdatedAt }
    addresses(first: 25) { id address1 city provinceCode countryCodeV2 zip }
    createdAt
  }
}
graphql
# customerMerge:mutation — validated against api_version 2025-01
mutation CustomerMerge(
  $customerOneId: ID!
  $customerTwoId: ID!
  $overrideFields: CustomerMergeOverrideFields
) {
  customerMerge(
    customerOneId: $customerOneId
    customerTwoId: $customerTwoId
    overrideFields: $overrideFields
  ) {
    job { id done }
    resultingCustomerId
    userErrors { field message code }
  }
}
graphql
# customerUpdate:mutation — validated against api_version 2025-01
mutation CustomerConsolidate($input: CustomerInput!) {
  customerUpdate(input: $input) {
    customer { id displayName tags note }
    userErrors { field message }
  }
}
Show full SKILL.md (321 more words)Show less

Session Tracking

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

On start, emit:

╔══════════════════════════════════════════════╗
║  SKILL: Customer Merge                       ║
║  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>

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

On completion, emit:

For format: human (default):

══════════════════════════════════════════════
CUSTOMER MERGE OUTCOME
  Winner:           <name> (<email>)  Orders: <n>  Spent: $<n>
  Loser:            <name> (<email>)  Orders: <n>  Spent: $<n>
  Path used:        <native|fallback|skipped>
  Merge job:        <id or "n/a">
  Tags consolidated: <n>
  Note appended:    <yes/no>
  Loser annotated:  <yes/no>
  Errors:           <n>
  Output:           none
══════════════════════════════════════════════

For format: json, emit:

json
{
  "skill": "customer-merge",
  "store": "<domain>",
  "started_at": "<ISO8601>",
  "completed_at": "<ISO8601>",
  "dry_run": true,
  "winner_id": "<gid>",
  "loser_id": "<gid>",
  "outcome": {
    "path": "native|fallback",
    "merge_job_id": "<id or null>",
    "resulting_customer_id": "<gid or null>",
    "tags_consolidated": 0,
    "note_appended": false,
    "loser_annotated": false,
    "errors": 0,
    "output_file": null
  }
}

Output Format

No CSV output. The session summary reports the merge job ID, the resulting customer GID, and which path was taken. For batch merges, run this skill once per pair and capture the JSON output.

Error Handling

ErrorCauseRecovery
THROTTLEDAPI rate limit exceededWait 2 seconds, retry up to 3 times
customerMerge userError: customer has subscriptionsActive subscription on loserCancel subscription before merge or use fallback path
customerMerge userError: B2B customerCompany-affiliated recordUse fallback path; manual merge in Shopify Admin
customerMerge userError: gift card holderLoser owns gift card balanceTransfer gift card or use fallback path
Either GID not foundWrong ID or deleted customerRe-run duplicate-customer-finder
Merge job pendingAsync merge not yet completeRe-query Job(id) to confirm done: true

Best Practices

  1. Always run duplicate-customer-finder first to confirm the pair is genuinely duplicate. Manual misclassifications are unrecoverable.
  2. Pick the winner deliberately: typically the record with more orders, the verified email, or the older createdAt. Avoid making the marketing-consenting record the loser.
  3. Run dry_run: true first; the preview shows both records' order counts and spend so you can sanity-check before committing.
  4. For large dedup runs, write a wrapper script that calls this skill once per pair and feeds it from duplicate-customer-finder's CSV output — never batch merges in a single call.
  5. After native merge, the job.done: false response is normal — Shopify processes merges asynchronously. Re-query the job ID until completion before assuming the loser is closed.
  6. The fallback path (customerUpdate consolidation only) does not move orders. It preserves searchability via tags/notes so a human can finish the merge in Shopify Admin (Customers → Merge).

© 40RTY-ai, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in skills/customer-support/shopify-admin-customer-merge of 40RTY-ai/shopify-admin-skills.

Open the folder on GitHubat commit 6765cb4

Compare with similar skills

Shopify Admin Customer Merge next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Shopify Admin Customer Merge compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Shopify Admin Customer Merge this skill40RTY-ai/shopify-admin-skills194—~2.4kAutomated safety check: PassMIT
Shopify Review Triagegithub/awesome-copilot40k—~4.2kAutomated safety check: PassMIT
Shopify Debug Bundlejeremylongshore/tons-of-skills-marketplace2.8k—~784Automated safety check: PassMIT
Supporthaacked/dotfiles134—~2.9kAutomated safety check: PassNone
Checkout Purchasekeypo-us/keypo-cli182—~880Automated safety check: NotesNone
Company Brain Company QAtopoteretes/cognee32k—~750Automated safety check: NotesApache-2.0

Similar skills

  • Shopify Review Triage

    github/awesome-copilot

    Official

    A skill your agent uses when someone wants public Shopify App Store reviews, low-star reviews, or merchant feedback triaged, prioritized, clustered, or turned into a product or support brief.

    40k GitHub stars~4.2k tokensUpdated 2 days ago
    Sales & SupportAuto-check passed
  • Shopify Debug Bundle

    jeremylongshore/tons-of-skills-marketplace

    Collect Shopify debug evidence including API versions, scopes, rate limit state, and request logs.

    2.8k GitHub stars~784 tokensUpdated yesterday
    Sales & SupportAuto-check passed
  • Support

    haacked/dotfiles

    Support hero workflow — start a ticket investigation with auto-organized notes, find existing notes, or generate the weekly highlights log.

    134 GitHub stars~2.9k tokensUpdated yesterday
    Sales & SupportAuto-check passed
  • Checkout Purchase

    keypo-us/keypo-cli

    A skill your agent uses when the user asks to buy a product from the Shopify store.

    182 GitHub stars~880 tokensUpdated 6 mo ago
    Sales & SupportAuto-check: notes
  • Company Brain Company QA

    topoteretes/cognee

    Build one company memory from a SQL database, a support ticket export and a folder of documents, linked into one graph by cognee, then answer questions that need several of those sources together.

    32k GitHub stars~750 tokensUpdated yesterday
    Sales & SupportAuto-check: notes
  • Afa

    afadtc/afa-dtc-skills

    AFA DTC 全链路独立站操盘系统——系统入口、一级路由器、工作流编排器,统筹品牌基建/付费获客/有机增长/变现留存/运营扩张五大业务线。触发词: 独立站, DTC, 电商, Shopify, 全链路操盘, 独立站诊断, 独立站增长, 90 天增长计划, 不知道从哪开始, 多个问题一起, 帮我做全盘规划, 一件代发, 测品, 测试店, ecommerce, online store, DTC…

    168 GitHub stars~3.2k tokensUpdated 3 days ago
    Sales & SupportAuto-check passed

More from 40RTY-ai/shopify-admin-skills

All 116 skills in this repo
  • Shopify Admin Abandoned Cart Recovery

    40RTY-ai/shopify-admin-skills

    Query checkouts abandoned in the last N days, generate unique discount codes per customer, and tag them for re-engagement.

    194 GitHub stars~1.9k tokensUpdated 1 mo ago
    Auto-check passed
  • Shopify Admin Address Correction

    40RTY-ai/shopify-admin-skills

    Update the shipping address on an unfulfilled order before it ships.

    194 GitHub stars~1.5k tokensUpdated 1 mo ago
    Auto-check passed
  • Shopify Admin Agentic Crawler Access

    40RTY-ai/shopify-admin-skills

    Edit the theme's robots.txt.liquid to explicitly allow AI crawlers (GPTBot, ClaudeBot, PerplexityBot, Google-Extended, OAI-SearchBot, Amazonbot) so AI assistants are permitted to read the catalog.

    194 GitHub stars~1.8k tokensUpdated 1 mo ago
    Auto-check passed
  • Rewrite thin product descriptions into structured, fact-rich copy (materials, fit, use-cases, the words shoppers actually type) so AI agents have something concrete to quote and match.

    194 GitHub stars~1.6k tokensUpdated 1 mo ago
    Auto-check passed
  • Shopify Admin Agentic Image Alt Text

    40RTY-ai/shopify-admin-skills

    Generate and set descriptive alt text on product images so AI agents (which can't 'see' pixels) can understand and recommend what each product looks like.

    194 GitHub stars~1.6k tokensUpdated 1 mo ago
    Auto-check passed
  • Shopify Admin Agentic LLMs Txt

    40RTY-ai/shopify-admin-skills

    Generate and publish an /llms.txt guide (brand summary, flagship products, key policies, contact) via a theme template so AI assistants get a curated, machine-readable map of the store.

    194 GitHub stars~1.8k tokensUpdated 1 mo ago
    Auto-check passed

Works with

Categories

Questions about Shopify Admin Customer Merge

What does Shopify Admin Customer Merge do?

Merges duplicate customer records: invokes Shopify's native customer merge API where supported, otherwise consolidates the loser record's tags and notes into the winner via customerUpdate. Shopify Admin Customer Merge is an agent skill from 40RTY-ai/shopify-admin-skills. Merges duplicate customer records: invokes Shopify's native customer merge API where supported, otherwise consolidates the loser record's tags and notes into the winner via customerUpdate.

When should I use Shopify Admin Customer Merge?

Shopify Admin Customer Merge fits situations like: tasks that involve Customer support.

How do I install Shopify Admin Customer Merge in Claude Code?

Run `npx skills add 40RTY-ai/shopify-admin-skills --skill shopify-admin-customer-merge -a claude-code`. Or copy the skill folder (skills/customer-support/shopify-admin-customer-merge in 40RTY-ai/shopify-admin-skills) into .claude/skills/shopify-admin-customer-merge in your project. Claude Code loads it when a task matches its description.

How do I install Shopify Admin Customer Merge in Codex?

Run `npx skills add 40RTY-ai/shopify-admin-skills --skill shopify-admin-customer-merge -a codex`. Or copy the skill folder (skills/customer-support/shopify-admin-customer-merge in 40RTY-ai/shopify-admin-skills) into .agents/skills/shopify-admin-customer-merge in your project. Codex loads it when a task matches its description.

Can I use Shopify Admin Customer Merge in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add 40RTY-ai/shopify-admin-skills --skill shopify-admin-customer-merge -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/shopify-admin-customer-merge, .gemini/skills/shopify-admin-customer-merge, .github/skills/shopify-admin-customer-merge and .opencode/skills/shopify-admin-customer-merge in your project.

What does Shopify Admin Customer Merge need to run?

Going by SKILL.md and its folder, Shopify Admin Customer Merge needs the command-line tools its instructions call (shopify). Compatibility (from SKILL.md): Claude Code, Cursor, Codex, Gemini CLI.

Does Shopify Admin Customer Merge access the network?

SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.

Is Shopify Admin Customer Merge safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Shopify Admin Customer Merge use?

Shopify Admin Customer Merge is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Shopify Admin Customer Merge use?

About 2.4k tokens (SKILL.md is roughly 9.6k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Shopify Admin Customer Merge?

Skills that share tags, products or a category with Shopify Admin Customer Merge: Shopify Review Triage (github/awesome-copilot, 40k stars), Shopify Debug Bundle (jeremylongshore/tons-of-skills-marketplace, 2.8k stars), Support (haacked/dotfiles, 134 stars) and Checkout Purchase (keypo-us/keypo-cli, 182 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Shopify Admin Customer Merge?

40RTY-ai (a GitHub organization) maintains it in 40RTY-ai/shopify-admin-skills, which has 194 GitHub stars. The repository holds 116 skills in this directory. The repository was last updated on August 14, 2026.

Source: 40RTY-ai/shopify-admin-skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.