AMP

amp-story-auto-ads

Dynamically inserts ads into a Story.

Required Script<script async custom-element="amp-story" src="https://cdn.ampproject.org/v0/amp-story-1.0.js"></script>
Supported LayoutsN/A

Getting Started

For information on how to include ads in your AMP Stories, refer to our guide.

Best practices for creating an AMP Story ad

If you are interested in creating an ad for the AMP Story platform, refer to our best practices guide.

Behavior

amp-story-auto-ads extension dynamically inserts ads (implemented as amp-ad) into the story while content is being consumed by the user. The current algorithm expects at least a story containing 7 pages.

Each amp-ad is inserted as a full screen story page. To prevent showing blank/unloaded ads, the ad is pre-rendered completely in the background before making it visible to the user. Based on user interactions, the extension decides when and where to insert ads.

Ad in story can be skipped the same way as normal story pages by tapping on the right part of the screen.

Configuration

In the <amp-story-auto-ads> element, you specify a JSON configuration object that contains the details for how ads should be fetched and displayed, which looks like the following:

<amp-story>
  <amp-story-auto-ads>
    <script type="application/json">
       {
          "ad-attributes": {
            "type": "doubleclick",
            "data-slot": "/30497360/a4a/amp_story_dfp_example"
          }
        }
    </script>
  </amp-story-auto-ads>
  ...
</amp-story>

ad-attributes is a map of key-value pairs, which are the attributes of the amp-ad element to be inserted.

The above example will insert the following amp-ad element, which represents a ad served by doubleclick:

<amp-ad type="doubleclick"
  data-slot="/30497360/a4a/amp_story_dfp_example">
</amp-ad>

Unlike normal amp-ad, no <fallback> or <placeholder> needs to be specified here, as ads in stories will only be displayed once fully rendered.

Passing additional attributes (RTC, Targeting, etc.)

If you wish to pass any additional data (e.g. targeting information) as attributes to the created <amp-ad> tag, simply add the additional key value pairs to the ad-attributes JSON object.

A common use case is to pass targeting data or RTC configuration to the underlying amp-ad element. A more complex configuration may look something like this:

<amp-story-auto-ads>
  <script type="application/json">
      {
        "ad-attributes": {
          "type": "doubleclick",
          "data-slot": "/30497360/a4a/amp_story_dfp_example",
          "rtc-config": {
            "urls": ["https://rtcEndpoint.biz/"]
          },
          json: {
            "targeting": {
              "loc": "usa",
              "animal": "cat"
            },
            "categoryExclusions": ["sports", "food", "fun"]
          }
        }
      }
  </script>
</amp-story-auto-ads>

This would result in creation of the following amp-ad element.

<amp-ad type="doubleclick"
  data-slot="/30497360/a4a/amp_story_dfp_example"
  rtc-config='{"urls": ["https://rtcEndpoint.biz/"}'
  json='{"targeting":{"loc": "usa", "animal": "cat"}, "categoryExclusions":["sports", "food", "fun"]}'>
</amp-ad>

Validation

amp-story-auto-ads must be a direct child of amp-story element.

Insertion Control

If there is a specific position in a story that you wish to never show an ad, you can add the next-page-no-ad attribute an <amp-story-page>. The insertion algorithm will then skip the slot after this page when trying to insert an ad.

<amp-story-page next-page-no-ad id="page-7">
  ...
</amp-story-page>

<!-- No ad will ever be inserted here. -->

<amp-story-page next-page-no-ad id="page-8">
  ...
</amp-story-page>

Analytics

When using amp-story-auto-ads several new analytics triggers and [variables] will be availible for your analytics configuration.

Triggers

NameEvent
story-ad-requestAn ad is requested.
story-ad-loadAn ad is loaded.
story-ad-insertAn ad is inserted.
story-ad-viewAn ad is viewed.
story-ad-clickAn ad's CTA button has been clicked.
story-ad-exitA user stops looking at an ad.
story-ad-discardAn ad is discarded due to invalid configuration.

Variables

The following variables will be avaiable in roughly sequential order. The variables can then be used in any following pings. For instance, a request using the story-ad-load trigger will not have access to the viewTime variable as it has not happened yet (this will resolve to an empty string). Whereas a request sent using the story-ad-exit trigger would be able to get the value of all the previous events (requestTime, loadTime, insertTime etc.)

NameDefinition
adIndexIndex of the ad generating the trigger (available for all triggers)
adUniqueIdId that should be unique for every ad (available for all triggers)
requestTimeTimestamp when ad is requested
loadTimeTimestamp when ad emits INI_LOAD signal
insertTimeTimestamp when ad is inserted into story
viewTimeTimestamp when ad-page becomes active page
clickTimeTimestamp when ad is clicked
exitTimeTimestamp when ad page moves from active => inactive
discardTimeTimestamp when ad is discared due to bad metadata etc.
positionPosition in the parent story. Number of page before ad + 1. Does not count previously inserted ad pages. (avaiable at insertion)
ctaTypeGiven cta-type of inserted ad (avaiable at insertion)
¿Necesitas más ayuda?

You've read this document a dozen times but it doesn't really cover all of your questions? Maybe other people felt the same: reach out to them on Stack Overflow.

Go to Stack Overflow
Found a bug or missing a feature?

The AMP project strongly encourages your participation and contributions! We hope you'll become an ongoing participant in our open source community but we also welcome one-off contributions for the issues you're particularly passionate about.

Go to GitHub