Tarik Malagoli
HomeAbout
LinkedIn

Fellow

Designing an AI-Powered CRM for Brazilian Quick-Print Shops

Fellow order dashboard on laptop with WhatsApp AI agent on phone

Result

Order creation: 8 min → 6 min, timed with 8 employees at the pilot shop.
First reply on WhatsApp went from next-day to immediate.

Client

Client: Gráfica SF - quick-print shop (pilot)
Product: Fellow Platform - CRM for quick-print shops

Year

2026

Team

Tarik Malagoli: Product design, research, front-end implementation (AI-assisted)
Danilo Trivelatto: Backend, migration architecture, pricing engine

Tools

Figma, Figma Make, Cursor, Claude Code, Lovable, Supabase, Vercel, n8n

OVERVIEW

From a next-day WhatsApp backlog to an instant, AI-driven first reply.

Fellow is a CRM built for Brazilian quick-print shops (gráficas rápidas) — businesses that sell speed but run on WhatsApp chaos, manual price math, and orders scattered across Trello and spreadsheets.

I led the end-to-end UX: field research inside a working print shop, order-flow design, a pricing matrix that took manual math out of the quote, and the conversation design for an AI agent that handles customer service on WhatsApp.

Gráfica SF storefront, serving a high volume of customers every day.
MY ROLE

Sole designer on a two-person team — research to working product in weeks, not months.

I owned the full design process: field research, flow definition, prototyping, usability testing, AI conversation design, and iteration. I also built using Figma and Figma Make for exploration, then Cursor + Claude Code to turn validated designs into working screens on Supabase/Vercel, with n8n orchestrating the WhatsApp agent.

Danilo Trivelatto owned the backend, the platform migration and the pricing calculation engine. Where the two overlapped, the pricing model, we worked as a single loop.

What this changed: AI tooling didn't replace the UX process — it collapsed the distance between "validated prototype" and "testable product." Instead of testing static Figma prototypes for months, I was testing the real system with real employees within weeks of each design decision. Every usability finding could ship as a fix in days.

THE PROBLEM

Quick-print shops sell speed, but their own operations are the slowest thing about them.

Brazilian quick-print shops run two sales channels at once: a walk-in counter and a flood of WhatsApp messages. On my first visits I watched the person on shift handle both, and lose both.

What was visible from day one:

The operation had no system underneath it. Orders lived in Trello, products in Google Sheets, customer history in people's memory. Every handoff between those places was a place where information stopped.

WhatsApp was 24 hours behind. An employee showed me a backlog of ~30 messages from the previous day, none with a first reply. For a business selling same-day printing, a customer waiting a day for "hello" is a customer already walking to a competitor.

Those two were obvious. What wasn't obvious was why nobody inside the shop treated them as problems, and that took hours of watching to understand.

Field immersion at the pilot print shop — WhatsApp backlog
~30 conversations from the previous day, still without a first reply - complete chaos. 🤯
Spreadsheets, outdated price sheets, and Trello used to manage the operation.
Before Fellow, the print shop managed orders and products across Google Sheets, folders, and Trello, making the operation fragmented and harder to control.
SCOPE & CONSTRAINTS

A pilot client, no historical data, and a pricing model that existed only in people's heads.

• No baseline data — so I built one. The shop had no metrics on response time, order volume per channel, or quote accuracy. Every "before" number in this case came from direct observation and stopwatch timing during my visits, with 8 employees.

• A live business. I couldn't pause operations to test. Every usability session happened between real customers, with real orders.

• Undefined pricing logic. Nothing about how prices were built existed on paper. The product couldn't be designed until that was extracted.

• Pilot stage. Fellow is live with one client; results are from that pilot, not a broad rollout.

Every number in this case study should be read against those four constraints.

RESEARCH & DISCOVERY

I spent days inside the shop before drawing a single screen.

Across multiple visits, I shadowed counter service, watched WhatsApp conversations unfold, followed orders into production, and sat with the owner during the daily delivery phone-tag with riders. I documented every handoff where information was retyped, remembered, or lost.

Timing changed the story. Staff described quoting as "a minute." Timed against real interruptions, it took 4–6.

