What the orientation meta tag actually does

Before Google's ad server renders a playable inside an app or a webview, it has to decide how much screen real estate to give it and which way to size the frame. It can't wait for your Unity build to boot up and tell it — by then the surrounding UI has already committed to a layout. So it reads a plain meta tag out of the HTML head, upfront, and uses that to pick the frame dimensions.

If that tag is missing, Google has no reliable signal for how the ad is supposed to sit, which is how you end up with a portrait creative squeezed into a landscape frame, a forced-fullscreen mismatch, or a visible layout shift right as the playable takes over from the placeholder frame. The tag exists specifically to avoid that class of problem before it ever reaches a user's screen.

The exact format Google checks for

The tag is a standard <meta> element with name="ad.orientation", placed in <head>, with the orientation value in content:

<meta name="ad.orientation" content="portrait">

Accepted values are portrait, landscape, or a comma-separated list like portrait,landscape for a creative built to support both. Google's own review tooling checks case-insensitively for the tag name and reads whatever string sits in content — but the tag has to exist, and it has to have a non-empty value, or the check fails. An empty content="" or a tag with no content attribute at all counts as missing.

Two details matter more than they look like they should:

  • Attribute order. name has to come before content on the tag. A validly-formed HTML tag with the attributes swapped can still fail an automated check that expects name first.
  • Placement. The tag needs to sit inside <head>, not injected later by a script after the page has already started rendering. A meta tag added dynamically via JavaScript after load defeats the purpose — Google reads the static HTML before any script runs.

What happens if it's missing or malformed

Two outcomes, depending on where in the pipeline the problem is caught:

  • Caught pre-submission — if you run the creative through a validator first, a missing or empty ad.orientation tag shows up as a straightforward fail, with nothing uploaded yet.
  • Caught by Google's review — if it ships without the tag, or with a malformed one, the more common outcome is the creative getting rejected during Google's automated review, sent back with a policy or technical-spec violation rather than a plain-English explanation of what to change. If you've hit that wall already, this breakdown of Google Ads playable rejections covers the other most common causes alongside this one — orientation problems rarely show up alone.

Either way, the fix is identical — get a well-formed ad.orientation tag into the head of the HTML before it ships.

How to fix it

Option 1: Let PlayableKit inject it automatically

When PlayableKit converts a Playworks/Luna export for Google, it checks the output HTML for an existing ad.orientation tag. If one isn't already there, it inserts <meta name="ad.orientation" content="..."> right after the opening <head> tag itself, using whichever orientation you specified for the build (portrait, landscape, or both). If a tag is already present in the source HTML, PlayableKit leaves it alone rather than duplicating it. This is the path that needs zero manual HTML editing — you pick the orientation once when converting, and every Google package that comes out has the tag in the right place, in the right format.

Option 2: Add it by hand

If you're hand-editing an HTML export instead, open the file, find the <head> tag, and add the meta tag immediately inside it, with name before content and a real orientation value:

<head><meta name="ad.orientation" content="portrait,landscape">...

Double-check it's the literal tag in the markup — not something added by a runtime script — and that content isn't left blank. Then run the output through a validator before uploading to confirm the check actually passes.

Worth knowing: orientation is one of a handful of structural checks Google runs — DOCTYPE, well-formed <html>/<body> tags, a 5 MB / 512-file ZIP cap, and local-only asset paths are the others. For the full picture of what Google's playable spec expects, see Google Playable Ads: requirements, formats & common errors.