Conversational UX for AI & LLMs

TIM + Vendas: Turning WhatsApp into a Sales Channel

TIM's reseller app had 30,000 active micro-entrepreneurs and no way to reach the ones who had stopped opening it. Nine conversational flows, four audiences, and one A/B test on the opt-out.

Year :

2022

Industry :

Telecom

Client :

TIM

Project Duration :

4 months · Proof of Concept

Metric: 50k downloads · 20k → 30k active resellers

🎯 The people the app couldn't reach

My role: Conversational & Product Design · Format: Proof of Concept · Scope: 9 flows · 4 segments · 1 A/B test

TIM + Vendas turns self-employed people into resellers of prepaid SIM cards and mobile top-ups. You buy stock, sell it around your neighbourhood, earn a margin, reinvest. By October 2022, TIM reported 30,000 active resellers.

The app has one blind spot. It can only talk to resellers who open it. Push notifications land with people who still have it installed, still have notifications switched on, and still open it, which is precisely the group that needs no reactivating. Anyone drifting away is by definition the hardest person to reach inside the product.

Those same resellers spend their whole working day in a channel TIM was not using. WhatsApp is where they negotiate, send payment links, confirm top-ups and chase customers. Their storefront is a WhatsApp conversation.

So the proof of concept had one question to answer. Can WhatsApp work as an owned re-engagement and sales-activation channel, without burning the relationship it runs on?

The product is a loop

Before writing a single message I had to be clear about what I was keeping alive. The economics of TIM + Vendas sit inside one loop:

INVESTBUYSTOCKSELLEARNREINVEST

The loop is the product. A reseller who buys stock once and never sells again is not a distribution channel, only an acquisition cost with inventory attached. Channel revenue, GMV and the active-reseller figure TIM publishes all depend on how many people keep the loop turning, and how often.

That changed what the brief was about. Not a campaign. A retention problem, in a product whose retention surface was unreachable.

💬 You only get one first message


On WhatsApp, a business that starts the conversation has to open with a pre-approved template. The copy freezes at approval and cannot be edited afterwards. There is no tweaking the wording later to see whether it performs better.

The tempting response to that is one safe message with a name variable, sent to the whole base. Here is what that produces, beside what I shipped.


THE ANTI-PATTERN

Hi! TIM has news for you.

Check out our exclusive advantages and see everything the TIM + Vendas App can do for you!

5:44 PM

True for nobody. No premise, no number, no reason to answer, and it spends a template approval to say nothing.

WHAT SHIPPED

Hello, {{name}}!

How are you?

Keep earning by selling TIM Chips and TIM Recharges on the TIM + Vendas App!

To learn more about how to increase your earnings, visit the App’s Information Center.

If you no longer wish to receive messages like this, just type exit.

5:44 PM

Open the App

True for the person reading it. The premise matches what they were actually doing, and the way out sits in the same message, in one word.

Why I wrote four messages instead of one

The business and CRM side segmented the base on two axes: whether someone was active, and how recently. My call was to write four separate openings instead of one message with variables in it, each with its own approved template and its own definition of success.


  • Active last 2 months. “Keep earning by selling TIM Chips and TIM Recharges.”

    Continuity framing → deepen the loop: more stock, more often.


  • Active Jan–Jun. “We missed you! Come back to profit from selling…”

    A soft re-entry → restart frequency before they lapse.


  • Inactive Jan–Jun. “Don’t waste any more time, profit from selling…”

    Urgency framing → one purchase or one sale.


  • Inactive last 2 months. The same reactivation premise, tuned for

    the recently lapsed → reactivate before the habit decays.


L2M AssetsA.1.0.0Start
Hello, {{name}}!How are you?We missed you! Don't waste any more time, profit from selling TIM Chips and TIM Recharges on the TIM + Vendas App!To learn more about how to increase your earnings, visit the App's Information Center.If you no longer wish to receive messages like this, just type exit.5:44 PM
Open the App
Assets Jan to JunA.2.0.0Start
Hello, {{name}}!How are you?Keep earning by selling TIM Chips and TIM Recharges on the TIM + Vendas App!To learn more about how to increase your earnings, visit the App's Information Center.If you no longer wish to receive messages like this, just type exit.5:44 PM
Open the App
Inactive Jan to JunA.3.0.0Start
Hello, {{name}}!How are you?We missed you! Don't waste any more time, profit from selling TIM Chips and TIM Top-ups on the TIM + Vendas App!To learn more about how to increase your earnings, visit the App's Information Center.If you no longer wish to receive messages like this, just type exit.5:44 PM
Open the App
L2M InactiveA.4.0.0Start
Hello, {{name}}!How are you?We missed you! Come back to profit from selling TIM Chips and TIM Recharges on the TIM + Vendas App!To learn more about how to increase your earnings, visit the App's Information Center.If you no longer wish to receive messages like this, just type exit.5:44 PM
Open the App

