Skip to main content
Wildo.ai Coming soon

Marketing site and brand

Describe the product in machine-readable terms

Sections can publish structured descriptions of products, offers and other content alongside the visible page. A shared catalogue defines the supported entity contracts, while the application supplies its own factual values.

An authored product card and price card become small structured entity cards carrying same facts

Describe the product in machine-readable terms

Sections can publish structured descriptions of products, offers and other content alongside the visible page. A shared catalogue defines the supported entity contracts, while the application supplies its own factual values.

Example — One pricing story for people and tools

A pricing section describes the product and its offers in readable copy and structured data. Both should reflect the same accepted commercial facts.

For engineers

A section definition can return one payload, several, or no structured data through getStructuredData. The page gathers its actual localized sections and renders their contributions:

const structuredDataHtml = renderPageStructuredData({
  sections: resolveLandingSectionsForStructuredData(runtime.locale),
});

renderPageStructuredData is exported by @wildo-ai/saas-website/astro. The application injects its output into the page head. The renderer supplies the vocabulary when absent, deduplicates entities by identifier and escapes output for its script context.

Emit both ends of the relationship

This selected pair comes from Wonder Todos’ buildPricingStructuredData. Its locale helpers establish pricingUrl, pricingProductId and aggregateOfferId; the omitted offer children use that locale’s names. These are example application prices from source, not a claim about a currently sold offer.

const payloads = [
  {
    '@type': 'Product',
    '@id': pricingProductId,
    name: 'Wonder Todos',
    url: pricingUrl,
    offers: {
      '@id': aggregateOfferId,
    },
  },
  {
    '@type': 'AggregateOffer',
    '@id': aggregateOfferId,
    lowPrice: '0',
    highPrice: '12',
    priceCurrency: 'USD',
    offerCount: '2',
    url: pricingUrl,
    // Individual Offer payloads remain in the full builder.
  },
];

Return these payloads from the pricing section’s getStructuredData, include that section in the page’s actual resolved sections, then pass the collection to renderPageStructuredData. The matching identifier makes the Product’s offer reference resolvable. Emitting only the Product would leave a relationship without its target.

Keep entity relationships explicit

Wonder Todos’ pricing builder links its Product to a separately emitted AggregateOffer through the same @id. The catalogue supplies supported types and field expectations; application-owned catalogue entries can extend it. Neither the catalogue nor the renderer invents truthful prices, reviews or availability. Derive values from the page’s factual source, keep related entity IDs consistent, and run the structured-data audit before accepting a change.

Building a B2B product or an internal tool?

Wildo is not self-service yet. Tell us what you have in mind and we will say plainly whether it fits, and what happens next.