# Changelog of Shopify Store Analyzer | Revenue, Traffic & Apps (`apivault_labs/shopify-store-analyzer`) Actor

- **URL**: https://apify.com/apivault\_labs/shopify-store-analyzer/changelog.md
- **Full Actor documentation**: https://apify.com/apivault\_labs/shopify-store-analyzer.md

## Changelog

### \[2.35] — 2026-09-19 — Adaptive output presets

- Added Compact, Leads, Monitoring and Full output presets for MCP and automation clients.
- Kept Full as the default and preserved the legacy `flatOutput` behavior.
- Added the selected preset to run summaries and reorganized the input form into numbered workflow sections.
- Added contract tests for every output shape.

### \[2.34] — 2026-09-15 — Catalog, currencies and diagnostics

- Added bounded alternate catalog routes and strictly store-matched public product samples. Regional samples retain their currency and are not full catalogs or verified best sellers.
- Revenue preserves local currency and converts to USD only with a known, dated reference rate. Unknown currencies/rates leave USD empty.
- Run summaries identify partial rows and their unavailable sources.
- Change tracking skips additions/removals from limited product samples and unavailable website profiles, retaining trustworthy baseline components.
- Disabling velocity removes all velocity fields.
- Unavailable quick-check URLs go to diagnostics, not billable Dataset rows. Valid reachable non-Shopify checks remain result rows. Start/platform charges can still apply.

### \[2.33] — 2026-09-12 — Per-source deadlines and partial data

#### Fixed

- A slow optional source can no longer consume the full store-processing window
  and discard homepage, catalog, or traffic data that already completed.
- Shopify metadata is now shared through a race-free result future instead of a
  take-and-reinsert channel between catalog workers.
- HTTP timeout is now a total budget across retries and proxy fallback, while
  products and collections pagination stop at their source deadline.
- Curated best-seller lookup now has its own deadline and falls back to the
  already collected product sample; non-Shopify contacts reuse bounded pages
  instead of crawling them a second time.

#### Added

- Every enrichment has a wall-clock deadline and reports `timed_out` without
  failing the complete store record.
- The final Shopify-detection probe is capped separately, keeping the complete
  store path comfortably inside its 90-second budget.
- Concurrency now accounts for each store's nested source fan-out: 512 MB runs
  process one store at a time, while 1 GB runs may process three. A live 10-store
  test showed that three store workers on 512 MB amplified a 3.7-second store to
  its 90-second limit; serial store processing removes that CPU contention.
- Homepage parsing keeps the metadata-rich head and contact-rich footer while
  skipping oversized embedded theme JSON that previously consumed up to a
  minute of CPU on complex stores.
- `data_quality.timed_out_enrichments` identifies precisely which sources missed
  their deadline; completed fields remain available and billable as one result.
- Contract tests cover fast + slow mixed sources, parser panics, and total HTTP
  attempt budgets.

### \[2.32] — 2026-09-11 — AI agent and MCP contract

#### Added

- Every successful and partial run now writes a machine-readable `SUMMARY` and
  an `ERRORS` array with stable error codes and retry guidance.
- The Actor output schema links agents directly to dataset results, diagnostics,
  discovery summaries, and comparison reports.
- The README now includes explicit mode routing and a minimal MCP request.

#### Improved

- Discovery defaults to a safer 10-store sample before users or agents expand a
  run, while the configurable 100-store maximum remains available.
- Failed stores no longer expose raw transport or implementation details.
- Local publishing helpers no longer contain an embedded Apify token.

### \[2.31] — 2026-08-26 — Stable large discovery runs

#### Fixed

- Large Discover & Analyze runs now stop work safely before the platform limit
  and preserve every completed result instead of losing the full dataset.
- Store discovery has a bounded runtime and more reliable recovery from
  temporary marketplace rate limits.
- Invalid discovery inputs now finish early with a clear INPUT\_ERROR record.

#### Improved

- Results are saved progressively and run status reports live progress.
- Slow stores receive a practical completion window, while the batch scheduler
  still stops safely before the platform run limit.

### \[2.30] — 2026-08-23 — Faster full analysis

#### Improved

- Full multi-store analyses run roughly 2-4x faster thanks to parallelized
  data collection and lighter page processing.
- Traffic statistics are available again for all stores.
- The comparison report is now stored in the run's key-value store
  (COMPARISON\_REPORT) instead of the dataset, so it is never billed as a
  store result.

### \[2.29] — 2026-08-22 — Safer invalid-input handling

#### Improved

- Invalid, unresolvable, private, and local destinations are rejected before
  store analysis begins, making accidental bad-input runs finish much faster.
