Cross-App Ad System

Cross-App Ad System

Cross-App Ad System

Role

Product Designer and Content Designer

Team

Product Design, Content, Engineering, PM

Timeframe

1 year

Company

Meta

Overview

A large and growing set of people live almost entirely inside Instagram and rarely open Facebook. That meant Marketplace, Groups and Friends & Family — some of Facebook’s most-loved surfaces — were effectively invisible to them, and Meta was leaving engagement and commerce on the table inside its own portfolio. Instead of asking Instagram users to go find these Facebook experiences, I brought a curated preview of them to the user, natively formatted for the surface they were already on.

The objective was concrete: a first-half target of 2 million monthly active people from the US pilot. My scope was the ad units and the system behind them — eight unit types across feed, Stories, notifications and landing pages, plus the tokens, components and governance rules that let partner teams ship new units without me. I owned the unit design, the content strategy, and the system rules.

The design challenge was one tension I had to hold. Each unit had to feel native and desirable inside Instagram while still driving a clear cross-app action back to Facebook. Lean too native and the unit misleads someone about where the content actually lives; lean too branded and it reads as an ad and gets scrolled past. I also designed inside brand and legal review that required Facebook to be named in every single unit, which closed off the easiest route to native and forced the system to earn attention another way.

Cross-App Design System

Every unit in this system is built from the same small set of parts. One source header, one card, one CTA, one set of tokens, recombined per surface. That is what let it scale past my own team: a partner could ship a new unit without redrawing it, because the parts and the rules already existed.

A note on this artifact: the original system lived in a published Figma library at Meta, which I could not take with me. What follows is a recreation I rebuilt from memory in Framer, using public content in place of anything proprietary. The components below are real and interactive — variants and props switch live.

What is in the system

Eight units, each owning one cross-app job. Every one is assembled from the same header, card, CTA and tokens, which is why a partner team could ship a new surface without redrawing the system.

Marketplace (Feed)

One to three listing cards in feed, led by price and description.

Friends & family (Stories)

A full-screen Stories unit surfacing four friends in a staggered grid.

Notifications

Cross-app push and in-app notifications, including birthdays.

Quick Promotions

A lightweight banner promoting a single cross-app action.

Landing & Post preview

Install pages built from the exact content that was tapped.

People you know

Cross-app friending, ordered by closeness, with earned social proof.

Reels

Facebook-native reels brought into the Instagram feed.

Special promotions

One-off moments, such as the WhatsApp usernames launch.

Foundations

The system inherits the host surface rather than importing Facebook’s. Type, spacing and radius match Instagram so the unit sits natively in feed; only the source marque and the action colour come from Facebook. Every value below is measured off the shipped units, not redrawn.

Surface

Unit surface

#FFFFFF

Card border

#DCE0E5

Brand & Action

Facebook blue

#2C63F5

Action / CTA

#4A5DF6

Text

Primary

#0C0F13

Secondary

#686F78

Type

Jordan Jones

Primary label

15 pt · Semibold

Jordan Jones

Source title

14 pt · Semibold

Jordan Jones

Secondary

12 pt · Regular

Spacing

space-4

4 pt

space-8

8 pt

space-12

12 pt

space-16

16 pt

space-20

20 pt

Radius

Card

12 pt

Action

6 pt

Avatar & mark

Full

One header on every unit

Every unit starts with the same header. It names where the content came from, and it appears on all eight layouts without exception, which is what makes them read as one family rather than eight ads. It is a live component here, and the props below are the real ones.

Friending

Facebook

People you follow on Instagram

Facebook

People you follow on Instagram

Feed Post

Facebook

Featured for you

Facebook

Featured for you

Reels

Facebook

New reels

Facebook

New reels

Source Header

Props

Title (string) · Subtitle (string)

Variants

Default

Marketplace (Feed)

I explored a range of Marketplace units that vary along four axes. The layouts below are ordered from least to most content dense, since that is the cleanest way to weigh the tradeoff between a single clear focal point and more selection.

One listing

Single hero: one large product image, headline top-left, one listing’s price and title, and the next card peeking.

Pros

+ Largest, most editorial imagery; the item reads instantly as aspirational.

+ One clear focal point, closest to an organic post.

+ Strong stopping power in a fast feed.

Cons

– Only one item shows at a glance.

– Leans on the peek and carousel to signal there is more.

– A single bet lowers the odds of a relevant match.

Two listings

One image plus two product cards, each with price, title, and description.

Pros

+ Best balance of imagery and real shopping context, on two items.

+ Two bets raise the chance something resonates, without crowding.

+ Cards stay legible with room for a large lead image.

Cons

– Still only two items, so less selection.

– Slightly less of the calm, premium feel.

– Descriptions truncate quickly.

Three listings

