# JSON-LD Schema (AEO / GEO)

Generates Schema.org JSON-LD structured data from your Limio pricing pages and embeds it as a `<script type="application/ld+json">` in the page head at publish time. Includes Product, Offer, and Price definitions with billing intervals, upsell links (`isRelatedTo`), cross-sell add-ons via the schema.org `addOn` property, and checkout deep links with UTM attribution for AI agent tracking.

<figure><img src="https://430995084-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FSe5wc9RXUPzSYeMZJDNj%2Fuploads%2FHEJkOK8ititKpIBrtfo2%2FScreenshot%202026-03-24%20at%2013.23.57.png?alt=media&#x26;token=66da0791-65c5-439e-821f-0b467a2e4150" alt=""><figcaption></figcaption></figure>

## How it works

At publish time, Limio reads the offers on your pricing page and converts them into Schema.org JSON-LD. The schema includes:

* **Product and Offer definitions** — mapping directly from Limio's domain model (Product, Offer, Price use the same terminology as Schema.org)
* **Upsell links** — `isRelatedTo` maps upsell offers configured on each offer as related alternatives
* **Cross-sell add-ons** — when enabled, add-ons from `useCampaign()` are attached to each subscription offer using the schema.org `addOn` property (not as flat entries in the offers array). Duplicates are automatically removed
* **Checkout deep links** — `checkoutPageURLTemplate` and `url` on each Offer, pointing to Limio purchase links so agents can link directly to checkout
* **Attribution tracking** — UTM parameters (`utm_source=ai&utm_medium=llm`) baked into checkout URLs so you can measure whether AI agents actually drive purchase traffic

The component is added to your pricing page like any other Limio component. Once published, you can verify the output using Google's Rich Results test (<https://search.google.com/test/rich-results>) or Schema validation (<https://validator.schema.org/>).

## Configuration

The component is configured via props in the Limio Page Builder. The base props control the schema type and product metadata:

| Prop                  | Type     | Default                 | Description                                                                                                                                                                        |
| --------------------- | -------- | ----------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `schemaType`          | picklist | `SoftwareApplication`   | Schema.org type: SoftwareApplication, Product, or Service                                                                                                                          |
| `applicationName`     | string   | `""`                    | Product or application name                                                                                                                                                        |
| `applicationUrl`      | string   | `""`                    | Product or application URL                                                                                                                                                         |
| `applicationCategory` | string   | `BusinessApplication`   | Application category (SoftwareApplication only)                                                                                                                                    |
| `pageDescription`     | string   | `""`                    | Page-level description for the schema                                                                                                                                              |
| `offerDetailsField`   | string   | `offer_features__limio` | Offer attribute used for description and feature list. Change this if your `offer_features__limio` is used for other purposes and you want to point to a custom attribute instead. |
| `includeAddOns`       | boolean  | `false`                 | Include cross-sell add-ons in the schema output                                                                                                                                    |

### Purchase links and UTM attribution

To enable checkout deep links and attribution tracking, configure the purchase link props. These use Limio's standard purchase link format (`/checkout?purchase=/offers2/offerName`) and append UTM parameters so you can measure AI-driven traffic in your analytics.

| Prop               | Type   | Default              | Description                                                                                                           |
| ------------------ | ------ | -------------------- | --------------------------------------------------------------------------------------------------------------------- |
| `shopDomain`       | string | `""`                 | Your shop domain (e.g. `https://shop.example.com`). **Required** to enable purchase links — leave empty to omit them. |
| `checkoutBasePath` | string | `/checkout`          | The checkout page path. Change this if your checkout uses a custom page tag.                                          |
| `utmSource`        | string | `ai`                 | UTM source parameter for attribution                                                                                  |
| `utmMedium`        | string | `llm`                | UTM medium parameter for attribution                                                                                  |
| `utmCampaign`      | string | `limio-pricing-page` | UTM campaign parameter for attribution                                                                                |

When `shopDomain` is set, each Offer in the JSON-LD output includes two fields:

* **`url`** — a direct purchase link for the offer, widely supported by search engines and AI agents
* **`checkoutPageURLTemplate`** — the same link using the Schema.org v15 property specifically designed for checkout URLs

The offer path (`/offers2/offerName`) is derived automatically from the offer data returned by `useCampaign()`.

Example output for a single offer:

```json
{
  "@type": "Offer",
  "name": "Professional Monthly Plan",
  "category": "Subscription",
  "price": "114.50",
  "priceCurrency": "USD",
  "priceSpecification": {
    "@type": "UnitPriceSpecification",
    "price": "114.50",
    "priceCurrency": "USD",
    "unitCode": "MON",
    "billingDuration": {
      "@type": "QuantitativeValue",
      "value": 1,
      "unitCode": "MON"
    }
  },
  "url": "https://shop.example.com/checkout?purchase=/offers2/pro-monthly&utm_source=ai&utm_medium=llm&utm_campaign=limio-pricing-page",
  "checkoutPageURLTemplate": "https://shop.example.com/checkout?purchase=/offers2/pro-monthly&utm_source=ai&utm_medium=llm&utm_campaign=limio-pricing-page",
  "itemOffered": {
    "@type": "Service",
    "name": "Professional Monthly Plan",
    "hasOfferCatalog": {
      "@type": "ItemList",
      "name": "Features",
      "itemListElement": [
        { "@type": "ListItem", "position": 1, "name": "Unlimited exports" },
        { "@type": "ListItem", "position": 2, "name": "Priority support" }
      ]
    }
  },
  "addOn": [
    {
      "@type": "Offer",
      "name": "Mobile Add-On",
      "category": "Add-On",
      "price": "20.00",
      "priceCurrency": "USD"
    }
  ]
}
```

### Measuring AI attribution

Once deployed, you can track whether AI agents and LLMs are driving purchase traffic by filtering your analytics for the UTM parameters:

* **`utm_source=ai`** — identifies traffic originating from AI systems
* **`utm_medium=llm`** — identifies the channel as a large language model
* **`utm_campaign=limio-pricing-page`** — identifies the specific pricing page

These defaults are designed for general AI attribution. You can customise them per page — for example, setting `utmCampaign` to `enterprise-pricing` on your enterprise page to distinguish traffic sources.

The purchase links follow Limio's standard purchase link format, so they work with all existing checkout configurations including promo codes (`&pc=PROMO123`).

### Cross-sell add-ons

When `includeAddOns` is enabled, add-ons from `useCampaign()` are attached to each subscription offer using the schema.org `addOn` property. This is the semantically correct way to represent cross-sell items — rather than listing them as separate top-level offers.

* Add-ons are automatically **deduplicated** by name, price, and currency — if the same add-on appears multiple times in your data, it will only appear once in the schema
* Add-ons do **not** get purchase links (`checkoutPageURLTemplate`) — only subscription offers do
* Unpublished add-ons are filtered server-side by the Limio SDK and won't appear in the output

### Billing intervals and price specification

The component maps Limio's `repeat_interval_type` to Schema.org's `UnitPriceSpecification` with UN/CEFACT unit codes. Both singular and plural forms are supported:

| Limio interval type | Schema.org unitCode |
| ------------------- | ------------------- |
| `month` / `months`  | `MON`               |
| `year` / `years`    | `ANN`               |
| `week` / `weeks`    | `WK`                |
| `day` / `days`      | `DAY`               |

If `repeat_interval_type` is not set on an offer, the `priceSpecification` block is omitted entirely (the `price` and `priceCurrency` fields are still included).

### Pricing

The component maps **Limio Price** (`price__limio`) — the price configured on the offer. For promotional offers, this is the introductory price. Free offers with non-numeric values (e.g. `"-"`) are handled gracefully — price fields are omitted entirely.

{% hint style="info" %}
Limio doesn't currently store the renewal price as it comes from external billing systems. If you're interested in having the renewal/full price available in Limio, [contact us to flag your interest](mailto:hello@limio.com?subject=Feature%20request%20—%20renewal%20price%20in%20offer%20data).
{% endhint %}

### Feature lists

Offer features are extracted from the attribute specified by `offerDetailsField` (default: `offer_features__limio`). If the attribute contains HTML list items (`<li>`), each item is mapped to a `ListItem` entry in an `ItemList` on the offer's `itemOffered` Service. If the field contains paragraph text instead of a list, it's used as the plain-text description only.

## Why it matters

AI agents and LLMs increasingly rely on structured data to understand and recommend products. Without JSON-LD, your pricing pages are invisible to these agents — or worse, misrepresented by stale third-party data.

This is an experiment to test a hypothesis: does publishing structured offer data lead to AI-driven purchase traffic? The UTM tracking lets you answer that question directly. If agents start sending traffic to your checkout, you'll see it in your order data.

Schema.org types map almost 1:1 to Limio's domain model, making the integration lightweight. One schema, two delivery formats — pages get embedded JSON-LD, and a future feed endpoint could serve the same data for direct agent consumption.

***

{% hint style="info" %}
**This is a Labs feature.** We're experimenting with this and it's not yet part of the core platform. Interested in early access or want to help shape it?

[Request access →](mailto:hello@limio.com?subject=Labs%20—%20JSON-LD%20Schema)
{% endhint %}
