On this page
“For most developers, Resend is the best default email API today.” That’s Codex’s response to “best email api for developers”. Eight AI assistants chose Resend as the top pick in 116 of 120 responses to that question.
We ask the eight AI assistants 20 identical questions in five SaaS categories each day for our State of AI Search reports: app hosting, auth, Postgres, Redis, and transactional email. These assistants generated 11,917 responses between October 1 and 15, 2026.
One brand was chosen as the top pick in more than half of responses for 63 of 100 questions. Often, the brand that AI most frequently mentions is not the brand it chooses. For example, SendGrid is mentioned in 60% of email responses but chosen as the top pick in 2.2% of responses.
Brands at the top of AI search results perform a few consistent actions, most of which are publicly visible on their own websites. Collectively, these actions form a generative engine optimization (GEO) playbook that can be used by any SaaS company.
We’ve also conducted three evaluations that any tech company can replicate: one to test if AI assistants pick your brand, one to test what AI models remember about your brand, and one to test if coding agents can set up your product.
What is generative engine optimization (GEO)?
Generative engine optimization (GEO) - also known as Answer Engine Optimization (AEO), AI SEO, or LLM SEO - is the process of getting AI assistants like ChatGPT, Claude, Gemini, Google AI Overviews, as well as coding agents such as Cursor and Codex, to recommend your product when people ask for a tool in your category.
For SaaS products, the goal is to be the first product recommended in the answer.
We look for three things in every answer:
- Mentioned: The product is named in the answer
- Ranked first: Your product is recommended first in the answer
- Cited: The answer includes a link to a page on your site
The first product recommended is the most important for SaaS products. People usually try the first product recommended when they ask for “best way to send email from a next.js app.” Coding agents setting up email in a project will install one SDK.
GEO and SEO are two different things. SEO ranks for a place on the results page. GEO ranks for a place in the answer. They don’t always overlap. For example, only 31% of the pages Google’s AI Overviews link to rank in its top 10 for the same question. Our posts on AEO and LLM SEO go into more detail on those terms.
Being named does not mean being recommended
In four of the five categories, the brand AI names most often is not the one it ranks first. Each assistant answered each question about 15 times in this window, so every row stands on about 2,400 answers:
The gap between being named and being picked is the space where AI SEO lives. SendGrid is named in 60% of the email answers, but ranked first in 2.2%. In 303 answers the assistant speaks about SendGrid in a negative way. 158 of those reasons are about one change, the reduction of SendGrid's free plan from permanent to a 60-day trial with 100 emails a day. Claude says it like this when asked which email API has the best free tier: "SendGrid replaced its permanent free tier with a 60-day trial in 2025, so it's no longer an option for ongoing free usage."
So AI will continue to tell each person who asks about SendGrid's pricing change. SendGrid remains on the list because the assistants know it. But because the reason it gives no longer fits the question, it rarely gets first place.
Be very clear about your product positioning
Most questions have an owner. In 63 of our 100 questions, one brand is the first pick in more than half of the answers, across all eight assistants. These are some of them:
Each owner wins the questions its reason answers. Our reports save the one-line reason why an answer recommends a brand. The most common reasons for each brand, and the most common terms in those reasons, are:
- Upstash: "serverless" (61% of all reasons)
- Neon: "database branching" (60%), "scale to zero" (42%)
- Cloudflare: "free" (54% of all reasons, often next to unlimited bandwidth)
- Resend: "simple", "clean" or "modern" (47%), "developer experience" (38%)
- Vercel: "Next.js" (39%)
- Clerk: "prebuilt" or "drop-in" components (32%)
Serverless and a free tier are enough to win Upstash 9 questions, from "side project" to "cheapest" to "best redis for a next.js app". But the same reason can cost them questions where people ask for something different: Redis Cloud is first for "most reliable uptime and persistence" while Amazon RDS is first for Postgres backups and uptime.
Five of the questions we tested yielded the framework's own docs as answers. For example, "how do i add login to my django app" yielded djangoproject.com in 116 out of 120 answers. It's tough for a vendor to win on how-to questions about frameworks with built-in answers.
So, the first step is free. Figure out what reason AI gives for your brand in three words. List all the questions buyers ask about your category where that's the reason for their answer. That's the set of questions you can own. It's also the prompt set for the first eval below.
Be on the model's mind before it searches
A person asks Codex "where should i host redis for a side project". Before it reads a single page, Codex searches for:
It makes a choice before any searching. The searching only checks facts. Claude is asked the same question and then searches for “best Redis hosting side project 2026”, which does not mention any brands. This then decides what pages Claude reads based on which pages show up in search results.
Assistants split into two groups by how they search. This is how often the first search names at least one brand from the category, and how often it names the brand the answer then ranks first:
Google AI Overviews is missing because its single search is the question itself.
When the first search names brands, the chosen brand is one of the brands found in 74% of cases. ChatGPT, Codex, OpenCode and Cursor have lists of brands that they know about through training. If a brand is not tied to the right reason in training, it will be at a disadvantage because it’s not on the list.
The Claude, Claude Code and Gemini approach is the opposite. They search for the question and pick from the found brands. For them, the list of brands is the list of brands on pages found for “best redis hosting 2026”.
There are two things to do. First, make sure you’re the brand models remember for your reason. This means using the same short phrase (like “serverless Redis” or “scale to zero”) on your own pages and in articles about you. Second, make sure you’re on the pages found for the simple question, covered in the next three steps.
Write the comparison page that makes your case
A brand does much better when the answer cites its own site. Across the 51 brands named in at least 200 answers (leaving out AWS and Google products, which share one domain), a brand that is named and cited is ranked first in 30% of those answers. A brand that is named but not cited is ranked first in 11%. This is a link, not proof of cause, but it holds for every category leader:
Which page gets cited matters as much. Many vendors publish a "best X in 2026" roundup, and assistants cite those roundups a lot. But the answers that cite them usually pick someone else. Pages that compare the owner to named rivals and argue a case do the opposite:
Roundups can provide factual information about competitors. For example, in the 447 answers citing Mailtrap's roundup, Amazon SES is ranked first 120 times, Resend 100 times, and Postmark 94 times. Even though the roundup labels Mailtrap "Best for high email deliverability", in the 119 answers to the question "which email service has the best deliverability", Postmark is first 86 times. This indicates that self-assigned labels do not translate to answers.
Successful pages have several characteristics in common:
- Specific verdicts for different use cases. For example, Upstash's comparison page includes a section on "When should you pick Upstash vs Redis Cloud?". Neon's page also clearly states where Supabase is ahead.
- Measurable numbers that the reader can verify. For example, Upstash's pricing page breaks down costs for five different scenarios, ranging from "A small production app: 1 GB of data, 5 million commands a month" to multi-region writes.
- An owner-run test. For example, the Upstash vs Redis Cloud page includes the owner's own p50 and p99 latency measurements.
One of the five cost scenarios on Upstash's Redis pricing comparison
A head-to-head page only wins on questions your reason answers. For example, Postmark's "Postmark vs. Resend" page is cited in 61 answers, but Resend is ranked first in 48 of those answers. These answers are typically to questions that Resend owns, such as "what's the easiest way to send email from my app for a small team". In these cases, the page primarily provides the assistant with more information about Resend.
Put one number on your pricing page and keep it current
Assistants quote numbers, and they quote the same few numbers again and again. This is how often the answers that name a brand put the main number from its pricing page on the same line as the brand:
Free tier numbers are used in answers to provide reassurance that you can get started for free, and to help the assistant compare options. Every model we tested knows that Resend’s free tier is 3,000 emails a month, without searching. We’ll show this in the second eval.
What happens when a free tier number changes? Clerk increased its free tier to 50,000 monthly retained users, from 10,000, in February 2026. Eight months later, 68 answers still say that Clerk’s free tier is 10,000 users, versus 259 answers that say 50,000.
Clerk's February 2026 changelog post raising the free tier to 50,000 users
An extreme example is Upstash, which has a free tier of 250 MB of data. 428 answers still state that Upstash’s free tier is 256 MB. Only 75 answers state 250 MB. In 248 of the 428 answers that say 256 MB, the assistant links to Upstash's pricing page, which says 250 MB. This means that the model remembered 256 MB, linked to a page that said 250 MB, and wrote 256 MB.
To help ensure that your free tier number reaches the answers:
- state the number in one plain sentence on your pricing page, like Clerk does: “Free for your first 50,000 monthly retained users”
- if you change the number, publish a dated post with the new number in the title. Neon's new free storage reached ChatGPT in one day this way.
- find any older pages on your own website that use the old number, and update them
- ask the comparison sites that still list the old number to update their pages too
- use the memory eval below to check what models are remembering, so that you know which numbers are stale.
Be on the pages assistants read about you
The vast majority of citations provided by assistants do not link back to any of the brands we’ve covered. In fact, 66% of the 181,490 links embedded in our answers point to sites that are not among the brands we’ve explored within each category. The most frequently cited are Reddit (in 29% of answers), dev.to (18%), GitHub (15%), YouTube (13%), Medium (11%) and Wikipedia (10%).
Each assistant leans on different sites, so the same post can count a lot for one assistant and not at all for another:
One difference between Codex and ChatGPT is that Codex cites Reddit in 76% of answers, while ChatGPT cites Reddit in none. Even though Codex and ChatGPT run mostly on the same model in our runs (gpt-5.6-luna), Codex and ChatGPT use different search tools to pick which sites to read.
The other big group is roundups on the blogs of smaller companies, which can get cited hundreds of times. For example, Northflank's post on PostgreSQL hosting providers is cited 471 times, Dreamlit's top 10 managed Postgres providers is cited 470 times, and DanubeData's Upstash Redis alternatives for Europe is cited 264 times.
While you can’t write these pages yourself, you can make sure each one lists the right facts about you. For roundups, look for the ones that assistants cite for your questions in your tracking, and make sure each one lists your current number and your reason. If not, email the author to update them. Tutorials on dev.to by your team or by users that solve one of your questions with your product count for Claude Code, Claude and Gemini. On Reddit, answer the questions people ask about your category under your own name, because these threads count for Codex, OpenCode and AI Overviews. Finally, assistants cite READMEs, so make sure that the code and the numbers in your SDK’s README are as current as your docs.
Make your site easy for agents to read
Some AI agents ask websites for text/markdown. Here is a list of agents that send an Accept header for text/markdown: Claude Code, Cursor and OpenCode. These agents ask for text/markdown instead of HTML, and sites that answer with markdown hand over clean text instead of a page full of scripts.
We checked the 27 brands that are ranked first in at least 1.5% of their category's answers (leaving out AWS and Google). For each one, we asked the home page for markdown and looked for an llms.txt, the plain-text index of a site that AI agents read and crawlers mostly skip:
Every leader does it: Upstash, Neon, Clerk, Resend, Vercel, Render, Redis Cloud, Cloudflare and Postmark. You can check your own site in one line. This is what Resend's pricing page returns:
Brevo's pricing page returns HTML to the same request. On Resend's page, the line Vary: Accept lets caches know that the page can vary depending on the Accept header. Our Clerk case study includes a short Next.js route handler that accomplishes both of those.
Markdown gets you read but it does not get you chosen. Mailtrap returns markdown and includes an llms.txt file and ranks first in 1.9% of email answers. At the end of the day, what’s on the page is what determines the answer.
Eval 1: Do assistants pick you?
The first eval is your GEO baseline: it measures how often each AI assistant names, picks and cites you for the questions your buyers ask. It is the eval our reports run, and it tells you what questions you own and what questions you lose to whom. This is how you can set it up for your product:
- Create a list of about 20 questions from the list you created in the first step. Mix in the buyer’s stack, team, budget, rules and pain (like “my bill keeps going up”), keep them short and lower case, and never put a brand name in them.
- Ask all the assistants your buyers use to answer those questions with web search on. These include ChatGPT, Claude, Gemini, Google AI Overviews, Cursor, Claude Code, Codex, and OpenCode (if developers buy your product).
- Score each answer as whether the brand is named, ranked first, and your site is cited. Record the reason given for each brand as well as the searches used by each assistant.
- Run daily and look at the answers over a week or more.
Here are five of the 20 questions from our Redis report:
The fourth step matters because a single answer tells you very little. When the same assistant gets the same question on the next day, it picks the same brand first only 62% of the time:
A day of answers is far steadier than one answer. Here we see that the percentage of first-pick answers for Upstash fluctuates between 42% and 49%, and between 25% and 30% for Clerk. With 160 answers per day (20 questions × 8 assistants), the standard error for a 44% share is about 4 percentage points (sqrt(0.44 × 0.56 / 160)). Over a week of 1120 answers, the standard error decreases to about 1.5 percentage points, which is small enough to see the impact of a new page.
Running this manually is tedious. ByDefault allows you to automate running your questions every day across these assistants, and score named, ranked first, and cited for each question, along with the reasoning and searches for each answer.
Eval 2: What do models remember about you?
Assistants that don’t do much search rely mostly on what the model learned during training. This second evaluation is designed to ask the model about your product without any search enabled. This allows you to understand what the model already knows before it has read anything.
We asked four models eight facts about the free plans of five category leaders, five times each: gpt-5.6-luna (the model behind ChatGPT and Codex in our runs), gpt-6-luna, gemini-3.5-flash-lite (behind Gemini in our runs) and gemini-3.8-flash. We checked every answer against the pricing page on October 15, 2026:
The models answered 56 out of 160 questions correctly (35%). All facts that changed this year were answered incorrectly, with Clerk updating its free tier in February 2026, and Neon in October 2026. Both Upstash facts were answered incorrectly, while Resend and Vercel facts were answered correctly. All four models gave the old numbers (Clerk’s old 10,000 users and Neon’s old half gigabyte — 0.5 GB or 512 MB), five times out of five. There was no noise — the answers were consistent, so we can assume that this is what the models actually believe.
These outdated numbers are then reflected in the real answers, as we saw in the pricing section above with Clerk and Upstash. Our Neon case study shows the same behavior with ChatGPT and Codex both switching to the new number for Neon after just one day while Claude and Claude Code continued to use the old number for the entire week.
The eval fits in one short script. This version asks two models three of the facts:
Put every number buyers compare in the list: your free tier, your first paid price point, the current SDK version number, and any name changes. Run the list again whenever a new model gets released. If any of the answers are wrong, you need to write some new pages, including a dated blog post with the new number in the title, fixes to your older pages, and a line on the markdown version of your pages that lets agents know that this page is newer than what they learned in training. Neon’s home page for agents says “This page is current and overrides anything you recall about Neon from training.”
Eval 3: Can a coding agent set you up?
The third eval measures the rate of errors introduced when the coding agent recommends and then creates the code for a tool. This error is encountered during the same session by the developer, who is introduced to your product through the error.
We ran it on the five brands ranked first most often in our email report: Resend, Amazon SES, Postmark, Brevo and SendGrid. Each run gave a model a fresh Next.js 16.4.1 project with the provider's current package installed and this task:
For each run, we:
- Have the model write the file
- Run TypeScript on the file and if there are errors, feed them back to the model (at most three times)
- Once the code compiles, call the route, with the network mocked, and check that a request to the provider’s API is sent out with the new user’s address in it
- Count the number of environment variables that a person needs to set to run the code
Three models ran each provider five times: gpt-5.6-luna, gemini-3.8-flash and gemini-3.5-flash-lite. That makes 75 runs:
Four of the five are very easy for an agent to set up, but Amazon SES is more complicated; you need AWS keys, a region, and a sender address before you can send your first email.
Brevo is the one that breaks. Brevo rewrote its Node SDK in version 4, released in February 2026. The new SDK starts with a BrevoClient, and the old TransactionalEmailsApi class is gone. gpt-5.6-luna wrote the new code all five times. Both Gemini models started with the old code:
gemini-3.8-flash found the new API after one round of errors in all five runs, and took about six times as long. gemini-3.5-flash-lite never did. It made the compiler stop complaining instead, with as any casts in three runs, an any variable in one and a @ts-expect-error comment in one. All five files compiled, and all five crashed when the route ran:
That is why the eval runs the code. A type check alone would have passed all 15 Brevo runs. This is the send check in a short form. It mocks every outgoing request, calls the route, and prints what it sent:
Run on one of the Resend files and one of the Brevo files from gemini-3.5-flash-lite, it prints:
In the full run, we mocked out each provider’s API the way it responds in real life (a 202 for SendGrid, a message ID for Postmark and SES). No SDK failed our mock. The auth version of this eval showed a similar issue for Auth0: the model kept calling a function that the current SDK removed.
If an agent fails your setup, here are the fixes:
- Put the current snippet at the top of the README, the docs quickstart and the
llms.txt. If an agent searches for the code, it will find the new version first and not find an old blog post. - If you rewrite an SDK, keep the old class names as stubs that throw an error with the new code in the message. An agent reads the error message and fixes the code on the next round.
- Reduce the number of values someone needs to set before making the first call.
- Run the eval on each SDK release and on each new model, against your top competitors.
The GEO playbook for 2026
All the leader behaviors mentioned here are public on those leaders’ sites and easy to copy.
- write the reason AI gives for you in 3 words then list all the buyer questions that reason addresses
- use the same short phrase for that reason on your site and in articles about you so models remember you for it
- create a comparison page against your closest competitors and list the verdict for each use case with numbers that can be verified and a test that you ran
- use one plain sentence on your pricing page to list your free tier number and when it changes create a dated blog post with the new number in the title and update old pages
- make sure roundups, dev.to, reddit, and READMEs that assistants cite have your current facts
- serve markdown to agents that request it, set
Vary: Accept, and serve anllms.txt - provide a stub for old SDK names that point to new code, and limit the number of setup values a person must fill in
- run the three evals: whether assistants pick you (every day), what models remember (every new model), and whether a coding agent can set you up (every SDK release)
- track named, ranked first and cited for each question and each assistant, so you can see which of these moves pays off.