UX CASE STUDY · AHOTU × GARMIN

The Sweepstake
Challenge

When a Garmin user finishes the Ahotu Marathon Challenge, they get a link. Everything after that link was ours. Claim, choose, verify, create an account, confirm. Six screens, and two things they had to do at once. Never make the guaranteed reward feel like something you could lose. Never slow down someone who arrived with momentum.

ROLE
UX Designer
TEAM
Design lead, PM, Developer & Tech
SCOPE
Claim flow, sweepstake entry, membership, email
PARTNER
Garmin Connect
01The short version

Users arriving from Garmin have no account and no familiarity with the site. They arrive with a 15% discount already earned, and an optional sweepstake for one of seven race packages on top of it. Two rewards: one certain, one not. The risk was that people would think entering the sweepstake meant gambling the discount.

5/5
TESTERS IDENTIFIED BOTH REWARDS
7
RACE PACKAGES, LIVE
4
WAYS A LINK CAN FAIL
02The brief

Ahotu ran the Ahotu Marathon Challenge inside Garmin Connect's partner programme, which has also hosted campaigns like Disney's 100 Years of Wonder and Starbucks' March Steps. Every campaign works differently, but the shape is the same. A brand builds something inside Garmin. The user completes it. Garmin hands them over to the brand. That handover is where this project lived.

Garmin's own flow ends with a button and a blank frame labelled partner website. Their spec stops there. The six screens behind that button are this project.

HANDOVER SPEC, PROVIDED BY GARMIN
Click to view full size

BEFORE JOINING: Finding the challenge inside Garmin Connect, reading the terms, joining.

Click to view full size

IN PROGRESS: Distance tracked automatically, badge locked until the target is met.

Click to view full size

COMPLETED: Redeem Your Reward, and then a blank frame. Everything after that button had to be designed from nothing.

Six screens had to do two jobs at once: win over someone who had never heard of Ahotu, and enforce rules that user would never see.

Had to convert strangers

  • Cold traffic from a Garmin link, no Ahotu context
  • The discount had to feel safe. Entering the sweepstake could never look like a condition for keeping it
  • The reward had to be easy to find again when the user came back

Had to survive the rules

  • Four code states: invalid, used, expired, generic failure
  • Claim check on the account, separate from the code check
  • Geographic exclusions enforced at entry and again at draw

How might we make a sweepstake feel trustworthy without ever making the guaranteed reward feel conditional?

03Mapping it, and mapping it again

The first pass was boxes and labels. Package One, Package Two, Package Three, deliberately unresolved, because the question at that stage wasn't what the packages were. It was whether the sequence held, and where a user could fall out of it.

Click to view full size

First pass, before the flow was resolved. The claim page still carries a code already filled in, and the terms placement is marked in two competing positions. The packages are numbered rather than named, because what they were wasn't the question yet.

Later, once the flow had settled into something we were confident in, a version had to be made for Garmin. They needed to see what happened on their participants' side after the handover. Not to approve the visuals, but to understand what those users would walk into. Every screen was annotated with its purpose, in sequence, so someone who had never seen the product could follow it start to finish.

Click to view full size
Click to view full size

Built for Garmin, not for the team. Each screen carries a note explaining what it does and why it sits where it does.

04The claim

Four error states, not just a happy path

The claim page confirms the guaranteed discount first. The three steps below it set expectations for what follows, and the sweepstake appears only inside step one, labelled optional, with the discount restated next to it. A user who reads nothing else still sees that the 15% is already theirs.

The same URL resolves four other ways, each with its own copy and its own way forward.

INVALID LINKALREADY CLAIMEDEXPIREDSYSTEM ERROR
CAUGHT IN QA, ROUND TWOAn invalid country error stayed on screen after the user had picked a valid country. A functional bug rather than a cosmetic one, fixed before launch.
THE CODE THE USER NEVER SEESWhen a Garmin user completes the challenge, Garmin issues a code that identifies them as someone who genuinely finished it. Without that code there's no way to tell a legitimate participant from anyone who found the link. The early wireframes put it on the landing page, on the assumption that a code has to be visible to be validated. Talking it through with Garmin established that it didn't. The link could carry it, and the page could validate it silently. The check still happens. The user just never has to think about it.
Ahotu × Garmin claim page

THE CLAIM PAGE: Discount confirmed first, sweepstake introduced second and marked optional, with the 15% restated next to it. One button, three steps, no code.

05The choice

Seven real packages, one selection

The selection screen keeps the page quiet until asked. A single closed drawer, a headline, and a skip link, with nothing else competing for attention. Skip the sweepstake stays visible at every stage, so opting out never requires backing out.

