Skip to main content
MetaDesigner2017

Designing error-resistant ad duplication workflows

Enabling flexible reuse of ads by redesigning system behavior instead of surfacing errors

Context

Ads on Facebook are structured in three layers:

  • Objective → defines the goal (awareness, conversions, etc.)
  • Ad Set → targeting, budget, schedule
  • Ad → creative (images, video, copy)

The objective determines available fields downstream, making it a critical dependency in the system.

Ad duplication is a major revenue driver, allowing advertisers to quickly scale campaigns. Advertisers wanted to duplicate ads and change the objective, but this broke the system. Changing objective invalidated downstream fields and resulted in 60+ potential error states. The team's initial proposed solution was to ship the feature with all of the errors and force users to fix them.

I was initially asked to write error messages for 60+ edge cases, but this revealed a deeper issue:

The system was designed to fail, then recover, rather than prevent failure.

At a glance

Unlock advertiser spend by making it easier for advertisers to duplicate and publish existing ads.

  • Original solution would throw up to 60 errors due to back-end incompatibilities

Reduced potential error states through better backend handling and clear messaging.

  • 2.2% revenue increase
  • 2.6% increase in new ads creation
  • 1.7% increase in new advertisers
  • 0.7% improved responsiveness
  • Overall decrease in error states
Process
1

Investigate backend issues and error states

Worked closely with engineers to map what happens to ad sets when an advertiser changes the ad objectives.

2

Audit fields and potential error states, and create framework

Mapping fields to error causes and determine what could be resolved invisibly vs. surfaced to users.

3

Design the user interface and messaging

Prototype the flows, then create new modal with clear, step-by-step language explaining what was happening to advertisers.

Grid showing a mapping of backend issues and decision on whether to surface errors
What shipped

With a simplified framework for how to surface backend changes, we were able to ship an experience that elegantly handled potential backend incompatibilities, and then clearly communicated what would be different in duplicated ads. This removed blocking error states and empowered advertisers to make informed decisions about next steps.


Solution
1

Smart defaults

Automatically converted incompatible fields into valid values based on the new objective

  • Reduced required user decisions
  • Eliminated many invalid states
2

Conflict removal

Removed fields that no longer applied under the new objective

  • Reduced clutter
  • Prevented unnecessary confusion
3

Preview & confirmation layer

Introduced a modal that:

  • Shows what's changed
  • Explains why changes were made
  • Allows users to review before proceeding
What shipped
Why this matters

This work demonstrates my approach to product system design:

  • I design systems that prevent failure, not just handle it
  • I focus on interaction models and system behavior, especially in complex workflows
  • I collaborate deeply with engineering to align UX with backend logic

I prioritize user confidence and predictability in high-stakes environments

Reflection

This project changed how I think about design:

  • From writing for edge cases to eliminating them
  • From UI-level fixes to system-level solutions

It reinforced that:

  • Many UX problems are actually system design problems
  • Preventing errors is more powerful than explaining them