Three product cards, each with price, title, and a secondary line.

Pros

+ Maximum selection and the strongest browse-a-marketplace feel.

+ Three price-anchored items give the best odds of a match.

+ Communicates the breadth of inventory at a glance.

Cons

– The busiest layout: smallest images, most truncation.

– Reads more as an ad than native content.

– Competing focal points dilute stopping power.

Marketplace Unit

Props

Card count (1–3) · Price + description / full image · Card height

Variants

One listing · Two listings · Three listings

Unit Anatomy

Marketplace unit, component map

Every content piece the unit exposes, numbered to the chart below with its content rule.

Friends & family (Stories)

A full-screen Stories unit titled “See what you’ve been missing on Facebook.” It surfaces four friends in a staggered card grid (name plus a “N new posts” line each), with a “See posts on Facebook” pill CTA at the bottom and a per-card “View on Facebook” affordance.

Design Test Variables

While shaping the Marketplace unit, I ran a series of A/B tests on its core layout variables to land on the most effective, most native-feeling version. Each variable below was explored as a pair.

Card count

How many listings to surface in a single unit — trading selection against image size and a calm, premium feel.

A/B result: shipped three cards — more options on screen meant more taps and higher conversion.

Two listings

Three listings

Shipped

Price and description vs. full image

Whether each card leads with price and a description line, or with a single full-bleed product image.

A/B result: shipped price + description — clearly preferred over the single full-bleed image.

Price + description

Shipped

Full image

Card size and height (single card)

For single-listing layouts, how tall the lead card should be within the unit.

A/B result: taller cards showed no statistically significant impact — kept the shorter card.

Shorter card

Shipped

Taller card

Background color

A light, airy blue versus a deeper, higher-contrast blue behind the unit.

A/B result: background color showed no statistically significant impact — kept the darker blue.

Light blue

Dark blue

Shipped

The headline

The headline is the unit’s highest-leverage line. I shipped a single generic MVP — “Discover listings you’ll love on Marketplace” — then tested a set of generic variants. From there I moved to Jellybean, a content engine I wrote category guidelines for (tech, plants, furniture, and more) that crafts the headline in real time to match the items actually being shown.

Generic · MVP + Variants

MVP

Discover listings you’ll love on Marketplace

Your next favorite find is on Marketplace

New nearby listings, just for you

Local deals on Marketplace

Don’t miss these local finds

See what’s new on Marketplace

These listings won’t last long

Explore what’s new near you

Check out the latest listings

AI-driven · Jellybean

Furniture

Shop vintage mirrors and mid-century finds near you

Plants

Shop plants to brighten your day

Clothing

Shop vintage denim to build your look

Electronics

Shop tech deals to upgrade your setup

Camping

Shop gear for your next adventure

Power tools

Shop tools to finish the job right

How Jellybean Works

At serve time, Jellybean reads the set of listings the unit is about to show — their category, key attributes, condition, and price signals — and detects the dominant theme. It selects the guideline set written for that category and composes a headline from it on the fly, so the copy always speaks to what’s actually in front of the person instead of a fixed, generic line. When the item mix is ambiguous or confidence is low, it falls back to the vetted generic MVP.

Setting the Guidelines

Voice & verbs

Every line opens with an action verb (Shop, Discover, Explore) in second person, kept to a plain, scannable reading level.

Category lexicon

Each category carries an approved vocabulary and framing: furniture leans “vintage” and “mid-century,” plants lean “brighten,” electronics lean “upgrade” and “deals.”

Pattern

A flexible template — “Shop [what] to [why]” — keeps every headline benefit-led and consistent in shape.

Length

A hard character ceiling so the headline never spills past two lines or crowds the unit.

Truthfulness

The engine may only reference attributes actually present in the item set: no unverifiable superlatives, no price or availability claims.

Fallback & review

Low confidence or a mixed-category set drops back to the generic MVP, and every new category is spot-checked against live examples before it ships.

What performed better: three cards beat two, since more inventory on screen meant more taps, and most people never scrolled to a second page. Leading with price and a short description beat a full image. For a single card, neither height nor card color moved the numbers in a statistically significant way.

Notifications

Cross-app birthday notifications

I adapted Instagram’s notification row into a birthday prompt that drives users cross-app to Facebook. Facebook owns the birthday experience, so the unit’s job is to entice the tap-through without replacing or duplicating it. For privacy and cross-app alignment, the default variants omit the birthday person’s name on Instagram, still enticing the click while leaving the reveal to Facebook. The icon is a birthday cake and the message ends in an emoji.

Celebrator · No Name (Privacy Default)

Pros

+ Safe on a cross-app surface; no identity exposed and no way to misattribute.

+ Leaves the reveal to Facebook, so it entices the tap instead of replacing the feature.

Cons

– Less personal, so lower salience.

