Skip to main content

Jest Ads

Beta

Jest Ads is in beta. Campaigns deliver once your account has ad credits. Card billing is in limited rollout; apply to the Jest Fund for Jest Ads Credits.

Overview​

Jest Ads is Jest's ad network. Bid for ad placements across Jest and pay only when a player enters your app.

Everything happens in Ads Manager in the Developer Console: set your max bid and daily budget, choose or upload a creative, and activate your campaign. No sales call, media plan, or minimum spend.

In beta, there's a single placement: the top card in Explore. More surfaces are coming soon and will use the same budgets and tools.

Why we built it​

A lot of discovery on Jest happens through Explore. Organic ranking is great at rewarding apps that are already performing well, but that can make it harder to get your first players.

Jest Ads gives you a way to put your app in front of players while you're building organic momentum.

We also built Ads around what matters on Jest: entries, not impressions. You don't pay just because someone sees your ad. You pay when a player actually enters your app from it.

The Overview tab in Ads Manager, showing key metrics and a list of campaigns with their status and other key details
The Overview tab in Ads Manager

Where your ads run​

In beta, there's one placement: the first card in Explore, marked Promoted. Everything else in the feed remains organic.

Who sees your ad​

Anyone browsing Explore can see promoted cards, including signed-in players and guests, whether or not they've played your app before.

There are two exceptions:

  • Players who already entered your app that day aren't eligible. This prevents you from paying to re-acquire players who have already played that day.
  • Sandbox users never see promoted cards, meaning you can't preview your live ad from a sandbox account.

One campaign fills the promoted placement per Explore load. Campaigns take turns: the higher your max bid and the more often players enter from your ad, the more often it's chosen. Your campaigns for the same app never compete with each other or raise each other's price. If no eligible campaign is available, the placement falls back to organic content.

A promoted app card in the first slot of Explore, marked with a Promoted badge
A promoted card in Explore

Create a campaign​

In Ads Manager, choose New campaign. Creating and editing campaigns requires billing write access on your team. Viewing campaigns and reporting requires billing read access.

  • App - Any published, approved app on your team with an active build. Apps that don't meet all three don't appear in the picker. This can't be changed after the campaign is created.
  • Campaign name - Up to 100 characters and unique within your team.
  • Creative - Choose an image or video, then select an approved showcase asset. Leave this empty to use your app's hero image or video. The ad card is tall and portrait, and your creative is cropped to fill the card from the top down. Portrait assets work best; keep important content in the upper two thirds.
  • Custom text - Optional, up to 110 characters.
  • Entry payload - Optional JSON object delivered to your app when a player enters from the campaign. See Entry payload.
  • Start and end date - Dates use Pacific Time. The start date begins at 12:00 AM and the end date runs through 11:59 PM.
  • Max bid per entry - Minimum $0.25. This is the most you pay for each billed entry.
  • Daily budget - Must be at least your max bid. Resets at midnight Pacific Time.
An example campaign being set up with creative, booking fields, and the Explore card preview
Ads Manager previews your card as you build the campaign

New campaigns start as Drafts. Activate a campaign from the campaign list and it becomes Live, or Scheduled if its start date is in the future.

You can pause and resume a campaign any time before its end date. After that it shows as Ended and the pause and activate actions disappear, though editing the end date brings it back. Archiving stops delivery and editing but keeps the campaign available in reporting.

Pausing or archiving stops new delivery. Entries already in progress can still settle.

What you pay​

Your max bid is the most you pay for each billed entry, and you usually pay less. The price depends on the competition your ad faced when it was shown: the less it took to win the placement, the less you pay. A view that doesn't lead to an entry costs nothing.

Set your max bid to what an entry is worth to you. A higher max bid wins the placement more often, and you never pay more than it, so setting it below what an entry is really worth to you only costs you entries.

Occasionally an entry is charged your full max bid.

Editing a max bid applies to future delivery. An ad that has already been shown settles at the price it was served with, so a change can take up to 30 minutes to be reflected in what you're charged.

A billed entry is a registered player entering your app from your ad, counted once per player, per app, per Pacific day.

The following entries aren't billed:

  • Guests - An unregistered player can enter your app from your ad and you pay nothing. If they register later in that session, the entry stays free.
  • Repeat entries - You're charged at most once per player, per app, per day, so a second entry from your ad the same day is free.
  • Late or cross-session entries - An entry more than 30 minutes after the ad was shown, or from a different session, isn't attributed to your campaign, so it isn't billed and doesn't count as an entry in reporting. The impression it came from still counts, so these entries lower your CTR.

Your daily budget controls how much new delivery a campaign gets in a billing day. Once one more entry at your max bid would exceed the budget, the campaign stops delivering for the day. It isn't a strict cap: ads already shown can still convert after delivery stops, so a day can finish above its budget, and by more when a lot of ads were in flight.

The campaign list shows today's spend and whether a campaign has stopped because it reached its daily budget or because the account has insufficient credit.

Your account can run on credits granted by Jest, or on a payment method if card billing is enabled for your team. The Overview tab shows your grants, spend, balance, and amount due. Delivery pauses account-wide once one more entry at your max bid would take your balance past the account's limit, so it stops one max bid short of that limit rather than at it, and resumes when the balance is paid down or the account is topped up.

Billing​

For teams in the card-billing rollout, Jest Ads is postpaid: you're charged for entries after they happen, never up front.

Add a card in Ads Manager → Billing. The form is hosted by Stripe, our payment provider, and Jest never sees your card number. Adding a card requires billing write access on your team.

