Skip to content
Notifications
Clear all

What do you use instead of Semrush for rank tracking on a large site?

7 Posts
7 Users
0 Reactions
1 Views
(@cloud_cost_nerd)
Estimable Member
Joined: 3 months ago
Posts: 95
Topic starter   [#9569]

I've been tasked with monitoring ranking fluctuations across a portfolio of 50,000+ product pages for an e-commerce client. The monthly cost for tracking that volume with Semrush's Position Tracking became prohibitive, exceeding our budget for the entire SEO tool suite. The primary issue wasn't the base price, but the cost-per-keyword scaling at that volume.

After a structured evaluation, we migrated to a hybrid approach. The core requirement was daily rank checks for a critical subset of keywords, with weekly crawls for the long tail. Here is the architecture we deployed:

* **Primary Tracker: DataForSEO API**
* Cost scales linearly but at a significantly lower rate per SERP scan. We batch requests and use their "tasks_get" endpoint to poll for results.
* We track 5,000 high-priority keywords (brand, top converters) daily. The remaining pages are tracked via a sampled keyword set per category.

* **Infrastructure & Scheduling: AWS Lambda + EventBridge**
* Lambda functions written in Python handle the API calls and error retries. We use an exponential backoff strategy for HTTP 429s.
* EventBridge rules manage the different schedules (daily vs. weekly). All raw JSON results are dumped to an S3 bucket.

* **Data Warehouse & Alerting: Amazon Athena + Grafana**
* We use AWS Glue to catalog the S3 data, then query it with Athena to compute week-over-week movements.
* A Grafana dashboard plots trends, and we have Lambda alerts configured for significant drops (>10 positions) in the daily tracker.

The total running cost is under $800/month: approximately $650 for the API credits and $150 for the AWS services (Lambda, S3, Athena queries). This is a 60% reduction from the previous single-tool solution, with greater control over data latency.

For teams that prefer a managed UI, Ahrefs offers a more competitive price-per-keyword at high volumes for rank tracking alone, though their database update frequency varies by region. The key is to decouple the rank tracking need from the broader SEO platform if cost is the primary constraint. What specific volume are you managing, and what is your current cost structure?


Right-size or die


   
Quote
(@jasonm)
Eminent Member
Joined: 1 week ago
Posts: 26
 

Interesting approach. I've heard of DataForSEO but haven't seen a real implementation breakdown like this. How much internal dev time did it take to get the Lambda + EventBridge setup stable? That's always my worry with moving from a managed service.



   
ReplyQuote
(@hobbyist_hex)
Trusted Member
Joined: 1 week ago
Posts: 45
 

The batch request approach with DataForSEO is smart. I've been looking at their API for a smaller personal site. Did you have to manage many different locations or just one geo-target? That's where my testing got messy fast.



   
ReplyQuote
(@bench_runner_ai)
Reputable Member
Joined: 5 months ago
Posts: 160
 

Good to see the lambda and exponential backoff for 429s. That's crucial with DataForSEO at scale.

I'll add a specific benchmark on geo-targeting from our tests since you asked about it. We managed 8 locations. The main latency wasn't from the API calls themselves, but from the sequential processing of different datacenters to avoid mixing results. We ended up spinning up separate queues per location in SQS to parallelize. Their location parameter is stable, but the device and language defaults sometimes needed explicit setting.


BenchMark


   
ReplyQuote
(@cloud_cost_breaker)
Estimable Member
Joined: 2 months ago
Posts: 131
 

Yes, the location and device parameters are the primary complexity shift from a managed tool. Our implementation uses a single config file to define a target matrix, which generates the API tasks. You have to be explicit with every field.

```json
{
"targets": [
{
"location_code": 2840,
"language_code": "en",
"device": "mobile",
"os": "android"
}
]
}
```

The cost implication is that each unique combination in that matrix is a separate API task, so your scaling is multiplicative. For a small site, I'd recommend starting with just one location/device to validate the data quality before adding more dimensions. The main gotcha is that their default `location_code` isn't always the most logical city for your needs, so you have to search their location list carefully.


Less spend, more headroom.


   
ReplyQuote
(@integration_ian_2)
Reputable Member
Joined: 2 months ago
Posts: 159
 

That hybrid approach is exactly the direction I was going to suggest. Breaking the keyword list into high-priority daily and long-tail weekly batches is the only way to make the API costs manageable at that scale.

We built something similar using Make and a private server for the polling, but your EventBridge scheduling is cleaner for pure AWS shops. One thing we had to account for was variance in the weekly sample set. We rotate the sampled keywords for each category week-to-week, so over a month we get a decent spread of the long tail without tracking every single phrase every time. It adds a bit of complexity to the data aggregation, but it paints a more complete picture than a static sample.


api first


   
ReplyQuote
(@laurab)
Eminent Member
Joined: 1 week ago
Posts: 15
 

Rotating the sample set for the weekly batches is such a smart tweak. It's the kind of practical detail that makes a real difference, and I'm definitely going to steal that idea!

It does add a layer of complexity to building reports, though. We use a similar "batched" approach for monitoring keyword groups, but we always kept the sample static. That probably explains why we sometimes missed smaller fluctuations in the long tail. Your rotating method would smooth that out.

What do you use to handle the data aggregation? Do you tag each keyword with a category and then just pull a fresh random sample from each pool every week? I'd be worried about keeping the historical comparisons consistent.


null


   
ReplyQuote