– The user does not know who, which can soften intent to click.

Celebrator · With Name

Pros

+ Most personal and compelling; highest intent to open for a specific friend.

Cons

– Exposes a person’s identity on a different app, a privacy and cross-app concern.

– Revealing the name lets the person message the birthday friend directly on Instagram, which removes any reason to tap through to Facebook.

Celebratee · Your Birthday (Reverse / River)

Pros

+ On your own birthday, “friends are wishing you a happy birthday on Facebook” is a strong, reciprocity-driven pull.

+ Drives a big one-day spike.

Cons

– Only fires on your birthday, so it is not an evergreen driver.

– Value depends on friends actually posting.

Count Framing

Numeric (“Two friends have birthdays today”) is concrete and conveys volume, but depends on accurate counts. “Some of your friends have birthdays today” is softer and count-free, but vaguer and less urgent.

Growth notification

A higher-intent nudge to pull people cross-app, paired with the guardrail it demands.

Legal gate: geography and age

This one needs a careful hand. In places where Facebook is restricted, quietly telling someone’s friends that they post there can out them to family or the authorities, and it can tip a parent off that a grounded teen is back on social media. I gate it by region and by age, and nothing like it ships until legal has signed off.

Cross-app notification principles

The five rules that mattered most, distilled from a talk I gave to 500+ people at an internal notifications conference.

01

Avoid cannibalization

Never notify twice for the same action across both apps. If someone checks Facebook regularly, they already get birthday notifications there. Only send on Instagram if they have not opened Facebook in over a week.

02

Never push from a non-native app

You should never receive a push notification that opens Instagram only to send you to Facebook. Opening one app to be pushed into another is an awful experience.

03

Maintain app attribution

Facebook notifications should always make clear that they are coming from Facebook, with the related branding and content guidelines followed.

04

Aggregate when possible

If three friends share a birthday, do not fire three separate notifications. Bundle them into one so the tray stays calm instead of noisy.

05

Never disparage another Meta app

Never put one app down to boost another. Instagram may have more reel stickers than Facebook, but you never say the Facebook reels experience is bad, come make reels on Instagram.

Quick Promotions

A lightweight promotion that surfaces a cross-app action right on the profile — inviting people to add a WhatsApp banner so followers can reach them there. I wrote and tested the message and CTA for two audiences.

General Population

Creators

Copy variations

Headlines I explored for each audience. The shipped line leads each list in bold — the general-population framing centers on connection, while the creator cut leans into growth.

General Population

Help people connect with you on WhatsApp with a banner

Make it easier for people to connect with you on WhatsApp

Help people find you on WhatsApp with a banner

Add a WhatsApp banner so people can message you

Let people reach you on WhatsApp

Creators

Grow your network on WhatsApp by adding a banner

Get more contacts with a WhatsApp banner

Turn followers into WhatsApp contacts

Grow your WhatsApp community with a banner

Reach your audience directly on WhatsApp

Landing pages

When someone taps “Join Facebook” — or any Facebook content — without an account, an install landing page hands them off to the App Store. I shipped two variants: a generic page, and a Marketplace page that mirrors the exact item someone tapped, so the promise stays consistent from tap to download.

Facebook posts (Feed)

The widest unit in the system: a real Facebook post placed inline in the Instagram feed. The card keeps Facebook’s own post chrome — author, timestamp, reactions — while the header names the source, so the content reads as borrowed rather than native. Tapping through routes to the Facebook post.

From content to landing page

The landing page is never generic — it is built from the exact content that was tapped. Tap the DeSantis post in the Instagram feed and the post preview renders that same post, same author, same reactions, with the install prompt wrapped around it. The content carries through the handoff, so the page confirms what you came for instead of dropping you on a home screen.

Tapped Content

Post Preview

Generic

Marketplace

Post Preview

Post Preview

Props

Post (content ref) · Install prompt

Variants

Generic · Marketplace · Post preview

People you know

People you know from Instagram

A reskin of the suggestions unit for cross-app friending. Instead of “Suggested for you,” the header reads “People you know from Instagram,” surfacing people you follow or are followed by, ordered by descending closeness on Facebook. I tested the call to action and how much social proof to show.

Mutual Count

Relevance Line

CTA Tested

View profile over Add friend

Pros

+ “View profile” is a low-commitment tap, so more people take it, then add the person afterward, a lower-intent path that converted better.

Cons

– “Add friend” asks for commitment up front, so it drew fewer taps and performed worse in testing.

Social Proof

Which proof to show

Pros

+ A mutual count, and then a face pile on top of it, builds trust and lifts conversion; faces make the connection feel real.

Cons

– Every extra layer of proof adds visual load and surfaces more relationship data, so the line has to earn its place.

Mutual Count

Jordan Jones

