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 Field | JSON-LD Key | Notes |
|---|---|---|
page_title | headline or name | Falls back to document.title if not found |
content_type | @type | |
content_id | identifier or @id | Tries identifier first |
publisher | publisher.name | Nested object path |
object_type | @type | |
object_id | identifier or @id | Tries identifier first |
context | articleSection |
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.
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
| Source | How it reads | key 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 |
selector | CSS selector → textContent | Any valid CSS selector |
attribute | CSS selector → element attribute | selector@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',
});