Consumer Goods Fragrance Brand (anonymised)

One Customer View, Every Conversation

Their customer data was scattered across five tools. No one could see a full picture. We built the layer that made that possible, then put a voice agent on top of it.

38% increase in repeat purchase rate

72% of post-purchase calls handled by agent

Stack PythonTwilioClaudePostgreSQLZapier

The situation

A head of marketing at a mid-sized fragrance brand came to us with a problem she could feel but couldn’t quite name.

Her team was running campaigns. They had customer data. They had tools. But every time they tried to do something specific with a customer, they hit a wall. Who had bought the oud collection twice? Who bought as a gift last December and hadn’t come back? Who were their highest-value customers in the past six months? These felt like simple questions. The answers required someone to manually cross-reference three different platforms and still come back uncertain.

The data existed. It just didn’t live anywhere useful.

The bottleneck

The marketing stack had grown organically. The e-commerce platform was the source of truth for online orders. In-store purchases lived in the POS system. Email marketing had its own contact database. A loyalty program had its own separate records. None of them talked to each other.

When a customer called, the support team was starting from zero. No order history. No indication of what they’d bought, how recently, or whether it was a gift. A customer who had spent thousands over two years was indistinguishable from a first-time caller in the first thirty seconds of that conversation.

Post-purchase follow-up existed in theory. In practice, it was ad hoc. Someone remembered to send an email. Someone forgot to make a call. There was no system, so the quality of retention depended on individual effort rather than process.

What we built

We started with the data layer. A unified customer profile store built in PostgreSQL, fed by all their existing tools through Zapier-managed sync and direct API integrations. Every purchase, every email interaction, every in-store transaction got mapped to a single customer record. The marketing team finally had a place to ask questions and get answers.

On top of that, we built a voice agent using Twilio and Claude. When a customer called in, or when the team ran an outbound post-purchase follow-up campaign, the agent had the full profile loaded before the first word was spoken. It knew what the customer had bought, how recently, which product lines they gravitated toward, whether they’d ever purchased as a gift. Routine queries got handled end to end. High-value customers got flagged for a human follow-up, with a pre-prepared brief attached so the team member could pick up the conversation without any prep.

The real challenge

The data unification was messier than it looked on paper.

Each tool had its own way of identifying a customer. The e-commerce platform used an account ID. The POS used a phone number at checkout, inconsistently formatted. The email tool used an email address. The loyalty program used a membership number. There was no shared key. That meant matching the same person across systems required probabilistic matching: email address, phone number variants, name spellings, and combinations of those signals to decide, with enough confidence, whether two records belonged to the same customer. We built and tuned that matching layer carefully. Getting it wrong would mean either missed unifications or, worse, merging two different people’s histories.

The voice agent had a different kind of challenge. Fragrance is not a category where generic scripting works. It is personal. Sensory. Emotionally loaded in ways that other retail categories are not. A customer calling about a discontinued scent is not just asking a product question. Getting the agent to respond with the brand’s warmth, and to hold that warmth consistently without slipping into hollow pleasantries, took real prompt work. We collected transcripts from their best human sales conversations, identified the phrases and rhythms that made those conversations feel right, and built those patterns into the agent’s grounding context. The first version felt like a chatbot wearing the brand’s clothes. By the final version, the tone was genuinely close.

The outcome

Post-purchase follow-up went from ad hoc to systematic. Within three months of launch, 72% of outbound follow-up calls were handled end-to-end by the agent, with only high-value and complex cases routed to the human team. The team was making more follow-up contact than before, at a fraction of the operational cost.

Repeat purchase rate increased by 38% over the six months following launch compared to the same period the prior year. The marketing head attributed the bulk of that to timing: customers were being reached while the purchase was still recent and the experience was still warm, instead of falling through the cracks until the next email campaign happened to land.

The cleaner win was harder to quantify. The team finally had one place to understand their customers. They could segment, act, and measure without stitching together exports from five different tools. What had previously taken a week of manual work before a campaign launch now took an afternoon.

The marketing head said it plainly: “We always knew who our customers were in theory. Now we actually know.”

What would you Automate?

Jump on a 30 minute discovery call.
No commitment, no sales pitch.

Book a discovery call
Ready to talk? Schedule a call