- Unreachable inputs still produce no billable dataset result and remain
  available in the run's failed-input summary.
- A small $0.0005 run-start fee is scheduled for September 6, 2026, while all
  existing per-result plan prices remain unchanged.

### \[2.28] — 2026-08-22 — Useful results for non-Shopify websites

#### Improved

- Analyze mode no longer drops a reachable website just because it is not built
  on Shopify.
- Non-Shopify results are clearly marked with `is_shopify: false`, the detected
  platform, and a basic profile containing the website, traffic, technology,
  social and contact signals that were available.
- Shopify-only catalog and revenue fields are marked as not applicable instead
  of being presented as failed enrichments.
- Comparison reports include only confirmed Shopify stores, while the run status
  counts website results without counting the comparison row as another store.
- Completely unreachable URLs with no useful website signals are stored as
  unbilled failures instead of producing an empty dataset record.

### \[2.27] — 2026-08-22 — Start form compatibility

#### Fixed

- Runs configured with 256 MB are accepted again instead of being blocked by
  input validation. The Actor automatically reduces parallel work on smaller
  containers, while 512 MB remains recommended for larger batches.

### \[2.26] — 2026-08-22 — More complete results under heavy batch load

#### Improved

- Large parallel batches now recover more catalog and storefront data when a
  store temporarily limits requests.
- Recovery attempts are coordinated across the batch instead of repeatedly
  using a blocked connection.
- Higher fallback capacity is available during busy workloads.

#### Verified

- Repeated 20-domain stress runs completed successfully with comparison output,
  correct non-Shopify filtering, and no run-level failures.

### \[2.25] — 2026-08-22 — Faster analysis and complete reliability upgrade

#### Improved

- Faster store analysis and lower memory use, especially for batches.
- Shopify rate limits now produce a useful partial record instead of dropping a
  confirmed store or stopping Find Similar.
- Analyze, Discover, Discover & Analyze, Find Similar, and Quick Check now share
  the same reliability protections and input compatibility.
- Best sellers prefer merchant-curated collections and fall back safely when a
  curated ranking is unavailable.
- Contact, traffic, catalog, collections, sitemap, policy, and brand-age signals
  are isolated, so one unavailable optional signal cannot fail the store.

#### Fixed

- Quick Check handles rate-limited Shopify stores without misclassifying ordinary
  websites.
- Change tracking, comparison reports, discovery summaries, app filters, policy
  signals, review-based revenue estimates, and flat output remain available in
  all supported workflows.

### \[2.24] — 2026-08-22 — Reliability and timeout protection

#### Fixed

- Existing Tasks and API integrations using the legacy `urls`, `startUrls`, or
  single `url` input now continue to work alongside `storeUrls`.
- One unavailable enrichment no longer drops an otherwise useful store result.
  Successful records include a `data_quality` summary showing which optional
  fields were unavailable.
- Large batches now use bounded per-store work budgets and higher default
  concurrency to finish before the run timeout.
- Starting the Actor without editing the input runs one built-in demo store
  instead of failing immediately.
- An invalid optional summary or discovery record can no longer fail the whole
  run.

#### Changed

- Concurrency is now memory-aware, and the standard run memory is 512 MB to
  prevent out-of-memory failures on full enrichment batches.

All notable changes to this Actor will be documented here.

### \[2.23] — 2026-07-31 — Output tabs polish

#### Changed

- Added icons to the Output dataset tabs (Discovered Stores, Store Overview,
  Tech Stack, Best Sellers, Contacts & Ads, Changes Since Last Run, Upsell
  Targets) for faster visual scanning. No data or field changes.

### \[2.22] — 2026-07-22 — Reliability at volume

#### Fixed

- Fewer stores skipped as "not reachable" on large, high-load runs.
- A transient hiccup on a single store no longer drops its whole record — it
  retries and gracefully degrades.

#### Changed

- **Faster runs.** Per-store data is gathered more efficiently and default
  concurrency was raised to 5 — a 7-store batch now finishes in roughly half
  the time. No API key or setup required.

### \[2.21] — 2026-07-09 — Pricing update

#### Changed

- **Price is now $7 per 1,000 stores** ($0.007 / store), platform usage
  included. Still pay-per-use — no subscription or API key — and still the most
  affordable full Shopify store-intelligence tool on Apify (typical alternatives
  run $8–10 / 1K or $10–29 / month).

### \[2.20] — 2026-06-20 — Recent launches & top product types

#### Added

- 🆕 **Recent products** (`recent_products`) — the store's most recently
  launched products (title, launch date, URL, price). "What did this competitor
  just drop?" — a high-value spy signal.
