# Shopify Store Auditor: SEO & Product Catalog Audit (`siftwright_data/shopify-store-auditor`) Actor

Audit any Shopify store's catalog: thin or missing descriptions, images without alt text, duplicate titles, zero prices, missing product types and tags. 0-100 score per store plus every flagged product. No login or app needed.

- **URL**: https://apify.com/siftwright_data/shopify-store-auditor.md
- **Developed by:** [Siftwright Data](https://apify.com/siftwright_data) (community)
- **Categories:** E-commerce, SEO tools, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $30.00 / 1,000 store auditeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Shopify Store Auditor: SEO & Product Catalog Audit

Audit any Shopify store's product catalog in seconds, **your own or a competitor's**, with no login, app install or API key. Get a **0-100 catalog score** per store, the top issues, and every product that needs fixing.

It reads the store's public product feed, so it works on most Shopify stores and audits thousands of products per minute.

### What it checks

| Check | Why it matters |
|---|---|
| **Thin or missing descriptions** (under 30 words by default) | Thin pages rank poorly and convert worse |
| **Images missing alt text** | Hurts image SEO and accessibility; a common basis for ADA complaints against online stores |
| **No images / only one image** | Shoppers buy less when they can't see the product |
| **Duplicate product titles** | Competing pages and confused shoppers |
| **Variants priced at 0** | Usually a setup mistake |
| **Missing product type, vendor or tags** | Breaks filtering, collections and Google Shopping feeds |
| **Over-long or all-caps titles** | Truncated in search results |
| **Variants without SKU** | Inventory and feed problems |
| **Out of stock** | Reported separately, not counted as an error |

### Who it's for

- **Shopify agencies and freelancers:** audit prospects' stores in bulk and open the conversation with real numbers.
- **SEO consultants:** a fast catalog health check before a full audit.
- **Store owners:** find every product with a weak description or missing alt text, then fix them in order.
- **Competitive research:** catalog size, price range, vendors and product types for any list of stores.

### Input

```json
{
  "stores": ["allbirds.com", "deathwishcoffee.com", "https://shop.example.com"],
  "output": "summaryAndFlagged",
  "thinWordThreshold": 30
}
```

- **Stores:** domains or URLs. Custom domains and `.myshopify.com` both work.
- **What to save:** store summary plus products with major issues (default), every product, or summaries only.
- **Alt text check:** alt text needs one extra request per product, so it is checked on the first 250 products with images per store (adjustable; 0 turns it off).

### Output

One **store summary** per store:

```json
{
  "type": "store",
  "store": "www.example-store.com",
  "status": "ok",
  "catalogScore": 68,
  "productsAudited": 692,
  "productsWithMajorIssues": 393,
  "thinOrMissingDescriptionsPercent": 32.7,
  "medianDescriptionWords": 41,
  "imagesMissingAltPercent": 100,
  "altTextProductsChecked": 250,
  "outOfStockPercent": 44.7,
  "topIssues": [
    { "issue": "imagesMissingAltText", "label": "Images missing alt text", "products": 250, "percent": 100 },
    { "issue": "thinDescription", "label": "Description under 30 words", "products": 196, "percent": 28.3 }
  ],
  "vendors": 1,
  "productTypes": 12,
  "priceMin": 8,
  "priceMax": 165
}
```

And one **product row** per flagged product, with `title`, `url`, `issues`, `descriptionWords`, `descriptionPreview`, `imageCount`, `imagesMissingAlt`, `productType`, `vendor`, `tags`, prices and stock.

Stores that aren't Shopify, are password-protected, or have the public feed turned off come back with a `status` saying so, and are **not charged**.

### Pricing

- **$0.03 per store audited.**
- **$0.50 per 1,000 product rows** saved (choose "Store summary only" to pay just per store).

### FAQ

**Is this allowed?** It reads the same public product data that Shopify serves to every visitor and to Google. It doesn't log in or collect any personal data.

**Why is alt text checked on a sample?** Shopify's bulk feed doesn't include alt text, so each product is checked individually. Raise the limit to check every product.

**What makes the score?** A weighted share of products with each issue: missing or thin descriptions and missing images weigh most, then alt text, zero prices and duplicate titles, then minor data gaps.

**Missing a check?** Request it in the Issues tab.

### About Siftwright

Siftwright is a small data-tools studio. Tools are built and maintained with AI-powered tooling and monitored daily.

# Actor input Schema

## `stores` (type: `array`):

Store domains or URLs, e.g. allbirds.com or https://shop.example.com. Works with any Shopify store whose public product feed is on (most are).

## `output` (type: `string`):

Store summaries are always saved. Choose which product rows to add.

## `thinWordThreshold` (type: `integer`):

Descriptions shorter than this are flagged as thin.

## `maxProductsPerStore` (type: `integer`):

Large catalogs are audited up to this many products.

## `concurrency` (type: `integer`):

How many stores to audit at the same time.

## `altTextCheckLimit` (type: `integer`):

Checking image alt text takes one extra request per product, so it runs on the first N products with images. 0 turns it off.

## Actor input object example

```json
{
  "stores": [
    "allbirds.com",
    "bombas.com"
  ],
  "output": "summaryAndFlagged",
  "thinWordThreshold": 30,
  "maxProductsPerStore": 2000,
  "concurrency": 4,
  "altTextCheckLimit": 250
}
```

# Actor output Schema

## `results` (type: `string`):

Store summaries and product rows.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "stores": [
        "allbirds.com",
        "bombas.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("siftwright_data/shopify-store-auditor").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "stores": [
        "allbirds.com",
        "bombas.com",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("siftwright_data/shopify-store-auditor").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "stores": [
    "allbirds.com",
    "bombas.com"
  ]
}' |
apify call siftwright_data/shopify-store-auditor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,siftwright_data/shopify-store-auditor"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/zgV8PNImem0Q5m79u/builds/WbYJtHMVxMGQG3GRi/openapi.json
