Before you spend three months building a WordPress theme or plugin for Envato Market, you can see how the existing items in that niche sell. ThemeForest and CodeCanyon show a sales count on every item page, so the competition is fully public. It's just tedious to collect by hand.
Here's what that research looks like for one niche, booking, and how to run it for yours.
The "booking" niche, 26 October 2026
I took the 60 best-selling results for "booking" on each site:
| ThemeForest | CodeCanyon | AudioJungle (for contrast) | |
|---|---|---|---|
| Results for "booking" | 4,721 | 2,484 | 3,877 |
| Sales of the #1 item | 52,700 | 56,400 | 2,100 |
| Median sales, top 60 | 4,800 | 2,900 | 63 |
| Median price | $69 | $49 | $16 |
| Top 6 items' share of top-60 sales | 38% | 46% | — |
| Top 60 updated in 2026 | 47 of 60 | 38 of 60 | — |
What that tells a would-be author:
- The niche is real but top-heavy. On CodeCanyon, the top 6 booking plugins hold almost half of the top 60's sales. The leader, Bookly PRO, has 56,400 sales at $199.
- Incumbents are maintained. 47 of the 60 top ThemeForest booking themes were updated this year. You'd be competing with active products, not abandoned ones.
- Price isn't the leader's weapon. The best seller on CodeCanyon costs $199, four times the $49 median. Buyers in this niche pay for completeness.
- One author can own a niche. On CodeCanyon, one author, Nota-info, has 115,400 sales across the top 60 booking results.
Caveats: these are the top 60 by sales, not a random sample, so they describe the winners. Envato rounds sales above 1,000 (e.g. 52.7K). Lifetime sales include years-old purchases.
Run it for your niche
I built an Apify Actor for this, ThemeForest & CodeCanyon Scraper. Give it sites and keywords; it returns every item with sales, price, rating, author and last update, plus one market summary per keyword and site.
from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("DevColton/envato-market-scraper").call(run_input={
"sites": ["themeforest", "codecanyon"],
"queries": ["booking", "restaurant", "lms"],
"sort": "sales",
"maxItemsPerSearch": 60,
})
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
if row["type"] == "keyword-summary":
print(row["site"], row["query"], row["totalResults"], "results, median sales", row["salesMedian"])
An item looks like this:
{
"type": "item",
"site": "codecanyon",
"title": "Bookly PRO – Appointment Booking and Scheduling Software System",
"author": "Nota-info",
"categoryPath": "wordpress/calendars",
"price": 199.0,
"sales": 56400,
"rating": 4.53,
"reviews": 1200,
"lastUpdated": "2026-03-24",
"attributes": {"Software Version": "WordPress 6.9.x", "Compatible With": "Elementor, WooCommerce 9.x.x, WPML"},
"url": "https://codecanyon.net/item/bookly-booking-plugin-responsive-appointment-booking-and-scheduling/7226091"
}
The summary row per keyword gives total results, total, median and top sales, median price, the top authors by sales and the 10 best sellers, which is enough for a first niche shortlist.
A simple niche score
For each keyword, compare demand (median sales of the top 60) with competition (number of results and how concentrated sales are). A niche with a high median but many results and one dominant item is hard to enter; a moderate median with few results and no clear leader is where a new item has a chance.
Cost and other sites
$1 per 1,000 items, plus $0.003 per keyword summary. It also covers AudioJungle and 3DOcean. ThemeForest is behind a strict firewall, so the Actor uses residential proxies automatically; that's included.
I built this Actor. If you research niches differently and want another field, open an issue on its page.
Top comments (0)