- 🗂️ **Top product types** (`top_product_types`) — the most common product
  types in the catalog with counts, for quick category profiling.

### \[2.19] — 2026-06-20 — Lead-list market snapshot (discovery summary)

#### Added

- 📊 **Discovery summary** — discover / reverse-app-lookup / find-similar runs
  now also return a single lead-list snapshot record: how many stores were
  found, % with a public email / phone, country distribution, and app-category
  & top-app adoption across the set. Gives the lead-gen audience an instant
  market read.

### \[2.18] — 2026-06-20 — Qualification filters (filtered prospecting)

#### Added

- 🎯 **Qualification filters** — `minMonthlyVisits`, `minStoreHealth` and
  `minOpportunityScore` keep only analyzed stores that clear your thresholds.
  Combine with discovery + `requiredApps` / `excludeApps` / country to build a
  precisely-filtered lead list, e.g. "coffee stores with >50k visits using
  Klaviyo but not Yotpo". Filtered-out stores are skipped and never charged.

### \[2.16] — 2026-06-20 — Robust at volume

#### Fixed

- **Genuine Shopify stores are no longer dropped at volume.** A confirmed
  Shopify store whose catalog is temporarily unavailable now still returns its
  full homepage-derived intelligence (`catalog_accessible: false`) instead of
  being skipped.

### \[2.15] — 2026-06-20 — Dropshipper-risk legitimacy dampener

#### Fixed

- The dropshipper risk score no longer falsely flags large, established brands
  as "high" risk. Genuine brands that happen to reuse template descriptions or
  launch frequently are now correctly rated low risk.

### \[2.14] — 2026-06-20 — Cleaner email extraction

#### Fixed

- Public email extraction now filters out noise, so `best_email` and the contact
  list contain only real, usable addresses for lead generation.

### \[2.13] — 2026-06-20 — Store summary & target markets

#### Added

- 🧾 **Store summary** (`store_summary`) — a single human/LLM-readable line per
  store (segment, niche, est. revenue, maturity, key apps, ads) — ideal for AI
  agents and quick scanning of a results table.
- 🌐 **Target markets** (`markets`) — the distinct country markets a store
  localizes for.

### \[2.12] — 2026-06-20 — Cohort intelligence + email-capture signal

#### Added

- 📈 **Cohort intelligence in the comparison report** — when comparing 2+
  stores, the report now also shows the niche distribution, cohort-average
  store-health / opportunity / lead scores, an opportunity-score ranking, the
  **most attractive sales target** and the healthiest store.
- ✉️ **Email-capture signal** (`content_marketing.has_email_capture`) — whether
  the store runs a newsletter / email-capture popup.

### \[2.11] — 2026-06-20 — Opportunity score, pitch angles, exclude-apps filter

#### Added

- 🎯 **Opportunity score (0–100)** + tier — how attractive a store is as a
  *sales target*, with a transparent `opportunity_breakdown`.
- 💬 **Pitch angles** (`pitch_angles`) — concrete, ready-to-use sales angles
  derived from the store's gaps and weaknesses.
- 🚫 **Exclude-apps filter** (`excludeApps`) — in Discover modes, skip stores
  that use a given app, e.g. find stores that do NOT already run your tool.
  Combine with `requiredApps` for precise targeting (uses Y but not Z).

### \[2.10] — 2026-06-20 — Quick Shopify check + policy details

#### Added

- ⚡ **Quick check mode** (`quick_check`) — bulk-triage a list of URLs: is each
  one a Shopify store? Returns `is_shopify`, detected `platform` (Shopify /
  WooCommerce / BigCommerce / Wix / Squarespace / Magento / custom) and the
  myshopify handle. A low-friction way to filter a big domain list before a
  full analysis.
- 📦 **Policy details** (`extractPolicyDetails`, opt-in) — the **returns window
  (days)**, free-returns and free-shipping signals.

### \[2.9] — 2026-06-20 — Richer best-sellers, price bands, SEO & content signals

#### Added

- 🏆 **Richer best-sellers** — each best-seller now includes compare-at price,
  discount %, on-sale flag, product type, option/variant counts and image URL.
- 📊 **Price distribution** (`price_distribution`) — how the catalog splits
  across price bands (under $25 / $25–50 / $50–100 / $100–250 / $250+).
- 🔎 **SEO snapshot** — homepage title, meta-description presence, structured-data
  presence.
- ✍️ **Content-marketing signal** (`content_marketing`) — whether the store runs
  a blog and how many posts it has.

### \[2.8] — 2026-06-20 — Find similar / competitor stores

#### Added