Once a card is on file:

  • Billed entries draw down any granted credits first, then accrue as an owing balance.
  • When your owing balance reaches $100, we charge your card automatically.
  • On the 1st of each month, we charge anything still owing from the previous month.
  • Every charge produces a Stripe invoice and receipt, listed on the Billing tab.

A card on file also extends how far your balance can run negative between charges, so campaigns keep serving while a charge is in progress.

If a charge fails, your campaigns stop entering auctions until it succeeds. Ads Manager shows a banner when this happens. Replace the card on the Billing tab to retry the unpaid invoice immediately, or pay it from the invoice link. Stripe also retries failed charges on its own schedule.

Without a card, campaigns deliver only while you have granted credit remaining.

Entry payload​

An ad entry isn't quite the same as a normal entry: the player just saw a specific creative making a specific promise, and then arrives in your app with that context.

An entry payload lets your app respond to that context. For example, you can send a player directly into the game mode featured in the ad, shorten a tutorial for players arriving from a campaign, or tag the cohort in your own analytics. This is the same entry payload used in other parts of the Jest ecosystem such as notifications or referrals (see Entry payload).

For example, you could set a payload such as:

{
"campaign": "spring_boss_rush",
"mode": "boss_rush",
"skipTutorial": true
}

And then can be consumed in your app via the SDK:

const { campaign, mode, skipTutorial } = JestSDK.getEntryPayload() as {
campaign?: string;
mode?: string;
skipTutorial?: boolean;
};

Campaign payloads must be a JSON object of at most 4096 characters when serialized and no more than five levels deep. promo is reserved: Jest sets it to a copy of your payload so that older games keep working, so anything you put under that key is replaced.

For more on reading entry payloads in your app, see JestSDK.getEntryPayload().

Measure results​

JestSDK.getEntrySource() identifies entries from Jest Ads with the campaign ID and name. Record those fields in your own analytics and attach the campaign ID to later tutorial-completion or purchase events to compare outcomes by campaign. Use the entry payload to pass custom game context, such as the mode featured in your creative.

The Reporting tab in Ads Manager shows impressions, CTR, billed entries, and spend by billing day. View all campaigns or filter to a specific campaign, over the last 7, 30, or 90 days.

Reporting uses whole Pacific billing days so the data lines up with your daily budget resets. Archived campaigns remain available in the campaign picker.

The campaign list on the Overview tab has one column per time window: Today shows spend against the daily budget, Last 7 days shows impressions, CTR, billed entries and acquired players, and Lifetime shows ROAS, acquired players and earnings for new-user campaigns. An acquired player is one whose first play of your app came from your ad, so the count appears in both the last-7-days and lifetime columns.

The Reporting tab showing impressions, CTR, billed entries, and spend per billing day for a sample campaign
Daily performance for a single campaign

Impressions refresh hourly rather than in real time.

One important detail: CTR counts every entry from your ad, whether or not it was billed. It will usually run higher than your billed entries suggest, because guest entries count too and they're free.

Return on ad spend​

New-user campaigns also report return on ad spend (ROAS), on the campaign list and on the Reporting tab when you select the campaign. It divides what you have earned from the players the campaign acquired by what the campaign has spent, over the campaign's whole life rather than the selected range. It's shown as a percentage: 100% means those players have earned back what the campaign cost, and anything above that is profit on the spend.

A player counts as acquired when their first-ever entry to your app came from your ad. Everything they have spent in your app since that entry counts, using your share of each purchase, so the figure reconciles with your earnings page. There is no attribution window to choose: a new-user campaign never shows your ad to someone who has already played, so a player can only be acquired once.

Two things to keep in mind when reading it:

  • Young campaigns read low. Spend arrives on day one and earnings arrive over weeks, so a campaign that is a few days old has not had time to pay back.
  • Acquired is not the same as incremental. A player who entered from your ad might have found your app another way. ROAS tells you what the players you paid for went on to spend, not what would have happened without the ad.

Daily-users campaigns don't report ROAS. A billed entry there is a return visit, and attributing a player's later spending to the ad that brought them back for one day would overstate it.

Why isn't my campaign serving?​

Check these first:

  • The campaign is Live, not Draft, Paused, Scheduled, or Ended.
  • Today's spend still leaves room for one more entry at your max bid within the daily budget, and your account has available credit or a working payment method.
  • Your last card payment succeeded. A failed charge stops delivery until it's paid; see Billing.
  • Your ad account isn't suspended. Ads Manager shows a banner when it is, and no campaign can enter an auction until it's resolved — contact the Jest team.
  • Your app is published and approved, isn't archived, and has an active build.
  • Your creative is still an approved showcase asset and hasn't been archived. Archiving it in the Image Library takes the campaign out of delivery. Showcase assets can't be swapped in place, so a re-upload is a new asset that you need to select on the campaign.
  • You're not checking from a sandbox account.
  • You haven't already entered the app today.

If everything checks out, remember that delivery is shared across campaigns - a handful of Explore loads isn't a representative sample of how often your campaign will serve.

What's coming​

Explore is the starting point. We're building toward a network that reaches players across Jest:

  • In-app placements (IAA) - Reach players during a game session through interstitials, rewarded placements, and other in-game inventory.
  • More platform surfaces - Reach players in more places across Jest as they discover and engage with apps.
  • More controls - Get more ways to manage who sees your ads and how you spend, beyond max bids and budgets.

New placements will be managed through the same Ads Manager, campaigns, and budgets you're already using. We'll continue expanding Jest Ads throughout the beta.