Payload
Get your Payload pages found in Google and AI answers
Growth Radar reads your published Payload documents, suggests better search titles and descriptions, and saves the ones you approve back to your documents. Setting it up takes one package, one line in your config and one environment variable.
It uses the SEO fields you already have
By default it reads and writes meta.title and meta.description, the fields Payload's official SEO plugin adds. If you keep yours somewhere else, you can point it at those fields instead. Changes go through Payload's normal update, so your hooks and version history still run. If a page has an unpublished draft, the change waits and tells you why, because saving it would publish the draft along with it.
Nothing changes until you approve it
Each suggestion appears in your Growth Radar account next to what the page says now, along with the reason for it. Undo puts the old value back, unless someone has edited the field since, in which case their version stays.
It's fine on serverless hosting
The plugin doesn't need a background process. It adds one signed endpoint to your Payload API, and Growth Radar calls it when there's something to do, so it works the same on Vercel as on your own server.
What it doesn't cover yet
It handles titles and descriptions in your default language. Canonical tags, redirects and structured data stay in your code, because in a headless setup that's where they live. Your frontend also has to print the SEO fields in the page head, which the example project shows.
Connecting it
- Install the package.
- Add the plugin to payload.config.ts and tell it the public path of each collection.
- Create a token in your Growth Radar account, set it as GROWTH_RADAR_TOKEN and deploy.
- Choose Check the connection in your account. Your pages should appear within a minute.
npm i https://growthradar.app/payload/growth-radar-payload.tgzimport { seoPlugin } from "@payloadcms/plugin-seo";
import { growthRadar } from "growth-radar-payload";
plugins: [
seoPlugin({ collections: ["pages", "posts"] }),
growthRadar({
collections: {
pages: (doc) => (doc.slug === "home" ? "/" : `/${doc.slug}`),
posts: "/blog/:slug",
},
}),
],export async function generateMetadata({ params }) {
const doc = await findPost((await params).slug);
return { title: doc.meta?.title || doc.title, description: doc.meta?.description };
}