Claude
Skills
Sign in
Back

ecommerce-platform-specialist

Included with Lifetime
$97 forever

Provide expert guidance on Shopify e-commerce platform. Advises on store setup, products, customization, and optimization.

General

What this skill does


# Shopify Development Expert

## Purpose

Provide comprehensive, accurate guidance for building on Shopify's platform based on 24+ official documentation files. Cover all aspects of app development, theme customization, API integration, checkout extensions, and e-commerce features.

## Documentation Coverage

**Full access to official Shopify documentation (when available):**
- **Location:** `docs/shopify/`
- **Files:** 25 markdown files
- **Coverage:** Complete API reference, guides, best practices, and implementation patterns

**Note:** Documentation must be pulled separately:
```bash
pipx install docpull
docpull https://shopify.dev/docs -o .claude/skills/shopify/docs
```

**Major Areas:**
- GraphQL Admin API (products, orders, customers, inventory)
- Storefront API (cart, checkout, customer accounts)
- REST Admin API (legacy support)
- App development (authentication, webhooks, extensions)
- Theme development (Liquid, sections, blocks)
- Headless commerce (Hydrogen, Oxygen)
- Checkout customization (UI extensions, validation)
- Shopify Functions (discounts, delivery, payments)
- POS extensions (in-person sales)
- Subscriptions and selling plans
- Metafields and custom data
- Shopify Flow automation
- CLI and development tools
- Privacy and compliance
- Performance optimization

## When to Use

Invoke when user mentions:
- **Platform:** Shopify, e-commerce, online store, merchant
- **APIs:** GraphQL, REST, Storefront API, Admin API
- **Products:** product management, collections, variants, inventory
- **Orders:** order processing, fulfillment, shipping
- **Customers:** customer data, accounts, authentication
- **Checkout:** checkout customization, payment methods, delivery options
- **Themes:** Liquid templates, theme development, sections, blocks
- **Apps:** app development, extensions, webhooks, OAuth
- **Headless:** Hydrogen, React, headless commerce, Oxygen
- **Functions:** Shopify Functions, custom logic, discounts
- **Subscriptions:** recurring billing, selling plans, subscriptions
- **Tools:** Shopify CLI, development workflow
- **POS:** point of sale, retail, in-person payments

## How to Use Documentation

When answering questions:

1. **Search for specific topics:**
   ```bash
   # Use Grep to find relevant docs
   grep -r "checkout" .claude/skills/shopify/docs/ --include="*.md"
   ```

2. **Read specific documentation:**
   ```bash
   # API docs
   cat .claude/skills/shopify/docs/shopify/api-admin-graphql.md
   cat .claude/skills/shopify/docs/shopify/api-storefront.md
   ```

3. **Find implementation guides:**
   ```bash
   # List all guides
   ls .claude/skills/shopify/docs/shopify/
   ```

## Core Authentication

### OAuth 2.0 Flow

```javascript
// Redirect to Shopify OAuth
const authUrl = `https://${shop}/admin/oauth/authorize?` +
  `client_id=${process.env.SHOPIFY_API_KEY}&` +
  `scope=read_products,write_products&` +
  `redirect_uri=${redirectUri}&` +
  `state=${nonce}`;

// Exchange code for access token
const response = await fetch(
  `https://${shop}/admin/oauth/access_token`,
  {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({
      client_id: process.env.SHOPIFY_API_KEY,
      client_secret: process.env.SHOPIFY_API_SECRET,
      code
    })
  }
);

const { access_token } = await response.json();
```

### Session Tokens (Modern Embedded Apps)

```javascript
import { shopifyApi } from '@shopify/shopify-api';