- 🧭 **Find similar / competitor stores** — new `find_similar` mode. Give one
  store (`seedStoreUrl`) and the Actor learns its niche and returns other
  Shopify stores selling similar things — each tagged with `similar_to`. Results
  are enriched (contacts, tech stack) and respect the country and reverse
  app-lookup filters.

### \[2.7] — 2026-06-20 — Reverse app lookup (find stores using an app)

#### Added

- 🔎 **Reverse app lookup** (`requiredApps` + `appMatchMode`) — in Discover
  modes, return only stores whose tech stack uses a specific app, e.g.
  `["Klaviyo"]`, `["Yotpo"]`, `["ReCharge"]`. Non-matching stores are skipped
  and never charged. Matched apps are returned in `matched_apps`. Built for app
  vendors targeting stores that run a competitor's app.
- Discovered stores now also include their **detected tech stack**.

### \[2.6] — 2026-06-20 — Categorized tech stack, express checkout, tiered pricing

#### Added

- 🗂️ **Categorized tech stack** (`tech_stack_categorized`) — detected apps
  grouped into readable categories instead of one flat list.
- ⚡ **Express checkout** (`express_checkout` + `express_checkout_methods`) —
  whether an accelerated checkout is enabled (Shop Pay / Apple Pay / Google Pay
  / PayPal).

#### Changed

- **Volume-based tiered pricing** — higher plans pay less per store.

### \[2.5] — 2026-06-20 — Comparison report now included for everyone

#### Changed

- The **cross-store comparison report** is no longer a premium add-on. It's now
  generated automatically for every run that analyzes 2+ stores, at no separate
  charge. Set `generateComparison: false` to skip the extra record.

### \[2.4] — 2026-06-20 — Lead score, growth signals, payments & policies

#### Added

- 🎯 **Lead score (0–100)** + temperature bucket (cold / warm / hot) with a
  `lead_score_breakdown` — how actionable a store is as a sales lead.
- 🚀 **Growth signals** (`growth_signals` + `is_scaling`) — momentum flags so
  you spot a competitor that's actively scaling.
- 💳 **Payment & BNPL stack** (`payment_methods`, `bnpl_offered`, `bnpl_methods`).
- 📜 **Store policies** (`policies_detected`) — refund / shipping / privacy /
  terms as a trust signal.
- Lead score & temperature added to the **Contacts & Ads** dataset view.

### \[2.3] — 2026-06-20 — Store health score, upsell targeting, niche, deeper contacts

#### Added

- 💯 **Store health score (0–100)** + maturity tier (emerging / growing /
  established / enterprise) with a transparent `store_health_breakdown`.
- 🎯 **Upsell opportunities** (`upsell_opportunities` + `app_categories_present`)
  — the high-value app categories a store has *no* solution for. A ready-made
  pitch list for Shopify app vendors and agencies.
- 🏷️ **Primary niche** (`primary_niche`) — best-effort product-niche
  classification (beauty, apparel, food & beverage, fitness, pet, and more).
- 📧 **Deeper contact discovery** (`deepContactCrawl`, on by default) — finds a
  usable `best_email` for many more stores, only when needed so it costs no
  extra time on stores that already show contact info.
- New dataset view: **Upsell Targets**; health score & niche added to the
  **Store Overview** view.

### \[2.2] — 2026-06-20 — Change tracking (competitor monitoring)

#### Added

- 🔔 **Change tracking** (`trackChanges`, on by default) — the Actor now
  reports exactly what changed for each store since you last analyzed it, in a
  new `changes` field: new/removed products, traffic & revenue moves, AOV and
  product-count shifts, apps installed/removed, new pixels, promos launched or
  ended. The first run for a store records a baseline. New **Changes Since Last
  Run** dataset view.

### \[2.1] — 2026-06-20 — Best-seller detection, ad intelligence, contact roles

#### Added

- 🏆 **Best-seller detection** — every analyzed store now returns a ranked
  `best_sellers` list of its top products (title, direct product URL, price,
  stock) — ideal for spotting a competitor's winners at a glance.
- 📣 **Ad intelligence** (`ad_intelligence`) — which platforms a store is set up
  to advertise on (Meta, TikTok, Google Ads, Pinterest, Snapchat) and a
  one-click **Meta Ad Library** link to its live ads.
- 📧 **Contact roles + best email** — public emails tagged by role (owner /
  sales / marketing / support / info / personal / noreply) and the single most
  outreach-useful address surfaced as `best_email`.
- New dataset views: **Best Sellers** and **Contacts & Ads**.

### \[2.0] — 2026-06-18 — Universal revenue, lead enrichment, flat output

#### Added

