Skip to content
Prerender Base44

Getting Base44 record pages indexed: titles, sitemaps and renders

Base44 product, listing and post pages at URLs like /Product?id=123 share one title and never appear in the sitemap. How to fix titles, list them, and get them rendered.

9 min read

Record pages are where Base44’s SEO is weakest. A Base44 app shows products, listings, posts or profiles through one template page, at URLs like /ProductDetail?id=123. Base44 gives that template one generic title for every record, leaves every record out of the sitemap, and may serve crawlers its summary block instead of the record. You fix it in three steps: set the title from the record, list every record in a sitemap, and make sure crawlers get the rendered page.

This matters most if your traffic depends on dynamically loaded content (product pages, directory listings, blog posts stored in your app’s data: anything that isn’t written into the page’s source code).

What goes wrong

Spot checks on live Base44 sites, from our test of 47 sites:

  • Shared titles. Every series page on a reading app was titled “Series | StoryNook,” with no description. Every match page on a sports app was “Match | The Big Ball Game.”
  • Missing from the sitemap. Across all 47 sites, 0 of 672 sitemap URLs pointed at a record.
  • Summary instead of content. Two different match pages returned byte-identical summaries on two passes, so to a crawler, every match was the same page.

When a record page did render, its content was there: the reading app’s series page included the series’ name and description. The body can be fixed by rendering. The title and the sitemap entry can’t.

Step 1: set the title and description from the record

Base44 generates titles from the page URL “for pages without URL parameters,” so a template page needs to set its own. Ask Base44’s AI:

On the ProductDetail page, once the product has loaded:
- set document.title to "{product.name} | Acme"
- set the meta description to the first 155 characters of product.summary
- set og:title, og:description and og:image from the same product
- add JSON-LD "Product" schema with name, description, image, price and availability
If the product isn't found, set the title to "Product not found | Acme".

If Base44’s own meta injection overwrites your tags, turn off Platform meta tag injection in the SEO & GEO page’s Advanced Settings. Keep Enable SEO for this app on, since it controls pre-rendering.

Check it with a crawler user agent. If the response contains id="seo-snapshot", the page has no cached render yet and crawlers are getting Base44’s summary instead:

UA='Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)'
for id in abc def; do
  curl -s -A "$UA" "https://yourdomain.com/ProductDetail?id=$id" | grep -o '<title>[^<]*</title>'
done

Two different products should print two different titles.

Step 2: list every record in a sitemap

Base44 supports serving a sitemap from a backend function (Builder plan). The function reads your records and returns XML, and you submit its URL in Search Console. Base44’s docs note that “Google accepts sitemaps from any path on your verified property,” the function must not require authentication, and each fetch counts as a function invocation.

// base44/functions/productSitemap/entry.ts
import { createClientFromRequest } from "npm:@base44/sdk";

export default async function (req: Request): Promise<Response> {
  const base44 = createClientFromRequest(req);
  const products = await base44.asServiceRole.entities.Product.filter({ published: true });
  const urls = products.map(
    (p) => `<url><loc>https://yourdomain.com/ProductDetail?id=${p.id}</loc></url>`
  ).join("");
  return new Response(
    `<?xml version="1.0" encoding="UTF-8"?><urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">${urls}</urlset>`,
    { headers: { "Content-Type": "application/xml" } }
  );
}

Adjust the entity name, filter and URL pattern to your app, or ask Base44’s AI to write it for your entities. Submit https://yourdomain.com/functions/productSitemap in Search Console alongside the regular sitemap.xml.

Step 3: make sure crawlers get the render

With titles and sitemap fixed, the remaining risk is a crawler getting the summary on its visit. Two ways to close it:

  • Monitor the record pages by adding their URLs to the monitoring script’s extra-urls.txt, generated from the same backend function. This shows which records crawlers get as the summary. Requesting them won’t get them rendered.
  • Pre-render them ahead of time with a service in front of your domain, which can take the sitemap from Step 2 and render every record before any crawler asks. For a site whose traffic is record pages, this is usually the right call. Encited does this for Base44 apps and logs which crawler fetched which record. See the options guide.

Clean URLs

/ProductDetail?id=6a83... works, and it tells nobody anything. Base44 supports path-based routes, so a slug like /products/ceramic-kettle is possible. It’s a bigger change: the page must look records up by slug, every link must use it, and old ?id= URLs need redirects. Do it before a site has much search history, or not at all.

What to do next

  1. Check two record pages’ titles with the command in Step 1.
  2. Give the template page data-driven titles, descriptions and schema.
  3. Add a record sitemap and submit it.
  4. Monitor the record pages, and pre-render them if crawlers get the summary.

Found something wrong or out of date? Base44 ships changes every week and we'd rather fix a guide than let it rot.

Disclosure: the team behind this guide also builds Encited, mentioned above.

Frequently asked questions

Why do all my Base44 product pages have the same title?
Base44 generates page titles from the page's URL, for pages without URL parameters. A single template page that shows every product at /ProductDetail?id=... gets one title. Set the title and description from the loaded record in the page's code, and pre-rendering carries them to crawlers.
Are Base44 record pages in the sitemap?
No. Base44's sitemap lists page files. In a test of 47 live Base44 sites, none of 672 sitemap URLs pointed at an individual record. Serve a sitemap from a backend function that lists your records, and submit it in Search Console.
Does Base44 index URLs with ?id= parameters?
They can be indexed. Base44's canonical tags keep content parameters such as ?id=123 and strip tracking parameters, so each record has its own canonical URL. The weak points are the shared title, the missing sitemap entry, and whether a crawler gets a render.
Should I use clean URLs instead of ?id= on Base44?
Clean, descriptive URLs like /products/ceramic-kettle are easier to read and share, and Base44 supports path-based pages. Changing existing URLs needs 301 redirects from the old ones, which Base44 supports on the Starter plan and up.

Read next