Methodology
What TierDiff reads, what it keeps and the rules it uses to compare services. This page describes what the code does; when a rule changes, this page changes with it.
How data is collected
- Once a day, our bot (TierDiffBot) reads each service's own public pricing or documentation page. For a few services it reads the public pricing data file the vendor publishes instead. Nothing behind a login, and no forms.
- It reads robots.txt first and follows it. A missing robots.txt (a 404 or other 4xx answer) means no restrictions; if it cannot be checked because of a server error or a failed connection, the page is not fetched. A failed fetch is tried again later the same day, up to three attempts in total, at least 30 minutes apart.
- Pages are requested in US English. Pages whose content changes with the visitor's country are read from the United States. Prices are the US-dollar prices listed on those pages.
How the bot works and how to stop it
What counts as evidence
- A number is kept only if the sentence it comes from is found word for word on the page that was read, and the number itself appears in that sentence.
- For every number we store that sentence, the page address and the date it was checked. Product pages show the page address and the date next to the number, and the sentence under Show the quote.
- In comparison tables, a limit the page does not state is shown as a dash. Numbers are never estimated or typed in by hand.
How changes are published
- The first reading of a page is the starting point, not a change.
- If a page has not changed at all since the last check, the check date is updated and nothing is compared.
- If the readable text of a page shrinks by more than half, it is treated as a fetching problem, not as a free tier going away, and nothing is compared that day.
- Product pages and comparison tables show the values from the latest check, with the date next to each value. A change is added to the change history only after a person has checked it against the vendor's page.
How picks are chosen (rule v2)
Picks, a short list of the top services for one use case, are ranked by an overall score worked out only from the numbers on this site and facts with a cited source.
Use cases and their key limits
- Static sites and front ends: bandwidth out, sites / projects (services: Cloudflare Pages, DigitalOcean App Platform, GitHub Pages, Netlify, Render, Sevalla Static Site Hosting (Kinsta), Vercel)
- App and API servers: memory, time before sleep (services: Azure App Service, DigitalOcean App Platform, Fly.io, Google App Engine, Heroku, Koyeb, Railway, Render)
- SQL databases: database size, projects / databases (services: CockroachDB Basic, Neon, PlanetScale, Prisma Postgres, Supabase, TiDB Cloud Starter, Turso)
- NoSQL and key-value databases: database size, projects / databases (services: Convex, Firebase, MongoDB Atlas, Redis Cloud, Upstash Redis)
- Authentication: monthly active users (services: Amazon Cognito, Auth0, Clerk, Descope, Frontegg, Kinde, Stytch, WorkOS AuthKit)
Builds are not compared for static sites, because services count them in different units (minutes or number of builds).
App and API servers: in preparation. We are still collecting values such as free instance memory, and the services to compare.
What the overall score is made of
- Free-tier limits: for each key limit of the use case, the share of the other services that it matches or beats (0 to 100), averaged over the key limits. Where lower is better, the direction is reversed, and unlimited counts as the highest value. A limit with no value on TierDiff scores 0 and counts below every value on the site.
- No card to start: 100 if you can start on the free tier without adding a card or other payment method, 0 if one is needed. A service with no free tier scores 0.
- No time limit: 100 for a free tier with no end date, 30 for a free trial only, 0 for no free tier.
- Paid price: the share of the other services whose cheapest paid plan costs the same or more per month (the US-dollar price, with a quote from the pricing page). A service with no such price on TierDiff scores 0 and counts as costing more than every listed price.
Weights on English pages: free-tier limits 60, no card to start 12.5, no time limit 12.5, paid price 15. Japanese pages also count a Tokyo region and a Japanese dashboard (free-tier limits 50, no card to start 10, no time limit 10, Tokyo region 10, Japanese dashboard 5, paid price 15), so the order can differ between the two languages.
- Facts, such as whether a card is needed, count only with a quote from the vendor's own page, the page's URL and the date we checked it (where static hosting serves from is also checked by the measurement below). A fact not verified yet counts as 0 and is marked as not verified.
- Where the vendor does not state it, whether a card is needed or the dashboard is in Japanese is sometimes checked by TierDiff on its own account; we then show how it was checked and the date (no screenshots).
- For static hosting, whether a site is served from a location in Japan (Tokyo etc.) is measured by TierDiff from Tokyo when the vendor does not state it on its own page. We request a site on the service's standard domain (the same network as the free plan) 3 times and read the point-of-presence code in the response headers (such as x-served-by or cf-ray); it counts as served from Japan only if all 3 are a location in Japan (Tokyo etc.), such as NRT or KIX. For a service with no such code, it counts as served from Japan if the server's reverse DNS name is in Japan and the first byte arrives in under 30 ms, and as not served from Japan if the reverse DNS names all point to the same region outside Japan and all 3 connections take 60 ms or more; anything else, including a PoP code outside Japan, stays not verified. We re-measure about once a month. Where the vendor states its serving locations on its own page, that statement is used instead.
- Paid price counts only when at least half of the services in a use case have a monthly price with a quote from the pricing page. Otherwise it is left out, the other weights are scaled up to 100, and the page says so.
- A use case gets a page only when it has at least 5 services, at least 4 of them with a free tier, and at least half of them with a value on TierDiff for one of its key limits.
- Every service in the use case is scored, including ones without a free tier. Scores are shown as whole numbers; services with the same score share a rank and are listed by name.
- A pick is described by its place on TierDiff's overall score for one use case. We don't use unsupported superlatives.
- On a use-case page, "TierDiff's take" and the "Good for" lines, and the special picks for credit- and usage-priced services ("For …"), are written by TierDiff and kept apart from the rule (they are not used for scores or ranks, the take is hidden until rewritten whenever the ranking changes, and each special pick rests on a fact on this site that applies only to that service among the ones shown).
What is never used for ranking
- Our own site traffic, clicks on referral links, conversion data from affiliate networks, or paid placement.
- The code that ranks picks does not read the list of referral links. An automated test checks that picks come out the same with no referral links and with a referral link for every service.
How samples are made
How the samples are made:
- Every service gets the same script and the same conditions, and the conditions are listed next to the samples.
- Samples are made with each service's own AI and are labeled as AI-generated.
- Any quality scores are given with the service names hidden.
- Numbers from vendors link to the vendor's page; our own measurements link to the sample files and the test conditions instead.
Last updated 2026-10-17.