Skip to main content
Creatives are full-screen image modals your game can show over gameplay. ZBD sets up the creative and hosts the artwork; your game shows it with one line of code. Changing artwork, copy, or behavior later is a ZBD-side change — no SDK update and no app store release. Typical uses:
  • An onboarding carousel explaining how rewards work
  • A reminder when a player has an unclaimed balance
  • A seasonal or promotional announcement
  • A/B testing two versions of the same message
Requires Unity SDK v1.1.7 or above.

Quick start

That’s the whole integration. The SDK fetches your app’s creatives during Init() and preloads their images, so the modal appears instantly. To react to what the player did:

Setting up a creative

Creatives can’t be configured self-serve yet. To set one up, reach out to your Customer Success Manager — they’ll configure it with you and host your artwork.
Tell your Customer Success Manager the following, and send them your images: Two further properties are set on the ZBD side and worth knowing about:

Pages and navigation

Each page needs at least one image — portrait, landscape, or both. The SDK picks whichever matches the device’s current orientation, and swaps automatically when the player rotates. If you supply only one, it’s used in both orientations.
Portrait art is not required. If your game is landscape-only, send landscape art alone — there’s no need to supply portrait images that would never be shown. The same applies in reverse for portrait-only games.
On a multi-page creative the player can:
  • Tap the image to advance to the next page
  • Swipe left or right to move between pages
  • Use the next arrow (hidden on the last page)
  • See their position via page dots
On the final page, tapping either opens the rewards interface or does nothing, depending on the Tap opens rewards setting.

Image requirements

Images must be HTTPS PNG or JPEG.
  • HTTPS only — plain HTTP is blocked by iOS App Transport Security and Android’s cleartext policy.
  • PNG or JPEG only — WebP, SVG, GIF, and AVIF cannot be decoded on device, even though they preview fine in a browser.
  • Serve images with a Content-Type of image/png or image/jpeg and no Content-Encoding header. An image that displays correctly in a browser can still fail to decode on device if it’s served with an encoding header.
Maximum 5 pages per creative. Every page is downloaded before the modal appears, so keep image dimensions reasonable — target the device resolution you actually need, not the largest possible.

Localization

The Locale field controls who sees a creative:
  • Not set — served to everyone. This is what you want for most creatives.
  • Set (e.g. en, en-GB, pt-BR) — served only to players whose locale matches.
If a creative key has only localized versions and none without a locale, players whose locale doesn’t match will see nothing. When you localize, always keep one version with no locale as the fallback.

API reference

All methods are on ZBDController.Instance.

ShowCreative

Shows the creative with the given key. The callback fires when the modal closes — or immediately, with shown == false, if it couldn’t be shown. Your game decides when a creative appears. The SDK does no scheduling or frequency capping, so you’re free to build your own rules (once per session, after level 3, only when a balance is unclaimed, and so on). See Best practices.

CloseCreative

Closes the visible creative, or cancels one that is still loading. The ShowCreative callback fires with dismissReason == "programmatic".

The result object

ZBDCreativeResult, passed to your ShowCreative callback:

Dismiss reasons

Together, lastPage and pageCount give you a drop-off funnel: you can tell whether a player read all three pages and tapped through, or bailed on page one.

When shown is false

Every one of these is a clean no-op from the player’s perspective: nothing renders and your callback runs, so it’s safe to call ShowCreative optimistically.

Best practices

Reveal rewards after the first reward lands

A one- to three-page reveal explaining how rewards work is the highest-value creative you can ship. Show it once — after the player’s first reward has landed, not at cold launch. A pitch before the player has earned anything is a cold offer and triggers suspicion; a reveal of a balance they already have converts. Fire the first reward early in normal play, let the toast land, then show the creative. Three pages is usually enough to answer the only three questions a new player has:
  1. The revealthis game pays real rewards, and you’ve already started earning. Lead with the balance the player already has — “you’ve already earned 240 coins” converts better than an announcement.
  2. The reasonhere’s why, so it doesn’t feel like a scam. This page carries the most important sentence in your rewards copy — “game studios share their ad revenue with players” — which the modal’s built-in first-time screen doesn’t show. The creative is how you ship it. See the Player Communication Guide.
  3. The portalhere’s where your progress lives and how you claim.

Example flows by cashout option

What page 3 says depends on how your players actually get paid, so the flow differs. Each example below is a six-step journey spanning several creatives — the three reveal pages above, then separate creatives for the first-earn, stacking and payout-confirmation moments (a single creative is capped at five pages, and you wouldn’t want all six at once anyway):
Gift cards have a minimum to reach, so the flow is about saving up toward a named card — the goal is what motivates.
Three tutorial creatives shown over gameplay: 'This game now rewards you with real gift cards and cash', 'No catch — we share a slice of this game's revenue with players', and 'Your points and progress live in your Rewards portal'