const shopify = shopifyApi({
  apiKey: process.env.SHOPIFY_API_KEY,
  apiSecretKey: process.env.SHOPIFY_API_SECRET,
  scopes: ['read_products', 'write_products'],
  hostName: process.env.HOST,
  isEmbeddedApp: true,
});
```

## GraphQL Admin API

### Query Products

```graphql
query {
  products(first: 10) {
    edges {
      node {
        id
        title
        handle
        priceRange {
          minVariantPrice {
            amount
            currencyCode
          }
        }
        variants(first: 5) {
          edges {
            node {
              id
              sku
              inventoryQuantity
            }
          }
        }
      }
    }
  }
}
```

### Create Product

```graphql
mutation {
  productCreate(input: {
    title: "New Product"
    vendor: "My Store"
    productType: "Apparel"
    variants: [{
      price: "29.99"
      sku: "PROD-001"
    }]
  }) {
    product {
      id
      title
    }
    userErrors {
      field
      message
    }
  }
}
```

### Fetch Orders

```graphql
query {
  orders(first: 25, query: "fulfillment_status:unfulfilled") {
    edges {
      node {
        id
        name
        createdAt
        totalPriceSet {
          shopMoney {
            amount
            currencyCode
          }
        }
        customer {
          email
        }
        lineItems(first: 10) {
          edges {
            node {
              title
              quantity
            }
          }
        }
      }
    }
  }
}
```

## Storefront API

### Create Cart

```graphql
mutation {
  cartCreate(input: {
    lines: [{
      merchandiseId: "gid://shopify/ProductVariant/123"
      quantity: 1
    }]
  }) {
    cart {
      id
      checkoutUrl
      cost {
        totalAmount {
          amount
          currencyCode
        }
      }
    }
  }
}
```

### Update Cart

```graphql
mutation {
  cartLinesUpdate(
    cartId: "gid://shopify/Cart/xyz"
    lines: [{
      id: "gid://shopify/CartLine/abc"
      quantity: 2
    }]
  ) {
    cart {
      id
      lines(first: 10) {
        edges {
          node {
            quantity
          }
        }
      }
    }
  }
}
```

## Webhooks

### Setup Webhook

```javascript
// Register webhook via API
const webhook = await shopify.webhooks.register({
  topic: 'ORDERS_CREATE',
  address: 'https://your-app.com/webhooks/orders-create',
  format: 'json'
});
```

### Verify Webhook

```javascript
import crypto from 'crypto';

function verifyWebhook(body, hmacHeader, secret) {
  const hash = crypto
    .createHmac('sha256', secret)
    .update(body, 'utf8')
    .digest('base64');

  return hash === hmacHeader;
}

// In webhook handler
app.post('/webhooks/orders-create', async (req, res) => {
  const hmac = req.headers['x-shopify-hmac-sha256'];
  const body = await req.text();

  if (!verifyWebhook(body, hmac, process.env.SHOPIFY_API_SECRET)) {
    return res.status(401).send('Invalid HMAC');
  }

  const order = JSON.parse(body);
  // Process order...

  res.status(200).send('OK');
});
```

## Liquid Templates

### Basic Liquid

```liquid
<!-- Output product title -->
{{ product.title }}

<!-- Conditional logic -->
{% if product.available %}
  <button>Add to Cart</button>
{% else %}
  <span>Sold Out</span>
{% endif %}

<!-- Loop through variants -->
{% for variant in product.variants %}
  <option value="{{ variant.id }}">
    {{ variant.title }} - {{ variant.price | money }}
  </option>
{% endfor %}
```

### Custom Section

```liquid
{% schema %}
{
  "name": "Featured Product",
  "settings": [
    {
      "type": "product",
      "id": "product",
      "label": "Product"
    }
  ]
}
{% endschema %}

{% if section.settings.product %}
  {% assign product = section.settings.product %}
  <div class="featured-product">
    <img src="{{ product.featured_image | img_url: '500x' }}" alt="{{ product.title }}">
    <h2>{{ product.title }}</h2>
    <p>{{ product.price | money }}</p>
  </div>
{% endif %}
```

## Shopify Functions

### Discount Function

```javascript
// Function to apply volume discount
export default (input) => {
  const quantity = input.cart.lines.reduce((sum, line) => sum + line.quantity, 0);

  let discountPercentage = 0;
  if (quantity >= 10) discountPercentage = 20;
  else if (quantity >= 5) discountPercentage = 10;

  if (discountPercentage > 0) {
    return {
      discounts: [{
        message: `${discountPercentage}% volume discount`,
        targets: [{
          orderSubtotal: {
            excludedVariantIds: []
          }
        }],
        value: {
          percentage

Related in General