How Base44 pre-rendering actually works
Base44 serves crawlers pre-rendered pages from a cache, by user agent, and a hidden summary when a page isn't cached. What we measured, what fills the cache, and why it hurts SEO.
9 min read
Base44 keeps a cache of pre-rendered pages. When a request arrives, it checks the user agent. A browser gets the normal React app. A recognized crawler gets the cached render if one exists, and otherwise a hidden, auto-written summary. Nothing is rendered while the crawler waits, and asking for a page doesn’t reliably get it rendered. What fills the cache, and when, isn’t visible from outside: Base44’s docs say renders refresh when you publish.
This explains the mechanism based on Base44’s documentation and on requests to 186 pages across 47 live Base44 sites, plus follow-up cache tests. For the big picture, start with the complete guide.
The request flow
| Who asks | Page in the render cache? | What Base44 sends |
|---|---|---|
| A browser | Doesn’t matter | The app’s HTML shell, with the summary block inside #root, replaced by React on load |
| A recognized crawler | Yes | The cached render: real headings, copy and data, plus Base44’s meta tags |
| A recognized crawler | No | The shell with the summary block, which is all the crawler reads |
| An unrecognized crawler or tool | Doesn’t matter | The shell with the summary block |
Browsers also receive the summary block, hidden with a 1-pixel clipping style and replaced as soon as React renders. And every response, rendered or not, carries the page head Base44 writes: title, description, canonical, Open Graph tags and JSON-LD.
Why it has to be a cache
Median time to first byte was about 0.6 to 0.7 seconds for browsers, summaries and renders alike, and rendered responses on repeat requests came back in 0.3 to 1 second. Starting a headless browser, loading a React app and waiting for its data takes several seconds. So a crawler never gets a render made for its request. It gets a stored copy or the summary.
What we measured about the cache
It’s consistent. Twelve pages with a render returned it on 8 of 8 rapid repeat requests.
It’s keyed by URL, ignoring tracking parameters. The same twelve pages with ?utm_source=... added returned the render at once, matching how Base44’s canonical tags strip tracking parameters. With a made-up content parameter such as ?b44check=123, they were a new cache entry and returned the summary on 13 straight requests over three minutes.
Requests don’t fill it. We requested 28 pages that were serving the summary every 10 seconds for four minutes with Googlebot’s user agent. None got a render.
Something fills it in the background. In the first test, 32 inner pages and 7 homepages switched from summary to render between two passes a few minutes apart. The schedule behind that isn’t visible, and Base44 doesn’t document it beyond “refreshes this rendered content when you publish.”
Renders expire. About a day later, 13 of 44 pages that had a render were serving the summary again.
What this means for SEO
- A different page for crawlers. Every summary response gives a crawler a page visitors never see. Google only excuses a separate crawler version “as long as your dynamic rendering produces similar content,” so this is a cloaking risk on every page without a cached render.
- Content arrives late. After you publish a new page or change one, crawlers get the summary or a stale render until Base44 renders it on its own schedule. If Google falls back to rendering your JavaScript itself, the page waits in its rendering queue, which is the delay pre-rendering exists to remove.
- You can’t fix it from inside Base44. Requesting pages doesn’t render them, and there’s no setting to render a page on demand. Republishing is the only documented refresh.
- Coverage gaps. Pages that never get a render, renders that expire, record URLs outside the sitemap, and crawlers Base44 never renders for all leave parts of your site known to search engines only as near-identical summaries.
Recognition is by user agent
Changing only the user-agent string, from the same IP address, switched the response between the app and the cached render. That’s why testing with curl -A works on Base44, and why tools with their own user agents, like Screaming Frog, Ahrefs or Google’s inspection tool, see the summary. The crawler list shows which user agents were recognized.
The render includes your data
When a render exists, it’s a real one. On the sites we tested, renders included data loaded from the app: a reading app’s series page showed the series’ name and description, and a directory’s homepage came back with 12,965 characters of real content where its summary had about 1,200. Some renders were thin, like forgot-password screens, because the page itself is thin.
What the render doesn’t fix is the head. Titles on record pages stayed generic (“Series | StoryNook”) because Base44 generates titles from the page’s URL. See the record pages guide.
The main SEO toggle
All of this depends on Enable SEO for this app staying on. Base44’s docs say turning it off “also disables prerendering,” after which crawlers get “a bare HTML shell with no page content.” To manage your own meta tags or JSON-LD, use the Platform meta tag injection and Platform structured data injection toggles in Advanced Settings instead.
What to do next
- Test your key pages with a crawler user agent using the testing guide.
- Test again after your next publish to see which pages get rendered.
- If important pages serve the summary, read the fix options.
Frequently asked questions
- Does Base44 render pages when a crawler asks for them?
- Not while the crawler waits. Responses came back in about 0.3 to 1 second whether they were renders or summaries, which is far too fast for a headless browser to render a React app. Base44 serves a stored render if it has one and its hidden summary if it doesn't.
- When does Base44 create a pre-rendered page?
- Base44's docs say it refreshes the rendered content when you publish, and that's the only trigger it documents. Renders also appeared between our test passes, so something fills the cache in the background, but requesting a page didn't reliably produce one: pages requested every 10 seconds for four minutes stayed on the summary.
- How does Base44 know a request is from a crawler?
- By the user agent string. Requests carrying Googlebot's, GPTBot's or another recognized crawler's user agent got the cached render, and the same request with a browser user agent got the normal app, from the same IP address.
- Do all crawlers get the same Base44 render?
- Yes. The cache is keyed by URL, with tracking parameters such as utm_source ignored, and every recognized crawler gets the same cached copy. A different URL, such as one with an extra content parameter, is a separate cache entry.
Read next
Keep going
-
Pre-rendering Base44 apps: the complete guide
Does Base44 pre-render pages for Google and AI crawlers? Only from a cache. How Base44 pre-rendering works, where it leaves gaps, and every way to prerender a Base44 app.
-
Base44's seo-snapshot block: what it is, how to improve it
Every Base44 page ships a hidden seo-snapshot div that crawlers read when no render is ready. What it contains, where its text comes from, and how to make it better.
-
Which crawlers Base44 pre-renders for, and which it skips
We tested 33 user agents against live Base44 pages. Googlebot, Bingbot, GPTBot, ClaudeBot and PerplexityBot get renders. Bravebot, Meta and Search Console's tester don't.
-
Can you warm Base44's pre-render cache? We tested it
Requesting Base44 pages with a crawler user agent doesn't make Base44 render them. Our cache tests, a script to monitor which pages serve the summary, and the fixes that work.