A three-page reveal: what just happened, the reason it's real, and where rewards live.

The Amazon and Cash App marks in these examples are stylised stand-ins. Swap them for licensed assets before shipping anything player-facing — Amazon in particular has specific rules about the smile and its clear space, which usually arrive with your gift-card agreement.
Don’t ship all six steps as one creative. The first three belong together as the reveal; steps 4–6 are separate creatives triggered at those moments — a player who has just earned 6c doesn’t need to be told what happens at $5 yet.
Trigger it from your first-reward moment, with PlayerPrefs so it only ever shows once:
Set your “already shown” flag inside the callback and only when result.shown is true. If you set it before calling ShowCreative, a network or image failure would permanently prevent the player from ever seeing the reveal.

Remind players as they make progress

A creative that reflects the player’s actual progress converts far better than a generic announcement. Once a player is earning, show reminder creatives at milestones on the way to their first reward.
Three reminder creatives shown over gameplay: 'You've started earning', 'You're halfway there', and 'Well done — your reward is ready'

Reminder creatives at three milestones: first reward earned, halfway to a gift card, and ready to claim.

Three milestones map naturally onto the player’s journey:
  1. Started earning — their first reward has landed. Reinforce that it’s real.
  2. Halfway — they’re about halfway to a specific gift card. Name the card to make it concrete.
  3. Ready to claim — they can redeem now. This is the one that should open the rewards interface.
GetGiftCards tells you exactly where the player is: unlockedPercent is a 0–100 progress value toward each card, so you can pick the right creative without doing any conversion yourself. Ask your Customer Success Manager to enable Tap opens rewards on the “ready to claim” creative, so tapping it opens the rewards interface directly.
Storing a single monotonic milestone number rather than a flag per creative means a player who jumps straight past 50% only sees the milestone they actually reached, and never sees an earlier one afterwards. If you’d rather remind periodically than only once per milestone, store a timestamp alongside the milestone and re-show after a cooldown you’re comfortable with.

Bring players back with local notifications

Creatives only reach a player who is already in your game. To win back a player who left with an uncashed balance, pair them with local notifications — OS-scheduled reminders that need no push infrastructure, and can be driven from the same GetGiftCards progress value.

Styling

The SDK draws its own close button, next arrow, and page dots. Any of them can be replaced with your own art or hidden entirely, so the modal fits your game. You don’t need to call SetCreativeStyle at all — the SDK’s built-in defaults apply automatically. Only call it if you want to change something:
Call it once after Init(), before your first ShowCreative.
Every field is optional — omit one and the SDK’s built-in control is used. If you’ve set a custom style and want to go back, pass null to reset to defaults. Sizes and offsets are in the overlay’s reference space (1080×1920, scaled to fit), not raw pixels, so they stay consistent across devices.
If you set showCloseButton = false on a creative that also has Backdrop dismisses turned off, the SDK re-enables the close button anyway — otherwise the player would have no way to close the modal.

Refreshing the creative list

Optional. Refreshes the cached creative list. The SDK already fetches during Init(), and ShowCreative fetches lazily if needed, so most games never call this.

Behavior notes

Preloading. Creatives and their images are fetched during Init() so the first ShowCreative is instant. If the fetch fails (no network, for example), Init() still completes normally — creatives simply retry on the next attempt. One at a time. Calling ShowCreative while another creative is showing or loading returns shown = false rather than stacking modals. Rotation. The modal handles rotation while visible, swapping to the other orientation’s artwork where one is provided. Input. While a creative is visible, its backdrop absorbs taps so the game underneath doesn’t receive them. A/B testing. Ask for two creatives with different keys, assign players to a variant in your own code, and call ShowCreative with the matching key. Your game keeps full control of the split.

Troubleshooting

“Creative not found” but it was just set up. Confirm the creative key spelling with your Customer Success Manager, check that it’s been made active, and make sure your build is pointed at the same environment it was configured in. The App ID must match your game’s token exactly — it’s case-sensitive. The modal doesn’t appear and I get “Creative images could not be loaded”. Almost always the image: confirm it’s HTTPS, PNG or JPEG, and served with an image Content-Type and no Content-Encoding header. A browser preview succeeding does not guarantee the device can decode it. Nothing shows for some players only. Check the locale — a creative with a locale set is only served to matching players. Ask for a version with no locale as a fallback. A newly updated creative isn’t picked up. The creative list is cached for the session. Restart the app, or call FetchCreatives() to refresh.