No first response

I mapped where the 24-hour delay actually came from: nobody owned the inbox. Messages were answered by whoever had a free hand between walk-ins.

No one could explain the prices

A single business card can be configured 240 different ways: format, dimensions, paper type, finish, special cuts, quantity, art. Stickers and banners stack the same way.

I asked how a price was built and never got the same answer twice. Quotes came from printed price guides with fixed values, plus whatever the attendant remembered. When a request fell between two entries in the guide, the number was decided on the spot.

Nobody saw this as a problem. Staff were proud of knowing the prices by heart - the pain was invisible from the inside, and only surfaced when I timed the task.

What it meant for the project: the pricing rules existed, but only as tacit knowledge spread across the team. There was nothing to design from, and nothing an AI agent could query. Pricing became the blocker for both surfaces of the product.

USERS & AUDIENCE

Three contexts, one order

The counter attendant

Henry, the attendant I shadowed across four visits. Standing, interrupted constantly, switching between a walk-in and a WhatsApp thread mid-sentence. Never sits down. Core need: create an accurate order fast, without doing math.

Observed across 4 visits; order creation timed with 8 employees.

Print shop staff illustration

The customer

Real customers of Gráfica SF, reconstructed from the shop's own WhatsApp history. They order while doing something else, describe the job in fragments ("a banner, medium, for Friday"), and expect a price in the same thread. Core need: a clear quote without a phone call, and a painless way to pay.

Based on transcripts of real conversations from the shop's WhatsApp.

Illustration of a customer placing an order via WhatsApp.

Shop manager / owner

Fausto, the owner. I ran the pricing sessions with him directly. Knows the business by memory and can't transfer that memory to anyone. Core need: a 360° view — what sold, what's late, who's producing, what came in today.

Based on working sessions to extract the pricing logic.

Illustration of the print shop owner reviewing the system reports.

Design implication: one order object had to behave correctly in a dense desktop CRM, in a natural-language WhatsApp conversation, and in the reports the owner reads to run the business.

THE INITIAL PROTOTYPING ATTEMPT

The first version slowed people down. Testing told me where.

Initial rounds of in-person usability tests with shop employees exposed flows that were delaying the operation. Sessions were interrupted by real customers, and that was the point: the interruption is the operating condition. A flow that only works uninterrupted doesn't work at this counter.

Example finding → fix:
• Finding: Staff abandoned order creation mid-flow when a walk-in customer arrived, losing all entered data.
• Fix: Auto-saving draft orders, resumable from the dashboard.
• Result: In the following sessions, no order was lost to an interruption. Staff stopped restarting from scratch.

Three rounds of testing reshaped the order flow before a single screen was considered final. The time saving those changes produced is in Outcomes.

But testing exposed a second problem, and it wasn't in the interface.

Second finding → fix:
• Finding: The structured order flow was correct and still too slow for simple counter requests — a copy job did not need the full CRM.
• Fix: A parallel Quick Order flow: Customer → Products → Payment.
• Lesson: The most complete workflow is not always the best workflow.

FROM LOVABLE TO CURSOR

The next problem wasn't in the interface — it was in the platform behind it.

Fellow started in Lovable, which turned early ideas into a working prototype in days. That speed was real, and it's why the first usability tests happened weeks ahead of schedule.

The ceiling appeared with the pricing engine. As the system grew, each change started breaking parts that already worked - the codebase was there, but we had no direct control over it, and every fix risked something else. A prototype platform is built to show an interface; it isn't built to hold the logic underneath one.

The migration was Danilo's call to make and mine to validate. He owned the architecture; I owned whether the product still behaved the way the tests said it should. We moved to Cursor, gaining the flexibility and implementation control the pilot needed.

The lesson: prototyping speed and production foundation are different problems, and using one tool for both costs a migration. I'd start in Lovable again, the weeks it bought in early testing were worth it, but I'd plan the exit from day one.

With the foundation settled, the design decisions below are the ones that shaped the product itself.

The loop at the bottom is the point: testing with real staff fed back into the prototype at every phase, including after the migration.
DESIGN DECISIONS

