Skills for building AEM Edge Delivery Services sites — block development, content modeling, code review, testing, and page import.
82
76%
Does it follow best practices?
Impact
88%
1.04xAverage score across 6 eval scenarios
Advisory
Suggest reviewing before use
Extract and map metadata from source webpages to standard metadata structure.
Metadata extraction preserves SEO and social sharing properties when migrating pages. This resource explains how to map source page metadata to standard properties.
The platform automatically generates metadata from page content when not explicitly provided:
/default-meta-image.pngOnly include metadata when it differs from defaults.
The platform provides convenience properties that auto-populate multiple metadata tags:
title → Auto-populates og:title, twitter:title, <title>description → Auto-populates og:description, twitter:descriptionimage → Auto-populates og:image, og:image:secure_url, twitter:imageUse these instead of separate og: and twitter: properties.**
Metadata is extracted automatically by the analyze-webpage.js script during Step 1 of page import. The script collects:
<title> tag content<meta> tags (both name and property attributes)<link rel="canonical"> href<script type="application/ld+json">)Use the metadata-mapping.md resource for detailed mapping rules. Key decision points:
Decision tree:
Source has <title> tag?
├─ Matches first H1 on page?
│ └─ Omit (use platform default)
└─ Differs from first H1?
└─ Include as "title" propertyExample:
Decision tree:
Source has meta description?
├─ Matches first paragraph?
│ └─ Consider omitting (use platform default)
├─ More descriptive than first paragraph?
│ └─ Include as "description" property
└─ Differs significantly?
└─ Include as "description" propertyQuality requirements:
Decision tree:
Source has og:image?
├─ Matches first content image?
│ └─ Consider omitting (use platform default)
├─ Custom social image?
│ └─ Include as "image" property
└─ No og:image?
└─ Check first image, omit if suitableQuality requirements:
Decision tree:
Source has canonical link?
├─ Points to same page?
│ └─ Omit (platform auto-generates)
├─ Points to different page?
│ └─ Include as "canonical" property (syndicated content)
└─ Uses .html extension?
└─ Include, or use bulk metadata for extension patternSources:
<meta name="keywords"> content<meta property="article:tag"> (multiple tags)<meta name="news_keywords">Mapping:
Multiple sources?
└─ Combine into comma-separated "tags" property
Example: "e-commerce, widgets, online shopping"Technical metadata (belongs in head.html):
viewportcharsetX-UA-Compatibletheme-colorAuto-populated by platform (redundant):
og:url (use canonical instead)og:title (use title instead)og:description (use description instead)twitter:title (use title instead)twitter:description (use description instead)twitter:image (use image instead)JSON-LD can contain valuable structured data. Decision tree:
Has JSON-LD?
│
├─ Page-specific schema (Article, Product, Event)?
│ │
│ ├─ Small payload (<500 chars)?
│ │ └─ Include in metadata block
│ │
│ └─ Large payload?
│ └─ Implement in client-side JS decoration
│
└─ Site-wide schema (Organization, WebSite)?
└─ Move to head.html (applies to all pages)Example - Include in metadata:
<div>
<div class="metadata">
<div>
<div>schema.org</div>
<div>{"@context":"https://schema.org","@type":"Article",...}</div>
</div>
</div>
</div>Example - Move to head.html:
<!-- head.html -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Organization",
"name": "WidgetCo",
"url": "https://widgetco.com"
}
</script>Place at the end of <main> content, before closing </main> tag:
<div>
<div class="metadata">
<div>
<div>title</div>
<div>Buy Widgets Online | WidgetCo</div>
</div>
<div>
<div>description</div>
<div>Shop our extensive collection of high-quality widgets with fast shipping and expert support.</div>
</div>
<div>
<div>image</div>
<div><img src="./media_social-image.jpg" alt="WidgetCo social preview"></div>
</div>
<div>
<div>tags</div>
<div>e-commerce, widgets, online shopping</div>
</div>
</div>
</div>Place at the end of the document:
---
## Metadata
| Property | Value |
|-------------|---------------------------------------------------------------------------------|
| title | Buy Widgets Online \| WidgetCo |
| description | Shop our extensive collection of high-quality widgets with fast shipping. |
| image |  |
| tags | e-commerce, widgets, online shopping |When generating metadata blocks, document why properties were included or omitted:
## Metadata Decisions
### Included Properties
- **title**: "Buy Widgets Online | WidgetCo" - Differs from H1, includes brand
- **description**: Custom SEO description - More compelling than first paragraph
- **image**: ./media_social-image.jpg - Custom social image, not first content image
- **tags**: "e-commerce, widgets, online shopping" - Mapped from article:tag properties
### Omitted Properties
- **canonical**: Points to same page URL - platform will auto-generate
- **og:title, twitter:title**: Redundant - platform auto-populates from title
- **og:description**: Redundant - platform auto-populates from description
- **viewport**: Technical metadata - Belongs in head.html
### Recommendations
- Consider bulk metadata sheet if many pages use canonical with .html extension
- Monitor social preview rendering (Twitter Card Validator, Facebook Debugger)Before finalizing the metadata block:
Cause: Page has minimal or no metadata tags
Solution: Extract defaults from page content:
Cause: <title>, og:title, twitter:title all differ
Solution:
Cause: Complex structured data (>500 characters)
Solution:
Cause: og:image is relative path, not absolute
Solution:
// Convert relative to absolute
const baseUrl = new URL(sourceUrl).origin;
const absoluteImageUrl = new URL(relativeImagePath, baseUrl).href;The metadata extraction process is integrated into the page-import workflow:
analyze-webpage.js extracts raw metadata from source pageThe metadata block is included by default. To skip: user must explicitly request "no metadata" or "skip metadata".
evals
scenario-1
scenario-2
scenario-3
scenario-4
scenario-5
scenario-6
skills
analyze-and-plan
block-collection-and-party
block-inventory
building-blocks
code-review
content-driven-development
content-modeling
docs-search
find-test-content
generate-import-html
identify-page-structure
page-decomposition
page-import
preview-import
scrape-webpage
testing-blocks