Farhin Dorothi / Product Design
Back to work

Offer clarity, AT&T

Every promotion in the catalog spoke its own language. To work out which offer they qualified for — and how to claim it — customers had to read the legal copy.

Role
Lead product designer
Team
PM, research, content, two engineering teams and architects
Year
2025
Scope
Offer assessment, scope definition, pattern design, cross-platform alignment
Four AT&T offer cards — trade-in, online only, bundle and second line — all built on the same four-part structure.
Fig. 1Four offer types that used to share nothing. Trade-in, online only, bundle, second line — one pattern, stating what you qualify for and what is left to do.

The ask

The brief was one line: make offers less confusing. Not a page, not a feature — offers, wherever they turned up. No definition of what less confusing would mean, no agreement on which offers were in scope, and no single team that owned the answer.

The confusion had a specific cause, and it was not the writing. We knew who each customer was — their plan, their device, how long they had been with us, what they were eligible for. We showed all of them the same offers anyway.

Qualification was never stated on the offer. It was buried in the terms attached to it. So the only way to find out whether a promotion applied to you was to open the legal copy and work it out yourself — which meant the personalization we already had was doing nothing for the person who needed it.

What we already knew We had everything we needed to tell people what they qualified for. We made them read the legal copy to work it out instead.

Where it broke

So I stopped auditing offers surface by surface and traced them end to end instead — many of the live offers, followed through their full journeys on test accounts and on my own, to see what a customer would actually be told at each step.

The prices did not survive the journey. Nothing was hidden — every number was disclosed somewhere, and the legal panels were accurate — but no two surfaces agreed, and the only one that counted was the last.

One upgrade traced from account page to cart: the product page shows $0.00 a month, the bar at the foot of the same page shows $10.00 a month, and the cart shows $40.56 a month.
Fig. 2One of those traces, on my own account. $0.00 a month at the top of the product page. $10.00 a month at the foot of the same page. $40.56 a month in the cart.

Upgrades were only one of the two ways this broke. A new customer who chose a plan the offer did not cover was never told. The offer stayed on screen, still looking applied, through plan selection and add-ons, all the way to the cart — where the price quietly corrected itself.

Both failures had the same root. Eligibility was resolved once, at the cart. Everything before that was a promise the system had not checked.

Read on its own, the heatmap says one thing plainly: people wanted the offers. Every surface that mentioned one drew engagement — the banner, the offers module, the carousel, and the see-offer-details link tucked inside the legal block, which pulled 119.47K clicks in seven days on its own.

That is not the behavior of customers ignoring promotions. It is customers working to understand them. And the work was real, because the page gave them no map: several distinct offers sat alongside duplicate routes into the same terms — Limited time and Get iPhone 16 Pro on us resolve to the same legal copy, the online-only banner to something else entirely. Nothing on the page told you which was which.

Click heatmap of an AT&T product page showing engagement on every offer surface, the heaviest being the details link inside the legal copy.
Fig. 3Seven days of click data on one product page. Purple marks the offer surfaces. The busiest of them, at 119.47K clicks, is the details link inside the legal copy.
Annotated session replay: a trade-in prepopulates at $0.00 per month, then resolves to a $10 estimated gift card value.
Fig. 4One recorded session. The trade-in prepopulates at $0.00/mo, then resolves to a $10 gift card three steps later. Nothing here is inaccurate — it just isn’t the same promise.

“Stop the false advertising on trade in any phone any condition $0 for new phone. Also offer same price for no trade v.s trade in.”

Customer verbatim, voice-of-customer programme

How big it actually was

Once the failure had a name, the next question was how much of the estate it touched. Nobody could answer that, because nobody had mapped it.

So we worked it out one use case at a time. Each model followed a single customer type — new or existing, upgrading or adding a line, signed in or not — through every point where eligibility changed what they could claim. Each one also named the pages and systems that would have to change as a result: product page, plan selection, cart, order submit, post-order communications.

