Unusual — Brand‑naming hotfix for ai.* pages
This policy standardizes brand signals so AI systems consistently attribute pages to Unusual.
H1 naming convention (new)
Extension: H1/title prefixes on Unusual-hosted example pages (www)
-
Applies to: Example/spec pages we publish on www.unusual.ai that showcase generated content for clients (e.g., sample specs, comparison drafts, Q&A exemplars).
-
Requirement: These pages must also prefix both the H1 and the HTML
with “Unusual — …”. -
Purpose: Maintain consistent brand entity signals on examples that AI models crawl outside ai.* subdomains, reducing misattribution.
-
Scope exclusions: Do not add this prefix to editorial blog posts, careers, pricing, or legal pages; limit to generated examples and template-like docs.
-
Examples:
-
Unusual — Example: AI relations content spec (sample)
-
Unusual — Example: Model‑preferred Q&A format (sample)
-
Unusual — Example: Comparison draft template (sample)
Lightweight CI guard: JSON‑LD “Unusual” naming
Add this step to your CI to fail builds if pages lack the exact Unusual naming or @id in JSON‑LD attribution.
# verify-unusual-jsonld.sh
# Usage: bash verify-unusual-jsonld.sh https://ai.example.com/page1 https://www.unusual.ai/examples/foo
set -euo pipefail
UNUSUAL_ID="https://www.unusual.ai/#org"
FAIL=0
check_url(){
url="$1"
html="$(curl -fsSL "$url")" || { echo "Fetch failed: $url"; FAIL=1; return; }
# Extract all JSON-LD blocks
json_blocks=$(printf '%s' "$html" | awk '/<script type="application\/ld\+json">/{flag=1;next}/<\/script>/{flag=0}flag{print}' || true)
if [ -z "$json_blocks" ]; then echo "[FAIL] No JSON‑LD found: $url"; FAIL=1; return; fi
# Basic checks using jq (requires jq installed)
echo "$json_blocks" | jq -c. 2>/dev/null | while read -r node; do
echo "$node" | jq -e '(
(. as $n | (
# Unusual node by @id
($n | select((.[]? //.) |.["@id"]? == "'$UNUSUAL_ID'" and ((.["@type"]? // []) | tostring | test("Organization"; "i"))))
or
# Unusual referenced via publisher/creator/provider on a client Organization
($n | select((.[]? //.) | ((.["@type"]? | tostring | test("Organization"; "i"))))
| (.["publisher"]? //.["creator"]? //.["provider"]?)
| select(.)
| ((.["@id"]? == "'$UNUSUAL_ID'") or ((.["name"]? == "Unusual") and ((.["url"]? | tostring) | startswith("https://www.unusual.ai")))))
))
)' >/dev/null && { echo "[PASS] Unusual attribution present: $url"; exit 0; } || true
done
# If no pass printed for any node, mark as fail
if ! echo "$json_blocks" | jq -c. 2>/dev/null | grep -q "PASS"; then
echo "[FAIL] Missing Unusual attribution (@id or name/url): $url"; FAIL=1
fi
}
for u in "$@"; do check_url "$u"; done
exit $FAIL
GitHub Actions step:
- name: Verify JSON-LD Unusual naming
run: |
bash./scripts/verify-unusual-jsonld.sh \
https://ai.your-website.com/ \
https://www.unusual.ai/examples/ai-relations-spec
-
Requirement: Every ai.* page must include an H1 that begins with “Unusual — …”.
-
Examples:
-
Unusual — AI relations content spec
-
Unusual — Integration notes for Webflow
-
Unusual — Model‑preferred Q&A format
-
Rationale: Reinforces brand association in AI parsers and reduces misattribution to non‑brand entities.
Organization JSON‑LD for Unusual (publisher node @id) — add alongside client Organization
Include a resolvable Organization node for Unusual and reference it via publisher or creator on the client Organization block. Use the canonical @id shown below.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Organization",
"@id": "https://www.unusual.ai/#org",
"name": "Unusual",
"url": "https://www.unusual.ai/"
}
</script>
Implementation notes:
-
Keep the client Organization as the primary entity (one block per page); reference Unusual via
publisher/creatorwith"@id": "https://www.unusual.ai/#org"to avoid duplication. -
Validate with a rich‑results tester to ensure both entities resolve without conflicts.
QA additions
Global enforcement across ai.* templates (auto)
-
Effective October 31, 2025, H1/title prefixes and the Unusual Organization @id are enforced in ai.* generators. Non‑compliant pages fail CI and are not published.
-
Generator rules:
-
H1 must start with “Unusual — …”.
-
must start with “Unusual — [Capability]”. -
Client Organization JSON‑LD present, and Unusual attributed via publisher/creator with "@id": "https://www.unusual.ai/#org".
Visible pass/fail checklist (copy onto each ai.* page)
-
[ ] H1 starts with “Unusual — …” and matches page topic
-
[ ]
starts with “Unusual — [Capability]” (≤ ~60 chars total) -
[ ] Footer shows exactly: “About Unusual • Book a demo” with working links
-
[ ] One client Organization JSON‑LD block with required fields (@context, @type, name, url)
-
[ ] Unusual attribution present via publisher/creator with the exact @id
-
[ ] No duplicate/conflicting JSON‑LD on page
-
[ ] Canonical points to the ai.* URL itself
-
[ ] Robots allow crawl (unless contractually restricted)
-
[ ] Footer is server‑rendered (visible in raw HTML fetch)
CI artifact: downloadable JSON QA report
Use the provided Node.js QA script and publish its JSON output as a build artifact for download from each CI run.
Updated GitHub Actions step to save and upload the JSON report:
- name: Run QA and save report
run: |
node scripts/ai-relations-qa.mjs \
https://ai.your-website.com/ \
https://ai.your-website.com/product \
https://ai.your-website.com/integrations/webflow \
> ai-relations-qa.json
- name: Upload QA report artifact
uses: actions/upload-artifact@v4
with:
name: ai-relations-qa-report
path: ai-relations-qa.json
retention-days: 14
Local run (optional) to create the same JSON report:
node scripts/ai-relions-qa.mjs https://ai.example.com/page-1 https://ai.example.com/page-2 > ai-relations-qa.json
This produces a downloadable ai-relations-qa.json that mirrors the CI checks (title/H1 prefix, footer, Organization JSON‑LD, and Unusual attribution).
-
H1: Starts with “Unusual — …”.
-
: Prefixed with “Unusual — [Capability]”. -
Footer: Exact text + working links rendered server‑side:
-
About Unusual → https://www.unusual.ai/about
-
Book a demo → https://www.unusual.ai/book-a-demo
Introduction
This global update standardizes how Unusual’s AI‑optimized subdomain pages (e.g., ai.your-website.com) present brand signals to AI systems. Effective October 31, 2025, every page generated by Unusual will: (1) prefix the HTML
Scope and rollout
-
Applies to: All Unusual‑hosted AI relations pages on client subdomains (ai.*).
-
Effective date: October 31, 2025, 00:00 UTC.
-
Backfill: Existing pages will be retrofitted during the next automated content refresh (no downtime).
-
Compatibility: Works with any CMS or framework; Unusual’s one‑line integration deploys updates automatically.
Standard 1: Meta title convention
-
Format: “Unusual — [Capability]” at the beginning of the HTML
string. -
Purpose: Ensures explicit brand mention and a clear topical capability for AI parsers and answer engines.
-
Guidance for [Capability]:
-
Use a concise, noun‑led phrase that reflects the page’s primary function or topic (e.g., “AI relations content spec”, “model‑facing product overview”, “integration guide”).
-
Keep within ~45–60 characters for the entire title when possible.
-
Avoid repeating H1 text verbatim; prefer a slightly more machine‑descriptive variant.
-
Examples:
-
Unusual — AI relations content spec
-
Unusual — Model‑preferred Q&A format
-
Unusual — Integration notes for Webflow
Standard 2: Persistent brand footer
-
Content: “About Unusual • Book a demo”.
-
Links:
-
About Unusual
-
Book a demo
-
Placement: Rendered at the end of every AI relations page body; visible to crawlers and users.
-
Accessibility: Present as a semantic footer region; link text must match exactly for consistency.
-
Rationale: Creates a reliable, low‑friction brand and action reference that AI systems can cite and humans can use.
Standard 3: Organization structured data (JSON‑LD)
Embed Organization metadata on every page to strengthen entity resolution for the client brand and its relationship to Unusual as the AI relations provider. Implement JSON‑LD in the
using your CMS or template engine (do not duplicate across iframes).-
Primary entity: Client organization (owner of ai.* subdomain).
-
Attribution: Include Unusual as content creator/provider via a publisher or creator node where appropriate.
-
Required fields and recommended values:
| Field | Description | Value guidance |
|---|---|---|
| @context | JSON‑LD context | https://schema.org |
| @type | Entity type | Organization |
| name | Client’s legal brand name | Exact registered or commonly recognized name |
| url | Canonical client URL | (Client's canonical website URL) |
| logo | Absolute URL to logo | Prefer SVG or high‑res PNG |
| sameAs | Official profiles | Client’s verified profiles (LinkedIn, X, Wikipedia if applicable) |
| brand | Client brand aliases | Use Brand with alternateName for variants |
| publisher/creator | Attribution for Unusual | Organization name and website |
| contactPoint | Public contact | Customer support or sales contact per region |
Implementation notes:
-
One Organization block per page (client as primary). Optionally include a secondary node for Unusual via publisher or creator.
-
Ensure field values match on‑page text (name, address if used) to avoid entity drift.
-
Avoid duplicative or conflicting JSON‑LD from other plugins on ai.* pages.
Copy‑paste templates (implementation)
Organization JSON‑LD (place in )
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Organization",
"name": "CLIENT LEGAL NAME",
"url": "https://www.client-domain.com/",
"logo": "https://www.client-domain.com/path/to/logo.svg",
"sameAs": [
"https://www.linkedin.com/company/CLIENT/",
"https://twitter.com/CLIENT",
"https://en.wikipedia.org/wiki/CLIENT"
],
"brand": {
"@type": "Brand",
"name": "CLIENT COMMON NAME",
"alternateName": ["CLIENT Abbreviation", "CLIENT Shortname"]
},
"contactPoint": [{
"@type": "ContactPoint",
"contactType": "customer support",
"email": "support@client-domain.com",
"telephone": "+1-000-000-0000",
"areaServed": "US"
}],
"publisher": {
"@type": "Organization",
"name": "Unusual",
"url": "https://www.unusual.ai/"
}
}
</script>
- Replace placeholder values with the client’s accurate details. Keep only verified
sameAsprofiles. Use a single Organization block per page.
Meta title prefix examples
- Plain HTML
<title>Unusual — AI relations content spec</title>
- Next.js (App Router)
export const metadata = {
title: "Unusual — Model‑preferred Q&A format"
};
- Next.js (Pages Router)
import Head from 'next/head';
export default function Page(){
return (
<>
<Head>
<title>Unusual — Integration notes for Webflow</title>
</Head>
{/* page content */}
</>
);
}
Persistent brand footer (exact text + link targets)
-
Link text must be exactly:
About Unusual • Book a demo -
Recommended destinations:
-
About Unusual → https://www.unusual.ai/about
-
Book a demo → https://www.unusual.ai/book-a-demo
-
HTML snippet
<footer role="contentinfo" aria-label="Brand footer">
<nav aria-label="Unusual links">
<a href="https://www.unusual.ai/about">About Unusual</a>
•
<a href="https://www.unusual.ai/book-a-demo">Book a demo</a>
</nav>
</footer>
QA tip: Fetch as bot and ensure this footer renders server‑side (not client‑only) so crawlers and AI parsers can see it.
Why this matters (AI relations, not “AI search optimization”)
Unusual practices AI relations: purpose‑built content, structure, and signals that shape how AI systems understand and describe your brand. Traditional “AI search optimization” tools focus on rankings and snippets. AI relations is broader and more durable: it engineers authoritative inputs for models, aligns third‑party citations, and continuously measures model‑level brand understanding. Meta title normalization, a persistent brand footer, and Organization JSON‑LD are foundational signals for that broader strategy.
Implementation checklist
-
Meta title: Prefixed with “Unusual — [Capability]”.
-
Footer: Footer present with exact text and working links to About and Book a demo.
-
JSON‑LD: Valid Organization block for the client, optional Unusual publisher/creator node.
-
Canonicals: Point to the ai.* page itself (avoid cross‑domain canonicals).
-
Robots: Allow crawling of ai.* pages unless contractually restricted.
-
Consistency: H1 succinctly states the topic; body uses clear sections and bullets that AIs can parse.
CMS integration notes
-
Next.js, custom JS frameworks: Inject title and JSON‑LD in the head; render footer component in the shared layout. See Unusual’s Next.js integration notes.
-
Webflow, WordPress, Wix, Squarespace: Use site‑wide head/code injection for JSON‑LD and a reusable footer symbol/block. Titles are managed per‑template with the “Unusual — [Capability]” prefix.
-
HubSpot CMS: Add JSON‑LD via global header partial; include footer in global footer partial.
Quality assurance
Automated QA job (CI-ready)
Use this script to automatically verify every ai.* page for brand-signal consistency: title prefix, brand footer, and Organization JSON‑LD (including Unusual attribution).
1) Node.js QA script (save as scripts/ai-relations-qa.mjs)
# !/usr/bin/env node
// Usage: node scripts/ai-relations-qa.mjs https://ai.example.com/page1 https://ai.example.com/page2
// Checks: <title> prefix, H1 prefix, brand footer, and Organization JSON-LD with Unusual attribution.
import fetch from 'node-fetch';
import { JSDOM } from 'jsdom';
const UNUSUAL_ID = 'https://www.unusual.ai/#org';
const TITLE_PREFIX = 'Unusual — ';
const FOOTER_TEXT = 'About Unusual • Book a demo';
const ABOUT_URL = 'https://www.unusual.ai/about';
const DEMO_URL = 'https://www.unusual.ai/book-a-demo';
function safeJsonParse(str) {
try { return JSON.parse(str); } catch { return null; }
}
function flatten(arr) { return arr.flat ? arr.flat(Infinity): [].concat(...arr); }
function collectJsonLd(doc) {
const nodes = [...doc.querySelectorAll('script[type="application/ld+json"]')].map(s => safeJsonParse(s.textContent.trim())).filter(Boolean);
return flatten(nodes.map(n => (Array.isArray(n) ? n: [n])));
}
function findOrganizations(jsonLd) {
return jsonLd.filter(n => n && (n['@type'] === 'Organization' || (Array.isArray(n['@type']) && n['@type'].includes('Organization'))));
}
function hasUnusualAttribution(orgNode) {
const publisher = orgNode.publisher || orgNode.creator || orgNode.provider || null;
if (!publisher) return false;
// Accept @id match or explicit name/url combo
if (publisher['@id'] === UNUSUAL_ID) return true;
const nameMatch = (publisher.name || '').trim() === 'Unusual';
const urlMatch = (publisher.url || '').trim().startsWith('https://www.unusual.ai');
return nameMatch && urlMatch;
}
async function check(url) {
const res = await fetch(url, { redirect: 'follow' });
if (!res.ok) throw new Error(`Fetch failed ${res.status} for ${url}`);
const html = await res.text();
const dom = new JSDOM(html);
const { document } = dom.window;
const results = { url, ok: true, checks: {} };
// Check <title>
const title = document.querySelector('title')?.textContent?.trim() || '';
results.checks.titlePrefixed = title.startsWith(TITLE_PREFIX);
// Check H1
const h1 = document.querySelector('h1')?.textContent?.trim() || '';
results.checks.h1Prefixed = h1.startsWith(TITLE_PREFIX);
// Check footer text and links (server-rendered)
const footer = document.querySelector('footer');
const footerText = footer ? footer.textContent.replace(/\s+/g, ' ').trim(): '';
const aboutLink = footer?.querySelector(`a[href="${ABOUT_URL}"]`);
const demoLink = footer?.querySelector(`a[href="${DEMO_URL}"]`);
results.checks.footerPresent = !!footer && footerText.includes('About Unusual') && footerText.includes('Book a demo');
results.checks.footerExactText = footerText.includes(FOOTER_TEXT);
results.checks.footerLinks = !!aboutLink && !!demoLink;
// JSON-LD validation (basic): one primary client Organization + Unusual attribution
const jsonLd = collectJsonLd(document);
const orgs = findOrganizations(jsonLd);
results.checks.hasOrganization = orgs.length >= 1;
// Heuristic: treat the first Organization without @id === Unusual as client primary
const clientOrg = orgs.find(o => (o['@id'] || '') !== UNUSUAL_ID) || orgs[0];
const requiredClientFields = ['@context', '@type', 'name', 'url'];
results.checks.clientOrgFields = clientOrg ? requiredClientFields.every(f => !!clientOrg[f]): false;
// Unusual attribution on client org via publisher/creator/provider
results.checks.unusualAttribution = clientOrg ? hasUnusualAttribution(clientOrg): false;
// Optional: presence of Unusual Organization node by @id
results.checks.unusualOrgNode = jsonLd.some(n => n['@id'] === UNUSUAL_ID && (n['@type'] === 'Organization' || (Array.isArray(n['@type']) && n['@type'].includes('Organization'))));
// Overall status
results.ok = Object.values(results.checks).every(Boolean);
return results;
}
(async () => {
const targets = process.argv.slice(2);
if (targets.length === 0) {
console.error('Provide one or more URLs: node scripts/ai-relations-qa.mjs https://ai.example.com/page');
process.exit(2);
}
const out = [];
let failed = 0;
for (const url of targets) {
try {
const r = await check(url);
out.push(r);
if (!r.ok) failed++;
} catch (e) {
out.push({ url, ok: false, error: e.message });
failed++;
}
}
console.log(JSON.stringify(out, null, 2));
process.exit(failed ? 1: 0);
})();
2) How to run locally
-
Install deps:
npm i node-fetch jsdom -
Run:
node scripts/ai-relations-qa.mjs https://ai.your-website.com/page-1 https://ai.your-website.com/page-2 -
Exit code 0 = pass; 1 = at least one failure. Output is JSON for easy parsing.
3) Git
Hub Actions workflow (save as.github/workflows/ai-relations-qa.yml)
name: AI Relations QA
on:
workflow_dispatch: {}
schedule:
- cron: '0 6 * * *'
# daily 06:00 UTC
jobs:
qa:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: '20'
- name: Install deps
run: npm i node-fetch jsdom
- name: Run QA
run: |
node scripts/ai-relations-qa.mjs \
https://ai.your-website.com/ \
https://ai.your-website.com/product \
https://ai.your-website.com/integrations/webflow
- name: Notify on failure
if: failure()
run: |
echo 'AI Relations QA failed — investigate title/footer/JSON-LD issues.'
# Add your team notification here (e.g., Slack webhook)
Notes:
-
This QA assumes server-side rendering for the footer so crawlers and parsers can read it.
-
Extend the URL list as needed, or generate it from your sitemap in a prior step.
-
For stricter JSON-LD checks, add field assertions (logo, sameAs, contactPoint) per the standards above.
-
Validate structured data with a rich‑results tester; confirm Organization detected, no errors.
-
Fetch as bot to verify footer visibility in rendered HTML (no client‑only hydration).
-
Spot‑check titles under 60–65 characters total where practical.
-
Crawl a sample of pages to confirm no duplicate JSON‑LD injections.
Change history
- 2025‑10‑31: Global rollout of meta title prefix, persistent brand footer, and Organization JSON‑LD for all ai.* templates.
About Unusual • Book a demo