The ORDER BOARD: keep the kanban, rebuild what's under it

Before: Orders lived in Trello. It worked as a team board, but nothing underneath it worked:

- Customers and products couldn't be linked to records: everything was typed by hand.
- Unrelated information, like invoice generation, was mixed into the same board.
- The team retyped the same data constantly.
- The business couldn't answer basic questions: how many orders last month? how much did we bill this year?

BEFORE

The board worked. What sat underneath it: customers, products, prices - didn't exist as data.
An order was a note inside a card: client name, product, price and deadline typed by hand, linked to nothing. No customer record, no product catalog, no way to find it again.

AFTER

Decision: Orders now pull from a real customer base and product catalog. Every order gained a code, a history, and a report. I added two views Trello never had: by order status and by employee, giving the manager a full panorama.

Why it mattered: the shop moved from "we think it was a good month" to knowing exactly what it sold, to whom, and by whom — without a single day of retraining.

Don't redesign the habit - redesign the substrate

The temptation was to replace Trello with something better. But Trello wasn't the problem - the team had mastered it, and relearning a new metaphor would have cost weeks during live operation, in a business that can't pause.
What was broken sat underneath: disconnected data, retyped information, no source of truth. So the surface stayed familiar and the foundation was rebuilt.

Same mental model, different foundation. Jakob's Law kept the learning curve at zero.
New Order screen with customer and products added
One screen holds what used to live in four: the customer and their 17 previous orders, every product variation with its price already resolved, and payment, all without leaving the order.

Repeat Order

Reprints are routine in printing — the same business card, the same banner, three months later. A past order becomes the starting point for a new one, with every variation already configured.

Design principle: don't make users reconstruct information the system already knows.

DESIGN DECISIONS

Two flows, because the counter has two speeds

The full order flow was right for a business card with seven variations. It was wrong for someone who walked in wanting forty copies.

So Fellow has two: the complete workspace, and Quick Order: three steps, nothing else. Customer → Products → Payment.

Design principle: the correct amount of interface depends on the context of use, not on how much the system can do.

Quick Order is where most of the time saving in Outcomes came from.

Select/Add CUSTOMER

Customer: Search by name or phone, or create in place. No leaving the flow.

Choose PRODUCT

Product: The same pricing engine, one tap per variation. The price resolves as options are selected.

Receive PAYMENT

Payment: Payment method and total, closed in the same screen.

The counter is a queue

Every second one customer spends at the counter is a second the next one spends waiting, which is why the goal was never "fewer clicks," it was "fewer people standing there."

DESIGN DECISIONS

The pricing engine: the heart of the CRM

Before: every quote was rebuilt from scratch. The spreadsheet below held product data, not pricing logic. The logic was in whoever happened to be at the counter.

BEFORE

Gráfica SF customer spreadsheet

AFTER

Decision - and how it was built: This was the most challenging part of the project, and the one that most required design and engineering to work as a single loop.

How the rules came out: the owner couldn't describe a pricing rule, but he could price any order I put in front of him. So I stopped asking and started reconstructing: I brought past orders, asked him to price them out loud, and wrote down every "it depends." Three sessions in, the depends started repeating — and the repetitions were the rules.

• The variation matrix. I designed a model where each variable: format, size, paper, finish, special cuts, quantity, art - carries its own price component, and the composition of those components produces the final price. The hard part wasn't the math: it was deciding which variables were independent, which ones override each other, and where the shop's exceptions were real rules rather than habits.

• Danilo Trivelatto turned the model into a calculation engine that holds up under real conditions: rounding, rule precedence, and the performance needed for both the CRM and the AI agent to query it in real time. Several rounds of attempts and failures were needed before it was correct.

This is the module that broke Lovable. It's also the module that made the whole product possible.

Fellow’s new product and pricing management system
What used to live in spreadsheets and memory became a reusable product and pricing model.

Why it mattered twice

At the counter, staff stopped calculating. On WhatsApp, the AI agent quotes from the same engine, so automated quotes are precise rather than approximate. This was the make-or-break module: without pricing working, the entire CRM collapses.

Two extensions came from field reality:

• Smart calculation: customers ask for odd numbers: "325 stickers, 2 × 2 cm." Staff used to work out manually how many fit on an A3 sheet, losing time and delaying the order. The system now computes the layout.

• Graphic calculation: bleed, margins, A4 vs A3, sheets vs meters vs units — a per-product configuration, because each product carries its own logic.

Smart calculation

The layout the attendant used to work out by hand: 216 stickers per sheet, 18 rows by 12 columns, bleed and margin included. The system resolves it while the customer is still talking.

Graphic calculation

Per-product setup: sheet format, bleed, margins and whether the item is priced by unit, sheet or metre.
DESIGN DECISIONS

Designing a real customer database

Before: Gráfica SF did not have a centralized customer base. That meant:

- Lost contacts;
- No complete order history;
- No single place for addresses;
- Limited understanding of customer behavior — no way to know who bought what, or when.

From: “Who is this customer?”
To: “We already know who we're talking to.”

What a print-shop customer record actually needs: six tabs, and none of them obvious from a generic CRM template. Registration data and addresses were expected. Order history came from the reprint behaviour. Media exists because print customers send art files that get reused months later. Financial exists because half the customer base buys on invoice terms, not on the spot. Notes exists because staff kept telling me things about customers that had nowhere to live.

When a known customer contacts the company through WhatsApp, the AI Agent can identify them by phone number and address them by name.

Clients register
Fellow customer list with contact data, tax ID and status

Order history
Every order a customer ever placed, with status, value and the option to repeat it. This is what makes Repeat Order possible, and it's what lets the AI agent answer "the same as last time" without asking anyone.

Customer Financial Profile
Quick-print shops sell on invoice terms to their business customers, and the decision of who gets credit lived in the owner's head. Fellow makes it explicit: credit limit, payment terms, overdue tolerance, and an automatic billing block when a customer crosses the line.

Why it mattered: the attendant no longer has to interrupt the owner to ask whether this customer can buy on terms.

DESIGN DECISIONS

The hardest interface had no screens

BEFORE

One of the strongest research moments happened standing next to an employee answering WhatsApp. I saw conversations still waiting from the previous day.

Staff told me they got lost among simultaneous conversations and couldn't tell:

Whether a customer had paid: the trigger for starting production. Paid orders sat idle because a message slipped past unnoticed.

Which conversations were stale: they archived chats manually just to keep the inbox usable.

How to quote quickly: they typed the product name, every variation, and sent reference photos and prices by hand, stretching each conversation.

For the customer, silence feels like bad service. For the employee, every new message increases the backlog.

AFTER

Bring the conversation inside the CRM. Instead of treating customer service as a separate tool, the WhatsApp thread lives next to the customer, their orders, the product catalog and the payment status. New messages surface inside Fellow.

Design the conversation before building it. I mapped the full flow in FigJam: service guidelines plus the range of situations that actually occur — vague requests, mid-conversation changes, price objections, customers who vanish and return days later. The open questions were: how should the conversation open, what tone should the agent hold, and what must it collect before it can quote.

Let the agent close the quote, not the sale. The agent builds the quote from the same pricing engine the counter uses, then hands the conversation to a human for validation. Returning customers are identified by phone number and greeted by name from the first message.

Pause AI. Staff take over instantly by typing a message or pressing a button.

Why the Pause AI button matters more than it looks

It's the trust mechanism. Automation a user can't interrupt is automation the user resents. A one-tap override is what made the team willing to let the agent run.

Click to view details
Conversation architecture: intake, specification, quoting, objections, payment, human handoff.
Fellow workspace where the AI Agent and staff can talk to customers, send quotes, and create print orders.
The conversation, the customer's record, the product catalog and the cart in one screen. The quote the agent sends is built from the same engine the counter uses.

One source of truth, three surfaces

The same order had to behave correctly in a dense staff CRM, in a natural-language WhatsApp conversation, and in the reports the owner reads to run the business.

DESIGN DECISIONS

Designing data the company never had

The shop couldn't answer basic questions about itself: how many customers, which products sell most, how much came in today, who sold it. Not because the data was hidden — because it was never recorded anywhere.