5 mutuals

Follow

Jordan Jones

5 mutuals

Follow

Relevance Line

Jordan Jones

Lives in Boston

Follow

Jordan Jones

Lives in Boston

Follow

People Card

Props

Name · Avatar · Proof line · CTA label

Variants

Mutual count · Relevance line

ML / AI-powered relevance

Once ML/AI can rank what you have in common, the mutuals line becomes the single most relevant thing you share, not just a count. That signal is more personal and more likely to earn the tap.

The system surfaces the highest-signal commonality per person. Examples: “Went to Harvard,” “Listens to The Strokes,” “Lives in Boston,” “Likes the Red Sox” — school, music, location, teams, and more.

Reels

Cross-App Reel

The reel unit brings Facebook-native reels into the Instagram surface. I chose to surface only reels that were created on Facebook and never cross-posted to Instagram, so the row is a real reason to cross over rather than a rerun of the feed the person is already scrolling.

The header leads with the source. ‘Suggested from Facebook’ names where the content lives, and ‘New reels’ sets the expectation of something fresh. Each cover carries a Facebook attribution so the cross-app origin is never ambiguous.

Header copy variants

The same unit can be framed a few different ways. Each variant leads with the cross-app value, that these reels live on Facebook, while trading off between discovery, novelty, and exclusivity. The variant marked ‘MVP variant’ is the one I shipped.

I also tested this unit as a full-screen Stories placement. Brand and legal asked me to keep “Facebook” in the headline itself, so viewers always knew the content was from Facebook, not Instagram.

Special promotions

Some cross-app moments are one-offs that need a Story rather than a standing unit — the release of WhatsApp usernames is the example here.

The promo ran as a cross-app Story ad, three skippable frames introducing usernames and Meta account linking. Tapping through hands people to WhatsApp, where they reserve a username by pulling one from a linked Instagram or Facebook account.

WhatsApp usernames, in Stories

The cross-app promo, recreated frame for frame from the shipped Story ad.

The WhatsApp-side flow

Where the Story hands off: the real reservation flow, captured screen by screen.

Governance and rules

The components were the easy half. The rules are what let teams outside mine ship units I never reviewed, without the system drifting.

01

Name the source

“Facebook” stays in the header on every unit. Brand and legal both required it, so a viewer always knows the content is not Instagram’s.

02

Inherit the host surface

Type, spacing and radius come from the surface the unit sits in. Only the marque and the action colour come from Facebook.

03

One action per unit

Every unit resolves to a single cross-app action, and the CTA is the lowest-commitment version that still completes the journey.

04

Content carries through

A tapped unit lands on a page rendering that same content. Dropping someone on a generic home screen breaks the promise the unit made.

05

Headlines follow the pattern

“Shop [what] to [why]” — benefit-led, under a hard character ceiling, and human-reviewed before ship even when generated.

06

Proof is earned

Social proof escalates only as far as the relationship supports. More proof lifts conversion but adds visual load and exposes more.

07

Accessibility is a gate

Every unit ships with screen-reader labels and meets contrast on both the light unit surface and the dark host surface.

Results

The framework shipped across multiple partner teams at Meta. In its first rollout it drove an estimated +3M monthly active users across Facebook and Instagram and +1M for WhatsApp — early figures I expect to grow as the cross-app campaign scales out.

The bigger outcome is durable. Beyond the immediate lift, this work became the blueprint for future cross-app ad initiatives. As a reusable system guide, it is set to compound into far greater MAU and DAU over time than any single launch could on its own.

Impact at scale

In the US, the program was built around a first-half goal of 2 million monthly active people. Scaled across Instagram’s 3 billion global monthly actives, the same funnel projects a far larger opportunity at scale:

US Pilot

2M

2M

monthly actives

700K

700K

daily actives

Global Projected

35M

35M

monthly actives

12M

12M

daily actives

US figures reflect the program’s first-half goal of 2M monthly actives, with daily actives at roughly a third of that. Global is a directional projection — the US funnel scaled across Instagram’s 3 billion global monthly actives (about 18x the US base), and likely conservative where Facebook penetration runs lower than the US. Not a guarantee of production results.

What I would do differently

Two things. I spent test cycles on card height and background colour, and both came back with no statistically significant effect. Read together, the tests that moved the number were the ones that changed what the unit said and how much it offered: card count, price and description, and above all the headline. If I ran this again I would sequence tests by expected leverage and put the headline first, instead of treating four variables as equal.

The second is measurement. The real value of this system is that partner teams ship units without me, but I did not instrument adoption. I can tell you the units drove roughly 3 million monthly actives and that the framework spread across multiple partner teams. I cannot tell you how many units shipped on it, or how much design time it saved. That is the metric I would build in from day one now, because adoption is what proves a design system — a single launch does not.