# Etsy Shop Sales & Listing Competitor Monitor (`feeng/etsy-competitor-pulse`) Actor

🛍️ Track Etsy competitor listing launches, price moves, and public shop growth signals with history, structured views, and RSS fallback.

- **URL**: https://apify.com/feeng/etsy-competitor-pulse.md
- **Developed by:** [Daniel S.](https://apify.com/feeng) (community)
- **Categories:** E-commerce, Marketing, Business
- **Stats:** 2 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $15.00 / 1,000 successful shop snapshots

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## Etsy Shop Sales & Listing Competitor Monitor

Monitor Etsy competitor shops for sales growth, listing launches, removals, price changes, reviews, and daily velocity. 🛍️ Turn public shop signals into a historical competitor leaderboard without calling another Actor or requiring an Etsy API key.

### Why Etsy sellers use it ✨

- **💰 Sales movement:** compare visible lifetime sales with the previous snapshot and estimate observed sales per day.
- **🆕 Listing activity:** detect visible new and removed listings and changes in active listing count.
- **🏷️ Price intelligence:** track visible listing price bands and changed prices.
- **⭐ Reputation signals:** monitor review, rating, and admirer movement where publicly available.
- **📈 Historical trends:** retain shop snapshots for scheduled daily or weekly monitoring.
- **🏆 Competitor leaderboard:** receive a visual HTML report with sales, listings, velocity, and opportunity signals.

This Actor is self-contained. It fetches public Etsy shop pages directly with lightweight HTTP and Playwright retries. If Etsy blocks the main page, it falls back to the shop's public RSS feed for recent listing IDs, titles, prices, images, and publication times. In RSS mode, unavailable shop totals such as lifetime sales and reviews are returned as `null`, never guessed.

### Best use cases 🎯

- Etsy competitor tracking
- Daily shop sales and listing monitoring
- Print-on-demand niche research
- Handmade and digital-product market intelligence
- New-product and pricing strategy analysis
- Seller acquisition and due diligence

### Input

```json
{
  "shops": [
    "https://www.etsy.com/shop/CaitlynMinimalist",
    "ModParty"
  ],
  "compareWithPrevious": true,
  "saveSnapshot": true,
  "maxListingsPerShop": 40,
  "historyDays": 30,
  "includeListings": true,
  "includeHtmlReport": true,
  "useBrowserFallback": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"]
  },
  "snapshotStoreName": "etsy-competitor-pulse-history"
}
````

Run the same input on a schedule and keep `snapshotStoreName` unchanged. The first run creates a baseline; later runs calculate deltas.

### Output 📊

One successful dataset row is produced per shop. The default dataset includes flat columns for direct sorting and export, while the original nested evidence remains available. Use the `overview`, `changes`, `listings`, and `allData` views.

- `totals.sales`, `totals.activeListings`, `totals.reviewCount`, `totals.rating`, and `totals.admirers`
- `delta.salesDelta`, `listingDelta`, `reviewDelta`, and `admirerDelta`
- `delta.newListings`, `removedListings`, and `priceChanges`
- `trend.salesVelocity`, `listingVelocity`, and `reviewVelocity`
- visible listing price range and category signals
- evidence-based summary, confidence, and suggested actions

The key-value store also contains `REPORT.html`, `REPORT_SUMMARY.json`, `OUTPUT.json`, `OUTPUT.csv`, and `ERRORS.json`. Failed shops are not written to the paid dataset.

### What “daily sales” means

Etsy publicly displays a shop's cumulative sales count on supported shop pages. The Actor stores that total and subtracts the previous snapshot. A change from 10,000 to 10,012 means **12 observed additional sales between checks**. It does not reveal order values, exact units per listing, private revenue, or refunded orders.

### Schedule automatic competitor tracking 🔁

1. Run once to establish baselines.
2. Save the input as an Apify Task.
3. Schedule the task daily at a consistent time.
4. Connect run-success or dataset webhooks to email, Slack, Sheets, Make, Zapier, or n8n.

### Pricing 💵

Store price: **$0.01 per run plus $0.015 per successful shop snapshot** using Pay per event.

- 5 competitors checked daily: about $2.55/month
- 10 competitors checked daily: about $4.80/month
- 25 competitors checked weekly: about $1.79/month

The price is designed to cover browser execution and residential proxy transfer while remaining far below typical Etsy intelligence subscriptions. Failed or blocked shops are saved to `ERRORS.json` and are not charged as dataset results.

### SEO positioning 🚀

**Store title:** Etsy Shop Sales & Listing Competitor Monitor

**SEO title:** Etsy Competitor Tracker: Sales & Listings Monitor

**SEO description:** Track Etsy competitor shops daily for sales growth, new listings, removed products, price changes, reviews, and shop velocity. Get history and visual reports.

**Keywords:** Etsy competitor tracker, Etsy shop sales tracker, Etsy listing monitor, Etsy shop analyzer, Etsy sales estimate, Etsy product research, Etsy seller intelligence, Etsy competitor analysis, Etsy price tracker.

### Reliability and limitations

- Etsy can change page markup or block requests. The public RSS fallback keeps recent listing monitoring available, but lifetime sales, active listing totals, reviews, ratings, and admirers require an accessible main shop page.
- Only public signals are collected. The Actor does not access seller accounts, private orders, customer data, or internal Etsy analytics.
- Visible listings may represent only the shop page subset Etsy serves during the run.
- Use the data responsibly and comply with applicable law and Etsy's terms.

This is an unofficial independent tool and is not affiliated with, endorsed by, or sponsored by Etsy.

# Actor input Schema

## `shops` (type: `array`):

Etsy shop URLs or shop names to monitor.

## `compareWithPrevious` (type: `boolean`):

Compare current shop snapshots with the previous saved snapshot.

## `saveSnapshot` (type: `boolean`):

Save current results for future daily comparisons.

## `maxListingsPerShop` (type: `integer`):

Maximum number of visible listing snippets to extract per shop.

## `historyDays` (type: `integer`):

Number of days of history to keep in the Actor key-value store and show in the report.

## `fetchTimeoutSecs` (type: `integer`):

Maximum time to wait for each Etsy shop page request.

## `includeListings` (type: `boolean`):

Include visible listing snippets in dataset output and report analysis.

## `includeHtmlReport` (type: `boolean`):

Generate a visual HTML report with trend charts and save it to the run key-value store.

## `useBrowserFallback` (type: `boolean`):

Use Playwright/Chromium when Etsy blocks fast HTTP requests. Recommended for reliability.

## `proxyConfiguration` (type: `object`):

Etsy often blocks datacenter traffic. Residential Apify Proxy is the reliable default for this standalone monitor.

## `snapshotStoreName` (type: `string`):

Named key-value store used to keep shop histories across Actor runs.

## Actor input object example

```json
{
  "shops": [
    "https://www.etsy.com/shop/CaitlynMinimalist",
    "https://www.etsy.com/shop/ModParty"
  ],
  "compareWithPrevious": true,
  "saveSnapshot": true,
  "maxListingsPerShop": 40,
  "historyDays": 30,
  "fetchTimeoutSecs": 30,
  "includeListings": true,
  "includeHtmlReport": true,
  "useBrowserFallback": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  },
  "snapshotStoreName": "etsy-competitor-pulse-history"
}
```

# Actor output Schema

## `shopPulse` (type: `string`):

Flat sales, listings, reviews, velocity, and action columns.

## `changes` (type: `string`):

No description

## `listingIntelligence` (type: `string`):

No description

## `allData` (type: `string`):

No description

## `htmlReport` (type: `string`):

No description

## `csvExport` (type: `string`):

No description

## `jsonExport` (type: `string`):

No description

## `runSummary` (type: `string`):

No description

## `errors` (type: `string`):

No description

# 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 = {
    "shops": [
        "https://www.etsy.com/shop/CaitlynMinimalist",
        "https://www.etsy.com/shop/ModParty"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("feeng/etsy-competitor-pulse").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 = { "shops": [
        "https://www.etsy.com/shop/CaitlynMinimalist",
        "https://www.etsy.com/shop/ModParty",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("feeng/etsy-competitor-pulse").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "shops": [
    "https://www.etsy.com/shop/CaitlynMinimalist",
    "https://www.etsy.com/shop/ModParty"
  ]
}' |
apify call feeng/etsy-competitor-pulse --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=feeng/etsy-competitor-pulse",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Etsy Shop Sales & Listing Competitor Monitor",
        "description": "🛍️ Track Etsy competitor listing launches, price moves, and public shop growth signals with history, structured views, and RSS fallback.",
        "version": "0.1",
        "x-build-id": "6ozfzrquqKzirJ7fv"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/feeng~etsy-competitor-pulse/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-feeng-etsy-competitor-pulse",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/feeng~etsy-competitor-pulse/runs": {
            "post": {
                "operationId": "runs-sync-feeng-etsy-competitor-pulse",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/feeng~etsy-competitor-pulse/run-sync": {
            "post": {
                "operationId": "run-sync-feeng-etsy-competitor-pulse",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "shops"
                ],
                "properties": {
                    "shops": {
                        "title": "Etsy shops",
                        "type": "array",
                        "description": "Etsy shop URLs or shop names to monitor.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "compareWithPrevious": {
                        "title": "Compare with previous run",
                        "type": "boolean",
                        "description": "Compare current shop snapshots with the previous saved snapshot.",
                        "default": true
                    },
                    "saveSnapshot": {
                        "title": "Save snapshot",
                        "type": "boolean",
                        "description": "Save current results for future daily comparisons.",
                        "default": true
                    },
                    "maxListingsPerShop": {
                        "title": "Max listings per shop",
                        "minimum": 0,
                        "maximum": 240,
                        "type": "integer",
                        "description": "Maximum number of visible listing snippets to extract per shop.",
                        "default": 40
                    },
                    "historyDays": {
                        "title": "History days",
                        "minimum": 2,
                        "maximum": 365,
                        "type": "integer",
                        "description": "Number of days of history to keep in the Actor key-value store and show in the report.",
                        "default": 30
                    },
                    "fetchTimeoutSecs": {
                        "title": "Fetch timeout in seconds",
                        "minimum": 5,
                        "maximum": 120,
                        "type": "integer",
                        "description": "Maximum time to wait for each Etsy shop page request.",
                        "default": 30
                    },
                    "includeListings": {
                        "title": "Include listing snippets",
                        "type": "boolean",
                        "description": "Include visible listing snippets in dataset output and report analysis.",
                        "default": true
                    },
                    "includeHtmlReport": {
                        "title": "Generate HTML report",
                        "type": "boolean",
                        "description": "Generate a visual HTML report with trend charts and save it to the run key-value store.",
                        "default": true
                    },
                    "useBrowserFallback": {
                        "title": "Use browser fallback",
                        "type": "boolean",
                        "description": "Use Playwright/Chromium when Etsy blocks fast HTTP requests. Recommended for reliability.",
                        "default": true
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Etsy often blocks datacenter traffic. Residential Apify Proxy is the reliable default for this standalone monitor.",
                        "default": {
                            "useApifyProxy": true,
                            "apifyProxyGroups": [
                                "RESIDENTIAL"
                            ]
                        }
                    },
                    "snapshotStoreName": {
                        "title": "Snapshot store name",
                        "type": "string",
                        "description": "Named key-value store used to keep shop histories across Actor runs.",
                        "default": "etsy-competitor-pulse-history"
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