- **Alternative revenue estimate** — revenue/sales are now estimated even for
  small or low-traffic stores (`sales_estimate` block + a `basis` flag on
  `revenue_estimate`). Configurable `reviewsToSalesMultiplier`.
- **Contact enrichment in Discover mode** (`enrichContacts`, on by default) —
  each discovered store also returns public emails, phones and social handles.
- **Flat output** (`flatOutput`) — flatten nested fields into underscore-joined
  columns for spreadsheets, n8n, Zapier and Make.

### \[1.9] — 2026-06-18 — Store discovery (find stores by keyword)

#### Added — find Shopify stores, no URL needed

- New **Discover** modes via the `mode` input:
  - **Discover stores by keyword / niche** — give search terms and get back a
    list of real Shopify stores selling those products (name, URL, myshopify
    domain, country).
  - **Discover, then analyze** — discover stores and immediately run the full
    intelligence analysis on each.
- New inputs: `searchTerms`, `discoverCountry`, `maxStores`. `storeUrls` is now
  only required in Analyze mode. Billed per store returned.

### \[1.8] — 2026-06-18 — Lower price + clearer listing

#### Changed

- **New lower price: $4 per 1,000 stores** (down from $10/1K).
- Rewritten README and store description: unique capabilities up front, a
  side-by-side comparison, and an AI-assistant / MCP quick-start block.

### \[1.7] — 2026-06-05 — Billing safety

#### Fixed

- The comparison report is now charged before it is delivered, so a per-run
  cost-cap abort can never deliver an uncharged report.

### \[1.6] — 2026-05-31 — Competitor comparison report

#### Added — cross-store benchmarking

- New optional **`generateComparison`** flag. When analyzing 2+ stores in one
  run, the Actor produces a single report ranking them by visits, revenue, AOV,
  discounting, international expansion and tech-stack richness, plus cohort
  averages and a segment / dropshipper-risk breakdown.

### \[1.5] — 2026-05-31 — Reliability & accuracy

#### Improved

- Only successful analyses are saved to your dataset; skipped stores are listed
  separately so they don't clutter your results.
- Faster, more stable runs on very large catalogs (full-catalog mode samples up
  to 2000 products).

#### Changed

- Brand-age lookup is now **off by default** (`extractBrandAge: false`) as a
  slower, secondary signal. An account-age signal is still available for free.

#### Added

- Up to 100 stores per run.

### \[1.4] — 2026-05-21 — 5 new intelligence layers

#### Added

- 🎯 **`tracking_ids`** — public advertising / analytics IDs (Google Tag
  Manager, GA4, Universal Analytics, Facebook Pixel, TikTok, Pinterest,
  Snapchat, Klaviyo key, Hotjar, Intercom, Microsoft Clarity). Use case:
  **brand-network mapping** — multiple domains sharing the same pixel = same
  operator.
- 🔢 **Account-age signal** — a free backup signal for brand age.
- 📢 **`announcement`** block — free-shipping threshold, up to 3 active promo
  codes, banner discount %, and clean announcement text.
- 🏷️ **Top product tags** (`top_tags`, `unique_tags_count`) — niche orientation
  at a glance.
- 🪞 **`duplicate_description_pct`** — a strong generic-catalog / dropshipper
  signal.
- Dropshipper risk score upgraded with new signals.
- New flag `extractPromo` (default `true`).

### \[1.3] — 2026-05-21 — Major intelligence expansion

#### Added

- 🌐 **Full-catalog totals** — real product/page/collection/blog totals.
- ⏱️ **Brand age estimation** — brand age in years + founding year.
- 🌍 **International expansion scan** — languages, currency switcher, country
  selector.
- ⭐ **Reviews aggregate** — aggregate rating + review count.
- 14 new derived signals: `customer_segment`, `marketing_channel_mix`,
  `dropshipper_risk_score` + bucket, `annualized_revenue_usd_est`,
  `oldest_product_date`, `products_on_sale_pct` + `avg_discount_pct`,
  `vendors_count` + `top_vendors[]`, `product_types_count`, inventory health,
  `avg_images_per_product`, `international_expansion_score`, brand age.
- **Tech stack expanded from 50 to 60+ detectors.**

#### Fixed

- More robust handling of stores with sparse traffic data.
- Phone-number extraction accuracy improved.

### \[1.2] — 2026-05-20

#### Added

- Initial pricing structure: $10 per 1000 stores.
- Tech stack detection (50+ Shopify apps).

### \[1.1] — 2026-05-12

#### Added

- Multi-store batch processing.

### \[1.0] — 2026-05-11

#### Added

- Initial release: revenue estimate, traffic intelligence, tech stack, social
  links + emails, Shopify meta (currency, locale, theme).