This is the decision I would defend hardest, because it is the expensive one. Four templates means four approval cycles and four sets of copy to maintain. But a single message for everyone tells an active reseller they have been missed, and tells a lapsed one to keep going. Both read as a robot. Writing a premise per segment is what made the opening line true.


Four parallel segment entry flows, each with its own approved WhatsApp template, Open the App branch, Exit branch and unexpected-input handling


Four segment entry flows on one architecture. Each carries its own approved template and opening premise, and inherits identical branching, exception handling and exit logic. Copy varies, behaviour does not.


A note on the language.
The product shipped in Brazilian Portuguese. The flow documents throughout this case are the English set I produced alongside the Portuguese originals, so the work could be reviewed outside the local team. That is why the documents label the segments L2M Assets and Assets Jan to Jun, a literal rendering of Ativos, the Portuguese for active.

🧩 A state architecture, not a script


The core deliverable was a system rather than a set of messages. I built a numbering convention that every flow inherits: A for acquisition and entry, O for opt-out, R for standard return, E for exceptions. Every state carries an ID like A.1.0.0.

That sounds like bookkeeping. What it buys you is the ability to point at one specific moment of a conversation in a spec, in a bug report, or in an analytics event. It also made the flows measurable by construction, since every state transition is a countable event.

Alongside it ran a set of global variables carried across every flow: phone number, name, identity, user ID, plus the current state ID and the previous one. Those last two exist for a single purpose. The system always knows where a person came from.

A single documented state, A.1.0.0 Start, annotated with its approved template name, name variable, RegEx reference, device note and call to action


The anatomy of a single state. Each one shipped with its ID, exact copy, approved template name, variables, accepted inputs, RegEx reference, business rules and redirect target, using the same annotation vocabulary across all nine flows. Engineering never had to ask me what a step meant.

“Reach is easy. Permission is the asset.”

The idea every flow was built to protect. A messaging channel aimed at a low-income, high-sensitivity audience can be ruined by one bad campaign, so the exit got the same care as the entrance.

Designing for the conversations that don’t go as planned

Happy paths are the easy part. Most of the work in conversation design sits in what happens off them, so I built one exception library, specified once and inherited by all nine flows.

  • Unexpected yes / no. Restate the two valid options, return to the last step.

    Exception E.1.1.0 - unexpected affirmative or negative input


  • Off-menu number. Ask for the number matching one of the listed options, return to the last step.


    Exception E.1.1.1 - unexpected input in the numeric menu


  • Photo, video, emoji, sticker. “At the moment, I only understand text messages.” A spec written for a demo skips this case. Real people send stickers.


    Exception E.1.1.3 - unexpected image, video or emoji input


  • Ambiguous intent at the exit. Re-present the options rather than guessing which way someone meant to go.


    Exception E.1.1.4 - ambiguous intent at the exit


  • Inactivity. After 30 minutes idle, a light nudge returns the person to the exact point they left. After 7 more minutes, a polite close.


    Exception E.1.1.2 - inactivity nudge and polite close


    The E-layer, written once and reused nine times.

Every one of them ends in a return. None ends in a stop. No state exists where the conversation simply dies. That layer is also why nine flows came out quickly: resilience was designed once and inherited, so each new campaign only had to design its own happy path.

🎁 Every campaign had a job in the loop

Not “drive engagement”, but a named effect on the buying and selling cycle. Three of the five show the range:


#MISSYOUwin-backStart
TIM creative: Mudei, agora sou TIM — 4G coverage, now with 5G
Hello, {{name}}!How are you?We miss you!To help you increase your profits, we are giving you the: “#MISSYOU” coupon which gives you R$9.00 for each TIM Chip activated by your customer (during the promotion period) with 1 recharge within 30 days!For more details, visit our website and check the regulations.If you no longer wish to receive messages like this, just type exit.5:44 PM
Access the website
TIM + BenefitsleverageStart
TIM creative: TIM Pré Top — the more you recharge, the more benefits you get
Hello, {{name}}!How are you?We missed you here! Don't waste any more time! By recharging through the App TIM + Vendas, your customer earns DOUBLE tokens to participate in amazing raffles on TIM + Benefits!Encourage your customer to recharge with you and increase your profits!For more details, visit the information center of the TIM + Vendas App.If you no longer wish to receive messages like this, just type exit.5:44 PM
Open the App
Apologyservice recoveryStart
TIM creative: guarantee extra money and increase your monthly income
Hello, {{name}}!How are you?We at the TIM + Vendas App value the best experience for our resellers and noticed that you made a recent purchase with us.We are sorry that the delivery experience was not as smooth.To help you continue reselling with us, we will credit you an extra score worth R$12.00 to reinvest in the app. 📲The score is already available in your app wallet and can be used to purchase a TIM Chip or for recharge sales.We wish you good sales! Always count on us. 🤝If you no longer wish to receive messages like this, just type exit.5:44 PM
Open the App


#MISSYOU - win-back

A coupon with a name the reseller can quote to their own customer: R$9.00 for each TIM Chip activated, conditional on one recharge within 30 days. A name, a number and a rule are things a person can repeat from memory.

TIM + Benefits - leverage

Recharges made through the app give the end customer double entries in TIM’s prize draws. The reseller is not asked to buy anything. They are handed a reason to call their customers.

Apology - service recovery

The flow I would show first. It apologises for a delivery that was not smooth and credits R$12.00 into the in-app wallet before the reseller complains, and the credit can only be spent buying a TIM Chip or on recharge sales. It converts the product’s most common support failure into a re-engagement trigger, and pays the apology in working capital instead of words.


🚪 Opt-out as a product surface


In a permission-based channel, leaving is not the failure state. It is the mechanism that keeps the channel alive. So the exit got three jobs: honour the decision immediately, offer one fair chance to reconsider, and capture why.


  • “I did not authorize the sending of messages to my WhatsApp” → Consent

  • “The content does not interest me” → Relevance

  • “I am not sure if this contact is from TIM / I do not trust this company” → Trust & legitimacy

  • “I have already registered” → Stale targeting

  • “I am receiving too many messages from TIM” → Frequency governance

  • “Other” → free-text capture, acknowledged → Qualitative input



State O.2.0.0, the opt-out reason menu, with six numbered reasons and a free-text branch behind option 6


State O.2.0.0, the reason menu, with a free-text branch behind option 6.

These are not generic unsubscribe reasons. Option 3 reports on trust, option 5 on contact frequency, option 4 on stale targeting, and each one belongs to a different owner: brand, CRM cadence, data hygiene. In a broadcast channel this is the only structured qualitative data available.

The business rule that kept it honest. Anyone who enters the opt-out flow and confirms is opted out permanently, even if they never fill in a reason. Reason capture never becomes a toll gate on leaving.


The one thing I chose to test


The reconsideration prompt was the single place where the wrong wording could either trap people or leak them. So I ran it as a test rather than settling it in a debate.


VARIANT A · O.1.0.0

Ok! I understand…

If you want to know more about how to earn extra income by reselling chips and TIM recharges, just choose the option “I want extra income” and I will show you how!

But if you are sure you want to stop receiving exclusive TIM + Sales content, type the option “I want to opt out” 😀

5:44 PM

I want extra income

I want to opt out

Hypothesis: explicit labels reduce mis-taps and let the offer compete with the exit at the moment of decision.

Result: 2.8% opt-out.

VARIANT B · O.3.0.0 · WINNER

Okay! I understand…

If you want to know more about how to earn extra income by reselling chips and TIM recharges, just choose the “Yes” option and I’ll show you how!

But if you don’t want to receive exclusive TIM + Sales content, type “No” 😀

5:44 PM

No

Yes

Hypothesis: on entry-level devices, and for people with low digital confidence, a two-word binary beats parsing two competing propositions.

