Gift Card Issuance

Issue Shopify gift cards (store credit) to customers as a goodwill gesture, post-return incentive, or loyalty reward.

shopify-admin-gift-card-issuance


Purpose

Issues Shopify native gift cards to customers programmatically — as goodwill for a delayed shipment, as store credit instead of a cash refund, or as a loyalty reward. Uses Shopify's built-in gift card system; no 3rd-party app required. Gift cards issued here are redeemable at checkout exactly like manual gift cards. Note: giftCardCreate is available on all Shopify plans but may require the store to have gift cards enabled in settings.


Prerequisites

  • shopify auth login --store
  • API scopes: read_customers, write_gift_cards
  • Gift cards must be enabled in Shopify admin → Settings → Gift cards

  • Parameters


    ParameterTypeRequiredDefaultDescription
    storestringyesStore domain (e.g., mystore.myshopify.com)
    formatstringnohumanOutput format: human or json
    dry_runboolnofalsePreview operations without executing mutations
    customer_emailstringyes*Customer email to look up and associate with the gift card
    customer_idstringyes*Customer GID (alternative to email)
    amountfloatyesGift card value in the store's default currency
    reasonstringnoInternal note logged on the gift card (e.g., "Goodwill: delayed shipment #1042")
    expires_onstringnoExpiry date in ISO 8601 (e.g., 2026-12-31); if omitted, gift card does not expire
    tag_customerstringnoOptional tag to add to the customer record (e.g., goodwill-issued)

    *One of customer_email or customer_id is required.


    Safety


    > ⚠️ Step 2 executes giftCardCreate which issues real monetary value against your store. Gift cards cannot be deleted once created — they can only be disabled. Run with dry_run: true to confirm the customer, amount, and expiry before committing. Verify the amount carefully — issued value is immediately redeemable at checkout.


    Workflow Steps


  • OPERATION: customer — query
  • Inputs: Look up by customer_email (using customers search) or directly by customer_id

    Expected output: Customer id, firstName, lastName, email; confirm customer exists before issuing


  • OPERATION: giftCardCreate — mutation
  • Inputs: input.initialValue, input.customerId, input.expiresOn (optional), input.note (reason)

    Expected output: giftCard.id, giftCard.code, giftCard.balance, giftCard.expiresOn, userErrors


    GraphQL Operations


    # customer:query — validated against api_version 2025-01
    query CustomerByEmail($query: String!) {
      customers(first: 1, query: $query) {
        edges {
          node {
            id
            firstName
            lastName
            defaultEmailAddress {
              emailAddress
            }
            tags
          }
        }
      }
    }
    

    # giftCardCreate:mutation — validated against api_version 2025-01
    mutation GiftCardCreate($input: GiftCardCreateInput!) {
      giftCardCreate(input: $input) {
        giftCard {
          id
          code
          balance {
            amount
            currencyCode
          }
          expiresOn
          note
          customer {
            id
          }
        }
        userErrors {
          field
          message
        }
      }
    }
    

    Session Tracking


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


    On start, emit:

    ╔══════════════════════════════════════════════╗
    ║  SKILL: gift-card-issuance                   ║
    ║  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):

    ══════════════════════════════════════════════
    OUTCOME SUMMARY
      Customer:        <name> (<email>)
      Gift card code:  <code>
      Amount:          <amount> <currency>
      Expires:         <date or "Does not expire">
      Errors:          0
      Output:          none
    ══════════════════════════════════════════════
    

    For format: json, emit:

    {
      "skill": "gift-card-issuance",
      "store": "<domain>",
      "started_at": "<ISO8601>",
      "completed_at": "<ISO8601>",
      "dry_run": false,
      "steps": [
        { "step": 1, "operation": "CustomerByEmail", "type": "query", "params_summary": "email <email>", "result_summary": "customer <id>", "skipped": false },
        { "step": 2, "operation": "GiftCardCreate", "type": "mutation", "params_summary": "amount <amount>, customer <id>", "result_summary": "gift card <code>", "skipped": false }
      ],
      "outcome": {
        "customer_id": "<id>",
        "customer_email": "<email>",
        "gift_card_id": "<id>",
        "gift_card_code": "<code>",
        "amount": "<amount>",
        "currency": "<currency>",
        "expires_on": "<date or null>",
        "errors": 0,
        "output_file": null
      }
    }
    

    Output Format

    No CSV. The session summary reports the gift card code and amount inline. The support agent copies the code to share with the customer.


    Gift card issued:
      Customer:  Jane Smith (jane@example.com)
      Code:      ABCD-EFGH-IJKL-MNOP
      Value:     $25.00 USD
      Expires:   2026-12-31 (or "Does not expire")
      Note:      Goodwill: delayed shipment #1042
    

    Error Handling

    ErrorCauseRecovery
    Customer not foundEmail doesn't match any customerVerify email; guest checkout customers may not have a customer record
    userErrors from giftCardCreateInvalid amount (≤ 0) or missing required fieldVerify amount is a positive number
    Gift cards not enabledStore settings don't allow gift cardsEnable in Shopify admin → Settings → Gift cards
    write_gift_cards scope missingAuth was done without this scopeRe-run shopify store auth with write_gift_cards scope

    Best Practices

  • Always run dry_run: true to confirm customer lookup succeeds and amount is correct before issuing.
  • Always include a reason note — it appears in the gift card record and helps your team audit issuances later.
  • Set tag_customer: goodwill-issued to track which customers have received goodwill gift cards — combine with loyalty-segment-export to monitor their subsequent purchase behavior.
  • Use expires_on for promotional gift cards (e.g., holiday campaigns) to create urgency; omit for goodwill issuances so the customer feels the gesture is genuine.
  • For batch issuances (e.g., a service outage affecting 100 customers), loop through a customer list using format: json to capture each gift card code for your records.