This is the only screen in the flow carrying a full background image. Everything before and after it is a task: claim, verify, create an account, confirm. This one is the aspirational moment, and it's the only place that treatment earns its keep.

Single select, not multi. Letting users pick several packages would have implied better odds, which isn't how the draw worked.

Selection page with the package drawer closed

DRAWER CLOSED: One decision on screen, and a way out of it. The 15% discount is restated in the standfirst so the user is reminded what they keep regardless.

Selection page with the package drawer open

SEVEN PACKAGES: Running, trail, cycling and triathlon. Discipline, name, date and location on every card. Enough to choose from, not enough to read.

Package detail modal

THE DETAIL MODAL: What's included sits top right, above the fold, because it's what decides the choice. The description truncates behind Show more, and the CTA stays pinned while the content scrolls behind it.

06Joining

New and existing users, one outcome

Two kinds of user arrive at this point: people who already have an Ahotu account and people who have never had one. Both end up in the same place, with the same confirmed entry and the same reward attached to their account.

Country of residence is checked against the excluded list before any of that. Before signing in with Google, before creating an account. Asking afterwards would mean telling someone they had been disqualified after they had already done the work.

For most of these users, the account is brand new. They are looking at their Ahotu profile for the first time, and the only thing on it is the reward they just claimed. So the reward card had to carry the whole page: state clearly what they have, when it expires, and how to use it, without assuming any familiarity with the rest of the site.

NOT ONE PROFILE PAGE, BUT THREEThe profile page fetches the user's reward data, so it always needs a loading state. The question was what that loading state should look like, and the answer turned out to depend on who was arriving. Users could reach the page in three different conditions. Both rewards. Sweepstake only, for those who skipped the discount. Discount only, for those who skipped the sweepstake, or who had both and have since used one. A single skeleton with two cards would have worked for one of those and misled the other two: the page promises two cards, then resolves into one, and the user is briefly told they have something they don't. So each state got its own skeleton as well as its own resolved layout, all three specified and handed over rather than left for the build to infer.
Country of residence selection page

COUNTRY FIRST: The selected package is confirmed at the top so the choice isn't lost. Excluded countries are named in plain text above the field rather than discovered by selecting one. Terms sit directly above the CTA, which stays disabled until both are satisfied.

Log in or create an account page

LOG IN OR CREATE: One screen for both kinds of user. The heading says what the account is for: to get your rewards. The step is part of collecting the reward, not a gate standing in front of it.

Profile page in its loading state

LOADING: Skeletons match the shape of what's coming, so the page doesn't reflow when the data lands.

Specification sheet of the three skeleton states

THREE STATES, SPECIFIED: Handover sheet for development. Each state is drawn twice: the skeleton and the resolved page beneath it.

Profile page with both reward cards

BOTH REWARDS: Sweepstake entry on the left with the announcement date, discount code on the right with its expiry and a copy control. The code is the thing users return for, so it's the thing that can be copied in one action.

07After the flow

Four emails, one badge, ten languages

Four email variants, depending on the path taken. Confirmation with both rewards. Confirmation with the discount only, for users who skipped the sweepstake. A message for people who were not selected, sent to everyone entered who wasn't drawn. And a winner email, which goes to a handful of people and was left deliberately simple at this stage.

The email for people who were not selected was the one worth spending time on. It goes to the largest group by a wide margin, and it's the only message in the set that has to deliver disappointing news. It leads with the effort rather than the result, and it puts the discount code back in front of the user at exactly the moment they might otherwise disengage.

LOCALISATION, AND WHAT IT BROKEShipped across the site's ten languages. French event names cramped card metadata that sat comfortably in English, which meant the card layout had to be built around the longest string rather than the one in front of us.
Confirmation email with both rewards

BOTH REWARDS: Same hierarchy as the profile page: sweepstake entry with its announcement date, discount code with its expiry. A user who sees one surface recognises the other.

Confirmation email with the discount only

DISCOUNT ONLY: For users who skipped the sweepstake. Nothing in it hints at what they opted out of.

Email for people not selected

NOT SELECTED: The result is stated once, briefly, and the rest of the email is about what the user still has.

The shipped challenge badge

THE BADGE: Several concept passes before the shipped version. It resolved as a gradient illustration rather than flat vector, which settled the export format as PNG rather than SVG, and that in turn set how it could be used across the site and in email.

08What it looked like before

The shipped flow reads as though the decisions were obvious

Most of them weren't.

HOW MUCH SHOULD A CARD SHOW?The sweepstake cards went through several treatments. A Show more control that expanded in place. A card that was simply clickable, with everything behind the tap. A card carrying the event photo as a full background, borrowing the aspirational pull the user arrived with. The background treatment looked best and tested worst. The image competed with the metadata a user needed to compare seven options. What shipped keeps the photo small and the text legible, and moves the aspiration into the modal, where there's only one event to look at.
Early prototype board of the claim and selection flow

