Ulta Brand & Competitor Radar avatar

Ulta Brand & Competitor Radar

Pricing

from $1.00 / 1,000 ulta product records

Go to Apify Store
Ulta Brand & Competitor Radar

Ulta Brand & Competitor Radar

Track a beauty brand and its competitors in Ulta Best Sellers listings. Compare rank, price, rating, review growth and promotions across repeat runs; get a concise evidence-linked report.

Pricing

from $1.00 / 1,000 ulta product records

Rating

0.0

(0)

Developer

NexaScout

NexaScout

Maintained by Community

Actor stats

3

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Categories

Share

Monitor how a beauty brand and its competitors appear in a public Ulta category or brand listing. The first run establishes a baseline. Run again with the same input and trackerName to see changed category positions, prices, ratings, review counts, and promotions.

Who it is for

Beauty brand teams and agencies that currently inspect Ulta product pages by hand. Use the output to spot a competitor's new promotion, a meaningful rise or fall in a product's category position, or growing customer feedback. Every product and signal links back to the source page.

What you get

  • Product dataset: up to 300 products from up to 5 pages, with brand, product name, listing position, list/sale price, rating, review count, badges, sponsorship flag and URL.
  • Signals: changes for the configured brand and competitors. Review growth, position moves of at least five places, price changes, new promotions and rating drops of at least 0.2 stars.
  • Report: a short Markdown summary with source links and coverage counts.
  • Summary: pages fetched, records observed, products of interest visible and the history status.

Scope: ranks are positions within the sampled Best Sellers listing, including any sponsored placements. They are not unit sales. A rise in review count is not a sales estimate. A first run never invents changes. Products outside the selected pages are outside the sample. The Actor observes listing cards, so limitedStock means Ulta's limited-stock flag, not complete inventory. It does not scrape full review text or log in to brand accounts.

Input

Paste a public Ulta /shop/ category URL, add yourBrand and optional exact competitorBrands, and choose maxPages (1–5) and maxProducts (1–300). Use a category page to compare competitors. A /brand/ page is useful for a brand-only baseline.

{
"listingUrl": "https://www.ulta.com/shop/skin-care/all",
"yourBrand": "The Ordinary",
"competitorBrands": ["Dr. Althea", "Clarins"],
"maxPages": 1,
"maxProducts": 64,
"trackerName": "demo-skincare"
}

Set an Apify schedule for regular snapshots. The history is saved in a named key-value store in the account running this Actor, keyed by the listing URL, brand list and tracker name. Avoid simultaneous runs with the same tracker. If storage is unavailable, the summary says UNAVAILABLE; it does not present a baseline as a comparison.

Output example

An example signal shape after a second run (illustrative values):

{
"brand": "Example Beauty",
"productName": "Example Serum",
"categoryRank": 12,
"previousRank": 20,
"rankChange": 8,
"newReviews": 14,
"signalTypes": ["RANK_UP", "REVIEW_GROWTH"],
"productUrl": "https://www.ulta.com/p/example-serum-pimprod1234567"
}

For a local extraction check: python3 src/main.py --input examples/demo.json --output-dir output --state output/state.json. Python 3.12 is sufficient; no package install or third-party data provider is needed.

Limits and running cost

One category page can contain 64 product cards and several megabytes of HTML. The Actor fetches at most five listing pages per run and does not open every product page. This keeps work bounded, but Apify compute and proxy costs depend on the user's plan and actual run settings. Start with one page and inspect the successful run's usageTotalUsd before scheduling more categories. Store pricing must be checked against measured cost before publication.