This is a preview of unreleased docs from main. View the published docs
Skip to main content

Page Metadata

The SDK automatically collects page metadata from the DOM on every track() call. By default it reads from application/ld+json structured data embedded in the page.

Default Field Mappings​

SDK FieldJSON-LD KeyNotes
page_titleheadline or nameFalls back to document.title if not found
content_type@type
content_ididentifier or @idTries identifier first
publisherpublisher.nameNested object path
object_type@type
object_ididentifier or @idTries identifier first
contextarticleSection

url and referer are always collected automatically from window.location.href and document.referrer.

JSON-LD Examples​

NewsArticle​

For article pages, include a NewsArticle block with all relevant fields:

<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "NewsArticle",
"headline": "City Council Approves New Housing Plan",
"identifier": "story-12345",
"publisher": {
"@type": "Organization",
"name": "Example News"
},
"articleSection": "Local Government"
}
</script>

WebPage​

For non-article pages, use a WebPage block:

<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "WebPage",
"name": "About Us",
"@id": "https://example.com/about",
"publisher": {
"@type": "Organization",
"name": "Example News"
}
}
</script>

Note that for WebPage, the context field will be null since there is no articleSection.

@graph format​

Some SEO plugins (such as Yoast SEO) emit a single JSON-LD block using the @graph format rather than one block per type:

<script type="application/ld+json">
{
"@context": "https://schema.org",
"@graph": [
{
"@type": "NewsArticle",
"headline": "City Council Approves New Housing Plan",
"identifier": "story-12345",
"publisher": {
"@type": "Organization",
"name": "Example News"
},
"articleSection": "Local Government"
},
{
"@type": "WebSite",
"name": "Example News",
"url": "https://example.com/"
}
]
}
</script>

The SDK handles this automatically — it searches within @graph and applies the same type priority to pick the best item.

Type priority: If multiple JSON-LD blocks (or items within @graph) exist on the page, the SDK picks the one with the highest priority: NewsArticle > Article > WebPage > any other type.

Article Metadata for Targeting​

When the SDK asks which interactions to show, it also sends the viewed article's tags, authors, and publish date, so interactions can target them. These come from the first JSON-LD block whose @type is an article type (Article, NewsArticle, BlogPosting, and their subtypes), searched across every block and inside @graph. They are not added to tracked events.

Targeting valueJSON-LD keyFallbackNotes
Tagskeywordsarticle:tag, then keywords meta tagA comma-separated string is split; an array keeps every value
Authorsauthorauthor meta tagAccepts a string, a list, or Person objects (their name is used)
Published datedatePublishedarticle:published_time meta tagAny ISO 8601 date; an unparseable value is ignored
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "NewsArticle",
"headline": "City Council Approves New Housing Plan",
"keywords": "Housing, City Council, Local Government",
"author": [{ "@type": "Person", "name": "Jane Doe" }],
"datePublished": "2026-10-12T08:00:00-04:00"
}
</script>

Allegro reads the same fields when it catalogs your content for reach estimates, so keep them in the JSON-LD rather than adding them with script after the page loads. These fields cannot be remapped with pageData.

Overriding Defaults​

Any field mapping can be overridden via the pageData property of window.__allegro, set before client.js loads. This is useful for publishers that use a GTM data layer or other data sources instead of JSON-LD.

Data layer source​

The dataLayer source reads a JSON object from a <meta name="gtm-dataLayer" content='{"key":"value"}'> tag. The property names inside that object are entirely up to the publisher's own data layer conventions, so each key you map depends on your setup.

The example below shows one way a publisher might wire this up — a site whose data layer uses gtm* field names:

<script>
window.__allegro = {
pageData: {
page_title: { source: 'dataLayer', key: 'gtmStoryTitle' },
content_type: { source: 'dataLayer', key: 'gtmPageType' },
content_id: { source: 'dataLayer', key: 'gtmBspStoryId' },
publisher: { source: 'dataLayer', key: 'gtmSiteName' },
object_type: { source: 'dataLayer', key: 'gtmPageType' },
object_id: { source: 'dataLayer', key: 'gtmBspStoryId' },
context: { source: 'dataLayer', key: 'gtmCategory' },
},
};
</script>
<script src="https://your-allegro-instance.com/client.js"></script>

Your own data layer will expose whatever field names your CMS or tag manager emits — map each Allegro field to the matching key.

Meta tag source​

Individual fields can also be pulled from <meta> tags:

<script>
window.__allegro = {
pageData: {
content_id: { source: 'meta', key: 'article:id' },
publisher: { source: 'meta', key: 'og:site_name' },
},
};
</script>
<script src="https://your-allegro-instance.com/client.js"></script>

All Source Types​

SourceHow it readskey format
jsonLd<script type="application/ld+json">Dot-path like publisher.name; pipe-separated fallbacks like headline|name
meta<meta name="..." content="...">The name attribute value
dataLayer<meta name="gtm-dataLayer" content='...'>Property name in the JSON object
selectorCSS selector → textContentAny valid CSS selector
attributeCSS selector → element attributeselector@attribute e.g. body@data-publisher

Per-Call Overrides​

Any field can also be passed directly to track(). Per-call values take precedence over auto-collected page data:

allegro.track('article_read', {
content_id: '12345',
content_type: 'article',
});