Result: 1.5% opt-out.


Variant B won on the metric that decided it: opt-out rate. 1.5% opted out under the two-word binary, against 2.8% under the labelled buttons, almost double. B became the standard exit pattern across the POC.

A lower opt-out rate is only a win if it comes from comprehension rather than confusion. A binary can suppress exits simply by making the way out harder to identify, which is a dark pattern wearing the costume of a good result. So the reading holds only if unexpected input at that same state did not rise alongside it. Fewer exits and fewer mis-taps means the two words were understood. Fewer exits with more mis-taps would have meant the exit was hidden, and I would have argued against shipping it.

What I take from the result: once someone has decided to leave, persuasive text in a button label does not persuade them. It adds reading and decision cost to a choice already made. Sell before the exit, not inside it.


The winning opt-out variant documented in full, showing the Yes and No branches, the permanent opt-out business rule, and the fan-out routing users back to one of four source templates


The winning variant in full. The fan-out at the bottom, under “Which source template?”, is the part worth reading: however someone resolves the exit, they are routed back to the origin template they arrived from. Anyone who reconsiders returns to the campaign that was relevant to them.


A handoff engineers didn’t have to decode


The flow documents were build specs rather than presentation boards. Every state left my hands with its ID, exact copy, interpolated variables, approved template name, button labels, accepted inputs, RegEx reference, business rules, redirect target, and implementation notes for the developer.

The RegEx dictionary stayed a single shared source of truth rather than being duplicated per flow, so every real-world way of saying the same thing (“do not receive anymore”, “do not want to receive”, “cancel”, “no”) resolves identically across nine flows and can be extended in one place.


🤔 Results & what I took from it


Because every state carries a stable ID, the flows were instrumentable by construction. The measurement plan was written before the first send.

100K

TEMPLATES DELIVERED

85%

85k read

READ RATE

5K

RETURNED TO THE APP

9.4%

8k clicks

CTA CLICK-THROUGH TO APP

2.8% A

1.5% B

OPT-OUT RATE, A VS B

4K

REACTIVATED RESELLERS


Back to the reseller

What drives someone away from a channel is not the message itself. It is a message that clearly was not written for them, with no way out of it.

A reseller’s storefront is a WhatsApp conversation. So we stopped asking them to come to the app and took the app to the conversation, with an opening that was true for the person reading it, an offer priced in reais, and an exit that took one word.

1. Conversation design is systems design

The valuable artifact was the architecture underneath the flows rather than any single flow. Once the state convention, the global variables and the exception library existed, a new campaign became a day of work instead of a week, and every campaign inherited the same resilience. Nine flows without a system would have been nine dead documents.

2. Design the exit as carefully as the entrance

In a permission-based channel the opt-out is what keeps the channel usable next month. It was also the only surface that produced structured qualitative data, and the only one I chose to A/B test. The cheapest exit produced the best outcome.

3. Constraints are the design

Frozen templates, a 24-hour reply window, no NLU in scope, entry-level Android devices. Each of those removed an option and forced a better decision: plan variation up front, get to the point fast, anticipate how people really type, and never assume anyone knows the convention.

4. Money is the message

Every offer appears in reais in the first screen. “R$9.00 for each TIM Chip activated.” “A R$12.00 score already in your wallet.” Never “exclusive advantages”. For an audience running a small business on thin margins, a number is the only value proposition that survives being skimmed.

5. What I would do next

Wire the opt-out reason taxonomy into a live cadence policy, so “too many messages” throttles contact frequency for that segment automatically instead of becoming a line in a report. And make the recovery flow triggered rather than reactive, fired by a delivery-SLA breach instead of a manually assembled list.


🤖 Prototypes


User Flow - Open the App

Receive the Active Notification → Click on the "Open the App" button → in this case the user is redirected to Play Store for downloading the app.


User Flow - Re-engage

Receive the Active Notification → Click on the "Open the App" button → in this case the user is redirected straight to the app for log in.



User Flow - Recover

Receive the Active Notification → User type exit → We send him an offer message with an exclusive content our chosen A/B test → Human/Success .




Slug

Title

🔒

This case study is protected

Please enter the password to view it. If you need access, get in touch and I'll share it with you.

 

Conversational UX for AI & LLMs

