OG Title and Description Generator: Keeping Your Preview Copy On-Brand at Scale
An og title and description generator needs to hold a consistent voice across hundreds of pages without every one reading like it was written by a different person. Here's how to set that up.
August 16, 20266 min read
An og title and description generator is easy to build badly: pull the page's H1 into og:title, pull the first paragraph into og:description, and call it done. That produces technically present tags, which passes a basic check, but it rarely produces copy that sounds like it belongs to the same brand across a hundred different pages written by different people over different months. Keeping og:title and og:description on-brand at scale is a different problem than just making sure they exist, and it's the one most generators skip.
Why naive extraction produces inconsistent copy
Pulling straight from page content works fine as a fallback, but page content wasn't written with a social card in mind. An H1 optimized for on-page hierarchy might be long, might assume surrounding context the card doesn't have, or might just be phrased for readability at full size rather than punchiness at card size. A first paragraph pulled wholesale as og:description often reads as an opening sentence rather than a summary — it sets up an article instead of describing it, because that's the job it was actually written to do.
The inconsistency compounds when different authors write differently. One blog contributor writes punchy, declarative openers; another writes longer, more exploratory ones. Extract straight from content and the card copy inherits that same inconsistency, so a set of preview cards for the same blog ends up feeling like it belongs to five different publications rather than one.
What a title and description meant for a card actually needs
Card copy has a different job than page copy. og:title needs to work as a headline at a glance, inside a feed someone is scrolling past quickly — shorter and more declarative usually wins over something clever that needs a second read. og:description needs to summarize the value of clicking through, not narrate the page's structure. Writing (or generating) these as their own fields, distinct from the page's actual H1 and body copy, gives you room to hold both to a consistent voice regardless of who wrote the underlying page.
- Write og:title as a standalone headline, not a copy-paste of the page H1 — shorter, punchier, and self-contained without page context
- Keep og:title under roughly 60 characters where possible so platforms don't truncate it mid-word
- Write og:description as a value statement (what you get from clicking), not a restatement of the intro paragraph
- Keep a consistent sentence structure and tone across the set — declarative statements, active voice, no filler adjectives
- Avoid duplicating the meta description verbatim if the two are targeting slightly different audiences (search intent vs. social scroll intent)
Building a repeatable voice with templates
The way to hold a consistent voice across a large number of pages without a person rewriting every card by hand is a template with a defined structure — a pattern that different content slots into, rather than fully freeform text per page. A blog might use a pattern like '{Topic}: {specific claim}' for og:title, so every post's title follows the same rhythm regardless of how the on-page H1 was phrased. A product catalog might use '{Product name} — {key differentiator}, from ${price}' so every product card reads with the same cadence. The template enforces consistency; the variable slots keep each one specific to the actual page.
This only works if the template's fixed structure is genuinely good for a wide range of inputs, which means testing it against the actual range of content it'll cover — a short product name and a long one, a post with a punchy claim and one that's harder to compress. A pattern that only works for the three examples used to design it will produce awkward results the moment real content varies outside that range.
Length limits still apply
Consistency and length discipline aren't separate goals — a template that produces on-brand copy but regularly overflows platform truncation limits is still broken. og:title generally holds up best under roughly 60 characters, and og:description under roughly 110-120 characters for platforms that render it inline on the card (longer text tends to get cut with an ellipsis, sometimes mid-word, which reads as sloppy regardless of how good the underlying copy is). A template needs both a defined voice and an enforced length ceiling, and the two need to be checked together, not separately.
Who should own the voice decisions
Because card copy is a distinct writing surface from page copy, it benefits from having one owner making the structural decisions — the sentence pattern, the length ceiling, the tone rules — even on a team where many different people write the underlying pages. That doesn't mean one person writes every card by hand; it means one person (or a small brand or marketing function) defines the template pattern that everyone else's content flows through. Individual authors keep writing their own H1s and body copy however suits the page, and the card copy stays consistent because it's generated from a shared pattern rather than reinvented by whoever happened to write that particular page.
This division of labor also makes it easier to update the voice later without touching every existing page. If the pattern for og:title changes — a rebrand, a shift in tone, a decision to drop a recurring suffix — updating the template's pattern updates how future pages render without requiring anyone to go back and manually rewrite hundreds of already-published cards, as long as the underlying rendering pulls from the current template rather than a frozen snapshot per page.
Auditing existing copy for consistency and staleness
Once a site has a working template, the remaining risk isn't the writing — it's drift. A page that had a good og:title six months ago can end up with a value that no longer matches the page (a product renamed, a post retitled, a CMS field overwritten by an unrelated edit), and that's invisible to anyone unless it's actively checked. This is the same category of problem as any other metadata drift: the tag is present, so a basic check passes, but the value is wrong and nobody notices until a share looks off.
Voice consistency across content types, not just across authors
It's worth separating two kinds of consistency that get conflated: consistency across different authors writing the same content type, and consistency across different content types on the same site. The first is what a single template pattern solves directly — every blog post's og:title follows the same structural rule regardless of who wrote the post. The second is a bigger decision: whether a blog post's card and a product page's card should sound like they're from the same brand at all, given that they're serving different purposes and different audiences. Most sites benefit from a shared visual language (same logo placement, same color system) even when the text pattern differs meaningfully by content type — a blog post card built around a headline claim reads very differently from a product card built around a name and a price, and forcing both into one identical text template usually produces an awkward fit for at least one of them.
Where useopengraph fits into keeping this consistent
useopengraph's templates support text variables for og:title and og:description-equivalent fields directly inside the image itself, so the rendered card's headline copy is generated from the same structured pattern every time, rather than depending on whoever wrote a given page's H1. And because Site Audits check og:title and og:description presence and flag regressions between runs — with Drift Monitor on the Agency plan catching a value that silently changes even while staying present — a template-driven approach to voice consistency gets backed by ongoing verification that the copy hasn't quietly drifted off-brand on any individual page since the last check.
Stop paying per seat
for a usage-shaped problem.
Unlimited teammates, one usage pool. Start free with the scanner — no card required.