Once orders, customers and prices became structured data, the answers came for free. That's the shift: Fellow started by organizing work, and ended up producing the information to run the business.

Research also made clear that no two print shops operate the same way. So the parts that legitimately differ are configurable, and the parts that shouldn't differ aren't.

Design principle: standardize the experience where consistency helps. Configure the workflow where the business genuinely differs.

Reports — Revenue trend, orders by status, average ticket, active customers. Plus order-level answers: top-selling employee, most frequent payment method, counter vs. delivery, biggest customer.

Flexible kanban — Columns are reordered to match each shop's production flow, not the other way around.

AI Agent instructions — Knowledge base, tone, response behavior and service guidelines are configured per shop, so the agent speaks as that business.

Flexible Kanban Flows
Reorder Kanban columns to adapt workflows to different production needs and give teams greater control over order management.

AI Agents
Centralize the intelligence behind AI Agents. Define their knowledge base, response behavior, service tone, instructions, and customer interaction guidelines.

Outcomes

Fellow is running as a pilot with its first customer, so these are early signals, not final business impact. The distinction matters: the point is to show evidence, not to manufacture certainty.

8 min → 6 min · Order creation: I timed order creation with 8 employees at the pilot shop, before and after rollout. The average fell from 8 minutes to 6: 2 minutes saved on every order. Timed by stopwatch during live operation, with real customers interrupting, because that's the only condition that matters here. Most of the saving came from one place: quoting alone used to take 4–6 of those 8 minutes.

Less employee time per WhatsApp order: The agent handles intake, specification and the first quote. Staff enter the conversation to validate, not to build it from scratch, which is where most of their typing time used to go.

From next-day to immediate first reply: The agent engages the customer at any hour, instead of every conversation waiting for a free employee. The 30-message overnight backlog no longer accumulates.

Pricing that survives the person who knows it: What lived in the owner's head is now a model both the staff and the AI agent query. New employees stopped needing to learn prices before they could sell.

Challenges and Lessons Learned

What I learned

Three things nearly broke this project: a pricing logic nobody could describe, a prototype platform that couldn't hold it, and a flow that tested well and still slowed the counter down. Each one changed the product more than any interface decision did.

The biggest lesson from Fellow is that good UX wasn't about making a CRM easier to use.
It was about understanding a business deeply enough to decide what the system should do in the first place.

Visiting the print shop changed decisions I would never have questioned from behind a screen.
Testing with actual employees exposed workflows that looked good in a prototype but slowed down the real operation.

Designing the AI Agent taught me that conversational experiences require uncertainty, guardrails and human escalation to be treated as first-class design problems. And using AI throughout the product development process showed me something equally important:

AI dramatically increases how fast we can build.
UX determines whether what we build is worth building.

PHASE 2 — WHERE FELLOW CAN GO NEXT

Insights gathered during field research also uncovered opportunities that go beyond the scope of the first release. Rather than adding them prematurely, I proposed validating the core product with more print shops first and using those learnings to prioritize the next phase.

Recommended Phase 2 opportunities:
Validate Fellow with additional quick-print shops: to identify shared patterns and business-specific differences.
Payment integration: verified payment status instead of receipt screenshots.
Delivery & rider experience: connecting dispatch, drivers and delivery status to the order lifecycle.
WhatsApp voice-message support: reflecting how customers actually communicate.
Full-funnel analytics: from first contact to quote, payment, production and delivery.

The first item is the one that matters. Everything in this case study was learned inside one print shop. Until Fellow runs in a second and a third, I treat these patterns as hypotheses that held up once.

Phase 1 is live. The learning isn't finished.

Fellow’s first phase transformed a fragmented operation into a connected workflow. Phase 2 is about taking what worked at Gráfica SF, testing it across more businesses, and turning those learnings into a product that can scale.

Password required

This case study is password-protected. Enter the password Tarik shared with you to continue.

Tarik Malagoli

Reach me directly

WhatsApp+55 16 98200-9916Emailtarik@tarik.com.brLinkedInlinkedin.com/in/tarikmalagoli
Designed and built by Tarik Malagoli - © 2026