Product Data Completeness Score

Read-only: scores each product on data completeness across description, images, SEO, weight, barcode, cost, and metafields.

shopify-admin-product-data-completeness-score


Purpose

Calculates a data completeness score (0–100) for each active product based on the presence of key fields: description, images, SEO title, SEO description, variant weight, barcode, cost, and specified metafields. Produces a ranked list of products needing the most data work. Read-only — no mutations. Catalog health report in a single pass.


Prerequisites

  • Authenticated Shopify CLI session: shopify store auth --store --scopes read_products
  • API scopes: read_products

  • Parameters


    ParameterTypeRequiredDefaultDescription
    storestringyesStore domain (e.g., mystore.myshopify.com)
    status_filterstringnoactiveProduct status to score: active, draft, or all
    required_metafieldsarrayno[]List of namespace.key metafields that are required (e.g., ["custom.material"])
    formatstringnohumanOutput format: human or json

    Safety


    > ℹ️ Read-only skill — no mutations are executed. Safe to run at any time.


    Scoring Rubric


    FieldPoints
    Description present (non-empty)15
    At least 1 image15
    SEO title present10
    SEO description present10
    At least 1 variant with barcode10
    At least 1 variant with cost10
    At least 1 variant with weight10
    All required metafields present20 (split evenly)
    Total100

    Workflow Steps


  • OPERATION: products — query
  • Inputs: query: "status:", first: 250, select all completeness fields, pagination cursor

    Expected output: Products with all scored fields; paginate until hasNextPage: false


  • Score each product per rubric; rank ascending by score

  • GraphQL Operations


    # products:query — validated against api_version 2025-01
    query ProductCompleteness($query: String!, $after: String) {
      products(first: 250, after: $after, query: $query) {
        edges {
          node {
            id
            title
            handle
            descriptionHtml
            images(first: 1) {
              edges {
                node {
                  id
                }
              }
            }
            seo {
              title
              description
            }
            variants(first: 10) {
              edges {
                node {
                  id
                  barcode
                  weight
                  inventoryItem {
                    unitCost {
                      amount
                    }
                  }
                }
              }
            }
            metafields(first: 20) {
              edges {
                node {
                  namespace
                  key
                  value
                }
              }
            }
          }
        }
        pageInfo {
          hasNextPage
          endCursor
        }
      }
    }
    

    Session Tracking


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


    On start, emit:

    ╔══════════════════════════════════════════════╗
    ║  SKILL: Product Data Completeness Score      ║
    ║  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>
    

    On completion, emit:


    For format: human (default):

    ══════════════════════════════════════════════
    PRODUCT DATA COMPLETENESS REPORT
      Products scored:  <n>
      Avg score:        <pct>/100
      Score < 50:       <n> products (need urgent attention)
      Score 50–79:      <n> products
      Score ≥ 80:       <n> products
    
      Lowest scoring products:
        "<title>"  Score: <n>/100  Missing: description, SEO title
      Output: completeness_<date>.csv
    ══════════════════════════════════════════════
    

    For format: json, emit:

    {
      "skill": "product-data-completeness-score",
      "store": "<domain>",
      "products_scored": 0,
      "avg_score": 0,
      "below_50_count": 0,
      "output_file": "completeness_<date>.csv"
    }
    

    Output Format

    CSV file completeness_.csv with columns:

    product_id, title, score, has_description, image_count, has_seo_title, has_seo_description, has_barcode, has_cost, has_weight, missing_metafields


    Error Handling

    ErrorCauseRecovery
    THROTTLEDAPI rate limit exceededWait 2 seconds, retry up to 3 times
    No products match filterEmpty catalog or wrong filterExit with 0 results

    Best Practices

  • Use this skill as a pre-launch gate — run before activating DRAFT products to ensure all required fields are filled.
  • Tune required_metafields to your store's specific needs (e.g., custom.material for apparel, custom.ingredients for food).
  • A score below 50 typically means a product is missing foundational content (description or images) and should be deprioritized from launch until fixed.
  • Run monthly to track catalog quality trends over time; improvements after a content sprint should be visible in the average score.