TIM + Vendas: Turning WhatsApp into a Sales Channel

TIM's reseller app had 30,000 active micro-entrepreneurs and no way to reach the ones who had stopped opening it. Nine conversational flows, four audiences, and one A/B test on the opt-out.

Year :

2022

Industry :

Telecom

Client :

TIM

Project Duration :

4 months · Proof of Concept

Metric: 50k downloads · 20k → 30k active resellers

🎯 The people the app couldn't reach

My role: Conversational & Product Design · Format: Proof of Concept · Scope: 9 flows · 4 segments · 1 A/B test

TIM + Vendas turns self-employed people into resellers of prepaid SIM cards and mobile top-ups. You buy stock, sell it around your neighbourhood, earn a margin, reinvest. By October 2022, TIM reported 30,000 active resellers.

The app has one blind spot. It can only talk to resellers who open it. Push notifications land with people who still have it installed, still have notifications switched on, and still open it, which is precisely the group that needs no reactivating. Anyone drifting away is by definition the hardest person to reach inside the product.

Those same resellers spend their whole working day in a channel TIM was not using. WhatsApp is where they negotiate, send payment links, confirm top-ups and chase customers. Their storefront is a WhatsApp conversation.

So the proof of concept had one question to answer. Can WhatsApp work as an owned re-engagement and sales-activation channel, without burning the relationship it runs on?

The product is a loop

Before writing a single message I had to be clear about what I was keeping alive. The economics of TIM + Vendas sit inside one loop:

INVESTBUYSTOCKSELLEARNREINVEST

The loop is the product. A reseller who buys stock once and never sells again is not a distribution channel, only an acquisition cost with inventory attached. Channel revenue, GMV and the active-reseller figure TIM publishes all depend on how many people keep the loop turning, and how often.

That changed what the brief was about. Not a campaign. A retention problem, in a product whose retention surface was unreachable.

💬 You only get one first message


On WhatsApp, a business that starts the conversation has to open with a pre-approved template. The copy freezes at approval and cannot be edited afterwards. There is no tweaking the wording later to see whether it performs better.

The tempting response to that is one safe message with a name variable, sent to the whole base. Here is what that produces, beside what I shipped.


THE ANTI-PATTERN

Hi! TIM has news for you.

Check out our exclusive advantages and see everything the TIM + Vendas App can do for you!

5:44 PM

True for nobody. No premise, no number, no reason to answer, and it spends a template approval to say nothing.

WHAT SHIPPED

Hello, {{name}}!

How are you?

Keep earning by selling TIM Chips and TIM Recharges on the TIM + Vendas App!

To learn more about how to increase your earnings, visit the App’s Information Center.

If you no longer wish to receive messages like this, just type exit.

5:44 PM

Open the App

True for the person reading it. The premise matches what they were actually doing, and the way out sits in the same message, in one word.

Why I wrote four messages instead of one

The business and CRM side segmented the base on two axes: whether someone was active, and how recently. My call was to write four separate openings instead of one message with variables in it, each with its own approved template and its own definition of success.


  • Active last 2 months. “Keep earning by selling TIM Chips and TIM Recharges.”

    Continuity framing → deepen the loop: more stock, more often.


  • Active Jan–Jun. “We missed you! Come back to profit from selling…”

    A soft re-entry → restart frequency before they lapse.


  • Inactive Jan–Jun. “Don’t waste any more time, profit from selling…”

    Urgency framing → one purchase or one sale.


  • Inactive last 2 months. The same reactivation premise, tuned for

    the recently lapsed → reactivate before the habit decays.


L2M AssetsA.1.0.0Start
Hello, {{name}}!How are you?We missed you! Don't waste any more time, profit from selling TIM Chips and TIM Recharges on the TIM + Vendas App!To learn more about how to increase your earnings, visit the App's Information Center.If you no longer wish to receive messages like this, just type exit.5:44 PM
Open the App
Assets Jan to JunA.2.0.0Start
Hello, {{name}}!How are you?Keep earning by selling TIM Chips and TIM Recharges on the TIM + Vendas App!To learn more about how to increase your earnings, visit the App's Information Center.If you no longer wish to receive messages like this, just type exit.5:44 PM
Open the App
Inactive Jan to JunA.3.0.0Start
Hello, {{name}}!How are you?We missed you! Don't waste any more time, profit from selling TIM Chips and TIM Top-ups on the TIM + Vendas App!To learn more about how to increase your earnings, visit the App's Information Center.If you no longer wish to receive messages like this, just type exit.5:44 PM
Open the App
L2M InactiveA.4.0.0Start
Hello, {{name}}!How are you?We missed you! Come back to profit from selling TIM Chips and TIM Recharges on the TIM + Vendas App!To learn more about how to increase your earnings, visit the App's Information Center.If you no longer wish to receive messages like this, just type exit.5:44 PM
Open the App