FIRST PROTOTYPE: Everything in this version calls it a raffle. It shipped as a sweepstake, a change that touched every screen, both emails, and the terms.

Package selection states, including multiple selection

MULTIPLE SELECTION, BEFORE IT WAS CUT: Select one or more packages. The states were drawn, the component was built, and it still went out with one selection, because more entries would have implied better odds the draw didn't actually give.

Annotated mobile wireframes with working notes

NOTES ON THE WORK: A later pass, annotated in place: which terms apply where, what happens on skip, where a loading state was still missing.

09What testing found

Five testers, none of whom had seen any part of the project

Colleagues had already been through the flow often enough that their reactions weren't worth much, so the test was run with people encountering it cold, in the browser, using a Google Form to report as they went.

All five correctly identified that they had received both the discount and the sweepstake entry. That was the one thing the flow had to get right, and it held. The useful findings were elsewhere.

THE IDIOM WE KEPTA tester who was still learning English couldn't parse two phrases on the claim page: bucket list, and either way. Both are idiomatic, and neither is taught early. What made this worth taking seriously is where those words sit. Either way is the phrase doing the heaviest lifting anywhere in the flow. It's the sentence that tells a user the discount is safe no matter what they choose. We discussed replacing both, and kept them. The audience is global but the product ships in English, and the plainer alternatives read as instructional in a way that didn't match the tone of the rest of the page. It's a decision I'd want to revisit with more than one data point behind it.
THE LINK WAS RIGHT, THE CONTENT WASN'TA tester selected an event, wanted to know what the prize actually included, followed the link, and landed on the event page, which says nothing about the package. The instinct was to question the link. The link was fine: someone considering a race genuinely does want to read about the race. What was missing was the package detail on the modal itself. That's what got expanded, and it's why what's included now sits high in the modal rather than being something a user has to go looking for.
WHAT WASN'T THE TEST'S PROBLEMTwo findings were real but outside the flow. The terms link pointed at Ahotu's general terms because the sweepstake terms hadn't been built yet, already scheduled and left alone. And a newsletter popup during login turned out to be running on the tester's own machine, not on the page. Worth chasing both down rather than assuming. A finding that isn't yours is still only knowable after you've checked.
Written tester response about browsing the packages

ONE TESTER, THREE REAL PROBLEMS: Response to: was anything confusing or missing when browsing the packages?

Bug reporting section of the test form

BUG REPORTS: A discount code that never resolved out of its loading state, and a support link that pointed nowhere.

10The outcome

A Garmin participant with no Ahotu account becomes a member, holding a reward they can find again, in six screens.

Garmin participant→Valid link→Ahotu member→Entered in the draw→Reward on their profile
5/5

testers correctly identified that they had received both the discount and the sweepstake entry. Small sample, but direct evidence on the one thing this project set out to get right: that neither reward could be mistaken for a condition of the other.

11What I'd carry forward

What worked

Comprehension by design. The dual reward structure was understood by every tester. Not assumed to be obvious, and not left to the copy alone: the hierarchy of the claim page, the profile card and both emails all put the guaranteed reward first.
Testing with people who hadn't seen it. Colleagues had been through the flow too many times to react honestly to it. Recruiting five people with no exposure to the project is what surfaced the findings that mattered, including the ones nobody internally would have thought to look for.
Enforcement at the right level. One claim per account, not one claim per code. Checking only the code leaves a gap: two valid links run through the same account are two valid codes, and nothing stops them. Checking the account closes it, and it's the kind of rule that has to be decided in design rather than discovered in production.

What I'd do differently

Take every piece of feedback, including the ones that are inconvenient. A tester still learning English couldn't parse bucket list or either way. The copy was in English and reviewed in English, and idioms are invisible to fluent readers. I'd want that kind of reader in the room earlier, and I'd want to weigh the finding on its merits rather than on how easy it is to act on. All feedback is worth having. The awkward feedback usually more than the rest.
Design for the longest language, not the one in front of me. Card layouts that sat comfortably in English cramped under French event names. Not the first time I've run into this, and the lesson keeps being the same: a layout tested only in the source language is a layout that hasn't been tested. Build the room in from the start.
Different testing finds different problems. Four rounds of internal QA passed the profile reward card. One external tester watched it load for ten minutes, refreshed, logged out and back in, and still had no code. That bug belonged to development rather than design, but it only appeared once someone used the flow the way a real user would, on their own machine, at their own pace.