Your AI app runs in us-east-1 and your users are in Berlin.
Here is the 200ms tax nobody warned you about.
Latency, GDPR, and the us-east-1 lock-in most indie devs inherit by accident. A practical guide to picking a region before it costs you customers.
I'm a senior backend tech lead and I run Belmo, a small European PaaS. This article mentions Belmo once near the end, but the advice works on any platform, including the one you are on right now.
A founder I was helping last month had built a slick little AI writing tool with Cursor. Paying users, mostly in Germany and France. Good product. The complaint in his inbox kept being some version of "it feels laggy." He had no idea why, because on his machine in Lyon it felt fine. It turned out every request his app made was bouncing to a database in Northern Virginia and back. His users were paying for a transatlantic round trip they never agreed to.
Almost nobody chooses this on purpose. You pick a host, you click "deploy," and the default region is us-east-1 because that is the default region for half the internet. Then you find out, sometimes the expensive way, that where your code physically runs is a decision, and that the default made it for you.
Why everything defaults to us-east-1
Amazon opened its Northern Virginia region first, in 2006. It is the oldest, biggest, and cheapest AWS region, it gets new services before anywhere else, and almost every tutorial, template, and SaaS free tier you have ever copied was written by someone who deployed there without thinking about it. Vercel, Supabase, Render, Railway, Neon: their free and starter tiers all gravitate to US East by default. So if you stitched your app together from starter templates, odds are good that your frontend, your database, and your background jobs are all sitting in Virginia, regardless of where you or your customers live.
That is fine if your users are in New York. It is a slow, quietly compounding problem if they are not.
The latency tax is real and it stacks
Light is fast but it is not infinite. A round trip between Frankfurt and Northern Virginia is roughly 90 to 110 milliseconds of pure network time, before your server does a single useful thing. That number sounds small. The problem is that it multiplies.
A typical page load is not one request. Your browser hits the app. The app queries the database. Maybe it queries it three or four times because an ORM generated a chatty set of calls. Then it calls an external API. Each of those hops, if it crosses the Atlantic, pays the tax again.
Here is the part that bites AI apps specifically. Your app talks to a model provider, and that call already takes time. Now stack a transatlantic database round trip in front of it, and a couple more behind it to log the result and update a usage counter, and you have built a request that feels sluggish for reasons that have nothing to do with the model.
You can measure your own tax in about ten seconds:
# Replace with your actual database host
curl -o /dev/null -s -w "Connect: %{time_connect}s Total: %{time_total}s\n" \
https://your-app.example.com/api/health
Run that from your laptop, then run it from a server in the same region as your users and compare. If the gap is 150ms or more, your region choice is showing up in every single request, and your users feel it as a vague heaviness they will never report accurately. They will just churn and tell you "it felt slow."
The fix is not clever caching or a CDN bolted on top. A CDN caches static assets. It does nothing for the dynamic, per-user, database-backed requests that make up the actual app. The fix is to put the compute and the database in the same region, and to put that region near the people using it.
Co-location matters more than the region itself
The single biggest latency mistake I see is not "wrong continent." It is "app and database on different continents from each other."
If your app server is in Frankfurt and your database is in Virginia, every query pays the full transatlantic tax, and a single page that runs five queries pays it five times. That is a self-inflicted half-second before the user sees anything. Putting your app server next to your users but leaving the database across the ocean can be worse than putting both in the wrong place together, because the chatty app-to-database traffic is usually heavier than the user-to-app traffic.
So the order of priority is: first, get your app and your database into the same region. Second, move that region toward your users. If you only do the first one, you have already fixed most of the felt slowness.
The GDPR part, in plain language
I'm not a lawyer, and this is not legal advice. But you do not need a law degree to understand the shape of the problem.
If you serve users in the EU and you process their personal data (email addresses count, names count, anything that identifies a person counts), GDPR applies to you. It applies even if you are a solo founder in San Francisco with three European customers. There is no revenue threshold below which it switches off.
GDPR does not flatly ban storing EU data in the US. What it does is make cross-border transfer something you have to account for. After the Schrems II ruling in 2020 invalidated the old Privacy Shield framework, the legal ground under US data transfers got shaky, and while the 2023 EU-US Data Privacy Framework restored a path, it is being litigated and its long-term durability is uncertain. Translated out of legalese: storing EU personal data in the US is a moving target that you, the founder, are on the hook for keeping current.
There is a much simpler move available. If your EU users' data physically lives in the EU, the entire cross-border transfer question mostly evaporates. You are not relying on a framework that might get struck down next year. The data is in Frankfurt, the users are in Frankfurt, and there is nothing to transfer.
This is the part founders underestimate. It is not only about avoiding fines. It is about what happens when a B2B customer's procurement team sends you a security questionnaire. The question "where is our data stored?" appears on nearly every one of them, and "a US region I never thought about" is an answer that loses deals. I have watched a perfectly good contract stall for three weeks over exactly this, on a product whose only real problem was that nobody had picked a region on purpose.
The lock-in nobody mentions
The reason this is hard to fix later, rather than impossible to fix, deserves its own paragraph. Once you have real data in a region, moving it is a project. You have to stand up the database in the new region, replicate the data, cut over without losing writes, update every connection string, and pray nothing in your stack hardcoded an endpoint. None of it is rocket science, but all of it is risk, and it is risk you take on while you have live customers.
So the cost of the default is not just the latency and the compliance exposure. It is that every month you wait, the migration gets a little heavier. The right time to pick a region is the day you have zero rows in the database. The second best time is today, while you still have hundreds and not millions.
What I built, and why
I kept solving this exact problem by hand for clients. Someone would come to me with a slow app and a nervous procurement thread, and the fix was the same boring thing every time: get the app and the database co-located, in a region that matches the users, with a paper trail for the compliance question.
That repetition is why I built Belmo. It is a managed platform that deploys from GitHub in about 90 seconds, and it runs in two regions, Germany and Oregon, so you pick EU or US at deploy time instead of inheriting Virginia by accident. It runs in ISO 27001 certified data centers and is GDPR compliant, which means the data-residency answer on those security questionnaires is already written for you. I built it because I was tired of doing the migration by hand. It will not fix a slow app whose slowness comes from bad queries or an oversized model call, and it is not the cheapest option at large scale if you are willing to run your own infrastructure. But for a founder who wants the region decided correctly without thinking about it, that is the entire point.
That is the one pitch. The rest of this works anywhere.
What to do tonight, regardless of platform
You can audit and mostly fix this in an evening. None of these steps require migrating anything yet, except the last one.
- Find out where your app actually runs. Open your host's dashboard and look at the region for your web service. Write it down. Most people do not actually know, and the answer is usually "the default."
- Find out where your database runs. This is the one that surprises people. Managed Postgres providers often default to US East even when you deliberately put your app in Europe. Check it separately. If your app and database are in different regions, that is your biggest single problem and you found it in two minutes.
- Measure the tax. Run the
curltiming command above from a machine near your users, or use a free tool like a global ping test, and see what your real users are paying per request. Now you have a number instead of a vibe. - List where your users actually are. Pull country data from your analytics or your Stripe dashboard. If 70 percent of your revenue is European and your stack is American, you have quantified the mismatch.
- Write down what personal data you store and where. Emails, names, anything identifying. One short document. If you ever get a security questionnaire or a GDPR data subject request, this is the document that saves your week.
- If app and database are split across regions, plan to co-locate them first. This is almost always the highest-leverage fix and the lowest-risk one, because you are usually moving the smaller, newer piece.
- If you are still pre-launch or early, just pick the right region now and redeploy. At zero or a few hundred rows, this is a fifteen-minute task. At a million rows it is a weekend with a runbook and a rollback plan. The cheapest version of this fix is the one you do before you need it.
The honest closing
Region choice is one of those decisions that is invisible until it is suddenly expensive, and by then it is a migration instead of a dropdown. The good news is that the audit costs you one evening and the fix, done early, costs you almost nothing. The default put your app somewhere. The only real mistake is never checking where.
I am curious where people land on this, because I see a real split. Some founders deploy to Europe on day one out of principle, and some take the position that latency and compliance are problems for future-them with revenue to spend on them. Both are defensible. Where do you sit, and has a region default ever quietly cost you a customer you only found out about later? I read every comment.
Related reads on this blog: I migrated 12 client projects off Heroku. Here's the playbook (and the 7 things that bit me every time). · Your Postgres will die at 50 concurrent users, not 50,000. Here's the connection pooling guide nobody handed you. · Heroku just went into "sustaining engineering mode." Here are 5 alternatives whose free tier actually doesn't sleep.
Pick your region on purpose.
Belmo deploys from GitHub in about 90 seconds and lets you choose Germany (EU) or Oregon (US) for each service, so your app sits next to your users from day one.
Quick answers
Why is my app slow for European users when it feels fast for me?
Most likely your app or your database runs in us-east-1 (Northern Virginia), the default region of most starter tiers. A Frankfurt to Virginia round trip costs roughly 90 to 110ms of pure network time, and every database query that crosses the Atlantic pays it again. Time a request from a machine near your users with curl -w and compare it with one from your own location.
Does a CDN fix latency for a dynamic app?
No. A CDN caches static assets like images, scripts and stylesheets. It does nothing for dynamic, per-user, database-backed requests, which make up the actual app. The fix is to put the compute and the database in the same region, near your users.
Does GDPR forbid storing EU user data in the US?
Not flatly, and this is not legal advice. GDPR makes cross-border transfers something you have to account for. After Schrems II invalidated Privacy Shield in 2020, the 2023 EU-US Data Privacy Framework restored a path, but it is being challenged. If EU personal data physically lives in the EU, the transfer question mostly goes away.
What matters more: the region, or keeping the app and database together?
Keeping them together. An app server in Frankfurt talking to a database in Virginia pays the transatlantic tax on every query, which can be worse than having both in the wrong place. Co-locate the app and the database first, then move that region toward your users.
When should I choose my hosting region?
Before you have data. At zero or a few hundred rows, switching region is a fifteen-minute redeploy. At a million rows it is a migration with replication, a cutover plan and a rollback plan.