This is the decision I would defend hardest, because it is the expensive one. Four templates means four approval cycles and four sets of copy to maintain. But a single message for everyone tells an active reseller they have been missed, and tells a lapsed one to keep going. Both read as a robot. Writing a premise per segment is what made the opening line true.


Four parallel segment entry flows, each with its own approved WhatsApp template, Open the App branch, Exit branch and unexpected-input handling


Four segment entry flows on one architecture. Each carries its own approved template and opening premise, and inherits identical branching, exception handling and exit logic. Copy varies, behaviour does not.


A note on the language.
The product shipped in Brazilian Portuguese. The flow documents throughout this case are the English set I produced alongside the Portuguese originals, so the work could be reviewed outside the local team. That is why the documents label the segments L2M Assets and Assets Jan to Jun, a literal rendering of Ativos, the Portuguese for active.

🧩 A state architecture, not a script


The core deliverable was a system rather than a set of messages. I built a numbering convention that every flow inherits: A for acquisition and entry, O for opt-out, R for standard return, E for exceptions. Every state carries an ID like A.1.0.0.

That sounds like bookkeeping. What it buys you is the ability to point at one specific moment of a conversation in a spec, in a bug report, or in an analytics event. It also made the flows measurable by construction, since every state transition is a countable event.

Alongside it ran a set of global variables carried across every flow: phone number, name, identity, user ID, plus the current state ID and the previous one. Those last two exist for a single purpose. The system always knows where a person came from.

A single documented state, A.1.0.0 Start, annotated with its approved template name, name variable, RegEx reference, device note and call to action


The anatomy of a single state. Each one shipped with its ID, exact copy, approved template name, variables, accepted inputs, RegEx reference, business rules and redirect target, using the same annotation vocabulary across all nine flows. Engineering never had to ask me what a step meant.

“Reach is easy. Permission is the asset.”

The idea every flow was built to protect. A messaging channel aimed at a low-income, high-sensitivity audience can be ruined by one bad campaign, so the exit got the same care as the entrance.

Designing for the conversations that don’t go as planned

Happy paths are the easy part. Most of the work in conversation design sits in what happens off them, so I built one exception library, specified once and inherited by all nine flows.

  • Unexpected yes / no. Restate the two valid options, return to the last step.

    Exception E.1.1.0 - unexpected affirmative or negative input


  • Off-menu number. Ask for the number matching one of the listed options, return to the last step.


    Exception E.1.1.1 - unexpected input in the numeric menu


  • Photo, video, emoji, sticker. “At the moment, I only understand text messages.” A spec written for a demo skips this case. Real people send stickers.


    Exception E.1.1.3 - unexpected image, video or emoji input


  • Ambiguous intent at the exit. Re-present the options rather than guessing which way someone meant to go.


    Exception E.1.1.4 - ambiguous intent at the exit


  • Inactivity. After 30 minutes idle, a light nudge returns the person to the exact point they left. After 7 more minutes, a polite close.


    Exception E.1.1.2 - inactivity nudge and polite close


    The E-layer, written once and reused nine times.

Every one of them ends in a return. None ends in a stop. No state exists where the conversation simply dies. That layer is also why nine flows came out quickly: resilience was designed once and inherited, so each new campaign only had to design its own happy path.

🎁 Every campaign had a job in the loop

Not “drive engagement”, but a named effect on the buying and selling cycle. Three of the five show the range:


#MISSYOUwin-backStart
TIM creative: Mudei, agora sou TIM — 4G coverage, now with 5G
Hello, {{name}}!How are you?We miss you!To help you increase your profits, we are giving you the: “#MISSYOU” coupon which gives you R$9.00 for each TIM Chip activated by your customer (during the promotion period) with 1 recharge within 30 days!For more details, visit our website and check the regulations.If you no longer wish to receive messages like this, just type exit.5:44 PM
Access the website
TIM + BenefitsleverageStart
TIM creative: TIM Pré Top — the more you recharge, the more benefits you get
Hello, {{name}}!How are you?We missed you here! Don't waste any more time! By recharging through the App TIM + Vendas, your customer earns DOUBLE tokens to participate in amazing raffles on TIM + Benefits!Encourage your customer to recharge with you and increase your profits!For more details, visit the information center of the TIM + Vendas App.If you no longer wish to receive messages like this, just type exit.5:44 PM
Open the App
Apologyservice recoveryStart
TIM creative: guarantee extra money and increase your monthly income
Hello, {{name}}!How are you?We at the TIM + Vendas App value the best experience for our resellers and noticed that you made a recent purchase with us.We are sorry that the delivery experience was not as smooth.To help you continue reselling with us, we will credit you an extra score worth R$12.00 to reinvest in the app. 📲The score is already available in your app wallet and can be used to purchase a TIM Chip or for recharge sales.We wish you good sales! Always count on us. 🤝If you no longer wish to receive messages like this, just type exit.5:44 PM
Open the App


#MISSYOU - win-back

A coupon with a name the reseller can quote to their own customer: R$9.00 for each TIM Chip activated, conditional on one recharge within 30 days. A name, a number and a rule are things a person can repeat from memory.

TIM + Benefits - leverage

Recharges made through the app give the end customer double entries in TIM’s prize draws. The reseller is not asked to buy anything. They are handed a reason to call their customers.

Apology - service recovery

The flow I would show first. It apologises for a delivery that was not smooth and credits R$12.00 into the in-app wallet before the reseller complains, and the credit can only be spent buying a TIM Chip or on recharge sales. It converts the product’s most common support failure into a re-engagement trigger, and pays the apology in working capital instead of words.


🚪 Opt-out as a product surface


In a permission-based channel, leaving is not the failure state. It is the mechanism that keeps the channel alive. So the exit got three jobs: honour the decision immediately, offer one fair chance to reconsider, and capture why.


  • “I did not authorize the sending of messages to my WhatsApp” → Consent

  • “The content does not interest me” → Relevance

  • “I am not sure if this contact is from TIM / I do not trust this company” → Trust & legitimacy

  • “I have already registered” → Stale targeting

  • “I am receiving too many messages from TIM” → Frequency governance

  • “Other” → free-text capture, acknowledged → Qualitative input



State O.2.0.0, the opt-out reason menu, with six numbered reasons and a free-text branch behind option 6


State O.2.0.0, the reason menu, with a free-text branch behind option 6.

These are not generic unsubscribe reasons. Option 3 reports on trust, option 5 on contact frequency, option 4 on stale targeting, and each one belongs to a different owner: brand, CRM cadence, data hygiene. In a broadcast channel this is the only structured qualitative data available.

The business rule that kept it honest. Anyone who enters the opt-out flow and confirms is opted out permanently, even if they never fill in a reason. Reason capture never becomes a toll gate on leaving.


The one thing I chose to test


The reconsideration prompt was the single place where the wrong wording could either trap people or leak them. So I ran it as a test rather than settling it in a debate.


VARIANT A · O.1.0.0

Ok! I understand…

If you want to know more about how to earn extra income by reselling chips and TIM recharges, just choose the option “I want extra income” and I will show you how!

But if you are sure you want to stop receiving exclusive TIM + Sales content, type the option “I want to opt out” 😀

5:44 PM

I want extra income

I want to opt out

Hypothesis: explicit labels reduce mis-taps and let the offer compete with the exit at the moment of decision.

Result: 2.8% opt-out.

VARIANT B · O.3.0.0 · WINNER

Okay! I understand…

If you want to know more about how to earn extra income by reselling chips and TIM recharges, just choose the “Yes” option and I’ll show you how!

But if you don’t want to receive exclusive TIM + Sales content, type “No” 😀

5:44 PM

No

Yes

Hypothesis: on entry-level devices, and for people with low digital confidence, a two-word binary beats parsing two competing propositions.

Result: 1.5% opt-out.