The models did the thing the brief could not. They turned “make offers less confusing” into a countable list of use cases, impacted areas and system dependencies, which is what a scoping and funding conversation actually runs on. This was one of many.

They changed how the decisions got made, too. Each use case put the same three things on one page — what happens today, why that is a problem, what you want to happen instead — and we walked through them with every key stakeholder in the same room, instead of briefing each team separately. Seeing the current behavior in black and white settled some arguments on the spot. Not all of them, but enough that scope stopped being a matter of opinion.

Decision flow titled Offer Deviation, use case 3: upgrade customer with trade-in. Authenticated and unauthenticated entry paths branch through plan-eligibility decisions to cart, order submit and post-order reminders.
Fig. 5One of the deviation models we worked from. Every diamond is a point where eligibility changes what the customer can claim; everything orange is a change we were proposing. Click to enlarge.

The pattern

What I wanted out of the assessments was narrow and specific: one consistent way to tell a customer what they actually have to do to apply an offer.

That meant showing state, not just terms. Whether an offer is partly applied, fully applied, or being deviated from — said plainly at the moment it changes, rather than reconciled at the cart.

The steps themselves come from what we already know about the customer. Someone who qualifies sees what is left to do. Someone who does not is told so — and stops being shown a price that assumes an offer they cannot have.

Every offer then follows that same pattern, so nobody has to go hunting through legal copy or a modal to find out where they stand. Upper funnel, buy flow or cart, the answer looks the same and means the same thing.

One offer, four statesSelect a state
01Offer discoveryNothing started. What you would have to do, in order.
02First step completeDevice chosen. Partly earned, and the card says which part.
03Offer in-progressTrade-in added. The credit changes, and the card explains why.
04Offer appliedAll steps done. The amount is final.
Offer card in its discovery state: three steps listed, none complete, potential saving of $1000.
Fig. 6The same offer, told the same way at every stage. What changes is which steps are done, what the customer has actually earned, and whether anything has moved.
Five screens of an upgrade: device list, product page, an offers picker showing eligible and best available offers, a single offer with its steps, and the trade-in estimate showing what each plan choice is worth.
Fig. 7The same pattern, carried across a whole upgrade. Offers are gathered in one place, sorted into what you qualify for and what you would need to change, and every one of them states its steps before you commit.

Proving it out

None of this shipped on the strength of an argument. We ran multiple A/B tests and a long run of usability sessions to settle both the experience and the interface — which offers to surface, how to state eligibility, where the steps belong, what to say when someone does not qualify.

The A/B tests moved the number that matters: among customers who clicked into the updated offer styles, conversion rose 5%. Testing against something people could actually use, rather than a description of it, is what turned the pattern from a proposal into a specification.

It also had to hold in more than one place. I worked with the app teams so they adopted the same solution rather than building a parallel version of it — same states, same eligibility language, same steps. A customer moving between the app and the site sees the same offer, told the same way.

Four offer entry points on AT&T.com, each leading to a different and unrelated page of legal detail.
The same four offer entry points, each now resolving to a structured offer card that states eligibility and the steps left to apply.
Before · four destinationsAfter · one structure
Fig. 8Drag to compare. Four entry points, four unrelated destinations — and the same four entry points resolving to one structure.

Where it landed

The project ran out of funding before it launched. The code that had been written was deployed dark — in production, switched off.

I would not call that a failure. The work answered the question nobody could answer at the start: how big this actually was, and what it would genuinely take to fix. That answer was uncomfortable, and it was the reason the original funding did not stretch — the problem was larger than the brief had assumed.

Two further epics are now being funded to break the work into pieces that can launch. The scoping that ended the first attempt is what made the second one fundable.

+5%Conversion lift among customers who engaged with the new offer styles
DarkBuilt and deployed, switched off when funding ran out
TwoFurther epics now being funded to launch the work
Next Multi-line upgrade
Designed by me, built with Claude Code© 2026