If you're reading this, there's a decent chance the renewal email arrived this quarter. Branch, AppsFlyer, or Adjust. The new number is bigger than the old one. A lot bigger.
The conversation that follows is always the same. Marketing says we need the data. Finance says we need to cut the line item. Engineering, quietly, says they could probably build it.
For a long time, engineering was wrong. The infrastructure was hard, the SDKs were harder, and the ad-network integrations were a mess nobody wanted to touch. In 2020, "we'll build our own" was a yellow flag.
It's 2026 now and the math has shifted. This post is the version we wish someone had handed us when we were the team staring at a renewal email: what self-hosting an attribution stack actually costs, what it does well, and what you lose when you stop paying the bill.
A few things changed in the last 18 months.
Firebase Dynamic Links shut down on August 25, 2025. The free fallback option is gone. Every team that was holding out on FDL because it was good enough is now in the market. The shutdown also flushed thousands of how-to articles and Stack Overflow answers to the surface. The deep-linking problem space is more documented today than it has ever been.
Branch and AppsFlyer pricing has moved upward faster than most teams' growth. Tier-hopping at renewal (where a 20% increase in MAU triggers a 60% increase in bill) is now the standard story. The "free" Branch tier still exists; the line where you fall out of it does not move in your favor.
EU and California privacy enforcement keeps getting sharper. Teams that used to wave away the data-residency question now have legal asking specific questions about where attribution data lives, who has access, and what gets sent to ad networks.
The open-source mobile attribution stack actually works now. SDKs for iOS, Android, React Native, and Flutter exist in production-grade quality. Self-hostable backends exist. Self-hostable dashboards exist. None of that was true three years ago.
Cloud infrastructure costs have dropped at the bottom of the curve. AWS in particular has pushed prices down on the foundational services (EC2 with Graviton, RDS, ElastiCache Serverless, S3) and the entry tier for a production web app is meaningfully cheaper than it was even two years ago. A small AWS footprint that would have been $400/mo in 2022 is closer to $150/mo today.
Put it together and the picture changes. Self-hosting is no longer a 12-week engineering project gated on building everything from scratch. It's a deployment decision and a trade-off decision.
Before deciding if self-hosting makes sense, you have to know what you're cancelling. The value of an MMP (mobile measurement partner) falls into roughly seven buckets.
1. SDK distribution and maintenance. Keeping a binary that works across every iOS and Android version, every Xcode build, every React Native upgrade. This is not trivial work. It's also commoditized at this point; every major MMP and several open-source projects do it well.
2. Link-redirect infrastructure. The CDN that handles the click between a user tapping yourapp.link/abc and arriving at the App Store. Sub-100ms is the bar. There's real engineering here, but it's a solved problem and the unit cost has collapsed.
3. The attribution engine. The thing that matches a click to an install. Two flavors: deterministic (when device IDs survive the install) and probabilistic (fingerprinting via IP, user agent, timestamp, screen size). The MMPs guard the probabilistic engines like crown jewels. They are also exactly what privacy regulators are squeezing.
4. Ad-network postbacks and integrations. When someone installs via a Meta ad, the MMP fires a callback to Meta so the ad gets credited. There are 300+ ad networks. The MMP maintains those integrations. This is the single thing self-hosted solutions are weakest at. We'll come back to it.
5. The dashboard. Charts, cohorts, funnels, exports. Important for marketing teams. Not technically remarkable, but it's the day-to-day surface of the product.
6. Compliance theater. SOC 2 Type II reports, ISO 27001, GDPR DPAs, signed by the vendor. Your security team wants these. The vendor charges for them.
7. Support, account management, customer success. Real value if you use it. Most teams don't.
When you write the renewal check, you're paying for all seven. The question is whether you actually need all seven.
A credible self-hosted mobile attribution stack in 2026 means roughly this:
yourbrand.app.link. Just yourbrand.link or lnk.yourbrand.com.That's the entire stack. Three repos, one Docker compose file, one DNS record, one short-link domain.
What you get out of the box: deep linking, deferred deep linking, deterministic install attribution, in-app event tracking, link analytics, push notifications, and a UI your marketing team can use.
What you don't get out of the box, to be honest:
That last gap is good news if you're EU-regulated or privacy-conscious. It's bad news if you're an ad-buying team that lives on probabilistic data.
Here's what the bill comparison roughly looks like. MMP numbers are estimates based on public pricing tiers and standard sales-conversation ranges as of early 2026; your actual quote will vary. The self-host numbers are real infrastructure costs on AWS, the default choice for most production teams and the easiest comparison most engineering orgs will already know how to read.
One note before the tables. AWS isn't the cheapest credible host. The same stack runs on Hetzner, OVH, or DigitalOcean for roughly 40–60% less. We're using AWS because most teams already have an AWS account, an AWS-aware security team, and an AWS bill they understand. If you want to push the savings further, the same arithmetic on Hetzner or DO looks even better than what follows.
| Line item | Branch / AppsFlyer / Adjust | Self-hosted on AWS |
|---|---|---|
| MMP / Platform | ~$0–$500/mo (free tier or entry) | $0 (MIT-licensed software) |
EC2 (t4g.small Graviton, app + worker) | included | ~$12/mo |
RDS (db.t4g.micro Postgres, single-AZ) | included | ~$15/mo |
| ElastiCache Serverless (Redis, minimum) | included | ~$10/mo |
| S3 + CloudFront (assets + redirects) | included | ~$5/mo |
| Route 53 + ACM (DNS + TLS) | included | ~$2/mo |
| Domain | included | ~$1/mo |
| Total | $0–$6,000/yr | ~$540/yr |
At 50k MAU, most teams are still on the free tier of an MMP. Self-hosting saves you essentially nothing on the bill and you take on ops work for the privilege. Skip self-hosting at this scale unless you specifically need the data residency or the SDK control. Use the free tier of an MMP or the free tier of an open-source cloud product.
| Line item | Branch / AppsFlyer / Adjust | Self-hosted on AWS |
|---|---|---|
| MMP / Platform | $2,500–$8,000/mo | $0 |
EC2 (t4g.medium × 2, app + Sidekiq) | included | ~$50/mo |
RDS (db.t4g.medium, single-AZ, 100 GB gp3) | included | ~$80/mo |
| ElastiCache Serverless | included | ~$20/mo |
| S3 + CloudFront + data egress | included | ~$30/mo |
| Route 53 + ACM + CloudWatch | included | ~$15/mo |
| Domain + monitoring (Better Stack / Datadog free tier) | included | ~$5/mo |
| Ops time | 0 hours/month | ~4 hours/month |
| Total | $30,000–$96,000/yr | ~$2,400/yr + 48 hours engineering |
This is where self-hosting starts to pencil out. Even at $200/hour of engineering time, the ops cost stays under $12k/yr against a saving of $18k–$85k. At this tier, self-hosting is a real choice. The decision usually comes down to whether you have an engineer who'll own it.
| Line item | Branch / AppsFlyer / Adjust | Self-hosted on AWS |
|---|---|---|
| MMP / Platform | $10,000–$40,000/mo | $0 |
EC2 (c7g.large × 3 in ASG, app + workers) | included | ~$250/mo |
RDS (db.r7g.large Multi-AZ + 500 GB gp3 + replica) | included | ~$650/mo |
| ElastiCache Serverless (sustained load) | included | ~$120/mo |
| S3 + CloudFront (link-redirect CDN at scale) | included | ~$200/mo |
| ALB + Route 53 + ACM + CloudWatch + WAF | included | ~$80/mo |
| Domain + paid monitoring | included | ~$50/mo |
| Ops time | 0 hours/month | ~10 hours/month |
| Total | $120,000–$480,000/yr | ~$16,200/yr + 120 hours engineering |
The savings at this tier are still six figures, but the AWS bill is real money now, around $1,350/mo before any Reserved Instance or Savings Plan discount. Apply a 1-year Savings Plan and the EC2 and RDS lines drop by 30–40%, putting the total under $1,000/mo. At this point, the decision shifts from cost to risk. Can you absorb a four-hour attribution outage? Do you have an on-call rotation? Have you ever lost an RDS master key?
None of these are impossible questions. They're real questions that don't have to be answered when an MMP is the one holding the pager.
A second note on AWS specifically: at this scale, where you put things inside AWS matters. The numbers above assume us-east-1 or eu-west-1, the cheapest two regions. The same stack in ap-southeast-2 or sa-east-1 runs 25–35% more. Multi-AZ on RDS roughly doubles the database line; the table above includes it because at 5M MAU you should have it.
The short version of how to think about this:
Self-host if:
Don't self-host (yet) if:
There's also a middle path that didn't exist three years ago: use the open-source software, hosted by the people who wrote it. Several projects in this space, including Grovs, ship both. The same code runs in the cloud version and in the self-hosted version. You can start hosted, move to self-host when the bill starts to bother you, or move back if ops becomes a distraction. The lock-in goes away regardless of which side you're on.
Self-hosting isn't free, even when the software is. The cost nobody writes down is the cost of being the operator.
When the deep-link redirect goes down at 2 AM on a Sunday, nobody else picks up the pager. When Apple changes the App Store Server API for the third time this year, you read the migration guide. When a database index causes a 10× slowdown on link resolution, you debug it.
This is why MMPs exist. They aren't really selling attribution software anymore; that's commodity at this point. They're selling the right to not be the operator.
For some teams, that right is worth $60k a year. For others, $400k. For others still, it isn't worth either number and they should self-host.
We built Grovs as open-source because we think the operator decision should be yours, not your vendor's. Self-host it from github.com/grovs-io if you have the ops capacity and want to keep the bill at infrastructure cost. Use the hosted version at app.grovs.io if you'd rather pay us to run the box. The SDKs are the same, the dashboard is the same, the data model is the same. You can move between them whenever the trade-off shifts.
We built Grovs because the renewal email kept arriving. We're an EU-based product team and we shipped this stack at production scale before we sold it to anyone. The infrastructure numbers in this post (EC2 sizing, RDS pricing, the cost curve from $45/mo to $1,350/mo) come from running this exact platform on AWS. The MMP comparison numbers come from quotes we've seen, public pricing tiers, and conversations with teams that switched away.
We're not unbiased about this, obviously. We think the self-hosting trade-off is more favorable than it was, and we built a product that benefits from people thinking so. The honest summary is that most teams should not self-host below 500k MAU, and most teams above 500k MAU should at least price it out. The MMP industry has counted on customers never running the math. Running the math is straightforward now.
If you want to try self-hosting before you commit, the entire backend, dashboard, and all five SDKs are MIT-licensed at github.com/grovs-io. The Docker Compose setup is one command. You don't have to talk to anyone first.
If you'd rather skip the ops, app.grovs.io is the same software, run by us. The free tier is generous enough to actually evaluate against your current MMP.
Either way, the renewal email doesn't have to be the only option in the conversation anymore.
More articles you might find useful