Variant B won on the metric that decided it: opt-out rate. 1.5% opted out under the two-word binary, against 2.8% under the labelled buttons, almost double. B became the standard exit pattern across the POC.

A lower opt-out rate is only a win if it comes from comprehension rather than confusion. A binary can suppress exits simply by making the way out harder to identify, which is a dark pattern wearing the costume of a good result. So the reading holds only if unexpected input at that same state did not rise alongside it. Fewer exits and fewer mis-taps means the two words were understood. Fewer exits with more mis-taps would have meant the exit was hidden, and I would have argued against shipping it.

What I take from the result: once someone has decided to leave, persuasive text in a button label does not persuade them. It adds reading and decision cost to a choice already made. Sell before the exit, not inside it.


The winning opt-out variant documented in full, showing the Yes and No branches, the permanent opt-out business rule, and the fan-out routing users back to one of four source templates


The winning variant in full. The fan-out at the bottom, under “Which source template?”, is the part worth reading: however someone resolves the exit, they are routed back to the origin template they arrived from. Anyone who reconsiders returns to the campaign that was relevant to them.


A handoff engineers didn’t have to decode


The flow documents were build specs rather than presentation boards. Every state left my hands with its ID, exact copy, interpolated variables, approved template name, button labels, accepted inputs, RegEx reference, business rules, redirect target, and implementation notes for the developer.

The RegEx dictionary stayed a single shared source of truth rather than being duplicated per flow, so every real-world way of saying the same thing (“do not receive anymore”, “do not want to receive”, “cancel”, “no”) resolves identically across nine flows and can be extended in one place.


🤔 Results & what I took from it


Because every state carries a stable ID, the flows were instrumentable by construction. The measurement plan was written before the first send.

100K

TEMPLATES DELIVERED

85%

85k read

READ RATE

5K

RETURNED TO THE APP

9.4%

8k clicks

CTA CLICK-THROUGH TO APP

2.8% A

1.5% B

OPT-OUT RATE, A VS B

4K

REACTIVATED RESELLERS


Back to the reseller

What drives someone away from a channel is not the message itself. It is a message that clearly was not written for them, with no way out of it.

A reseller’s storefront is a WhatsApp conversation. So we stopped asking them to come to the app and took the app to the conversation, with an opening that was true for the person reading it, an offer priced in reais, and an exit that took one word.

1. Conversation design is systems design

The valuable artifact was the architecture underneath the flows rather than any single flow. Once the state convention, the global variables and the exception library existed, a new campaign became a day of work instead of a week, and every campaign inherited the same resilience. Nine flows without a system would have been nine dead documents.

2. Design the exit as carefully as the entrance

In a permission-based channel the opt-out is what keeps the channel usable next month. It was also the only surface that produced structured qualitative data, and the only one I chose to A/B test. The cheapest exit produced the best outcome.

3. Constraints are the design

Frozen templates, a 24-hour reply window, no NLU in scope, entry-level Android devices. Each of those removed an option and forced a better decision: plan variation up front, get to the point fast, anticipate how people really type, and never assume anyone knows the convention.

4. Money is the message

Every offer appears in reais in the first screen. “R$9.00 for each TIM Chip activated.” “A R$12.00 score already in your wallet.” Never “exclusive advantages”. For an audience running a small business on thin margins, a number is the only value proposition that survives being skimmed.

5. What I would do next

Wire the opt-out reason taxonomy into a live cadence policy, so “too many messages” throttles contact frequency for that segment automatically instead of becoming a line in a report. And make the recovery flow triggered rather than reactive, fired by a delivery-SLA breach instead of a manually assembled list.


🤖 Prototypes


User Flow - Open the App

Receive the Active Notification → Click on the "Open the App" button → in this case the user is redirected to Play Store for downloading the app.


User Flow - Re-engage

Receive the Active Notification → Click on the "Open the App" button → in this case the user is redirected straight to the app for log in.



User Flow - Recover

Receive the Active Notification → User type exit → We send him an offer message with an exclusive content our chosen A/B test → Human/Success .




Slug

Title

🔒

This case study is protected

Please enter the password to view it. If you need access, get in touch and I'll share it with you.

 

Create a free website with Framer, the website builder loved by startups, designers and agencies.