@shv_founder ↗
Case / 2025 Retail CRM

CRM студии света

Designer base, offline attribution and SMS on FastAPI + SigmaSMS

CRMFastAPIPostgreSQLRedisSigmaSMS

Context

One of Moscow’s largest lighting showrooms. Nearly 30 years in business — and a huge base of interior designers: some buy regularly, others need a careful re‑engagement.

Contacts lived everywhere except one place: inbox threads, paper in the director’s cabinet. Offline sales happened; source and touch chain stayed in managers’ heads.

Brief

Build an ops CRM for a lighting showroom: one designer card, deals with attribution, segments and SMS without Excel copy‑paste.

  • one designer database with filters and tags;
  • SMS: promos, brunches, birthdays;
  • track returns after events;
  • offline deals with mandatory source (Instagram → Telegram → showroom, Yandex Maps → showroom, etc.);
  • an admin panel managers actually use every day.

Architecture

Stack tuned for retail load and campaign queues — no overengineering, headroom for a growing base and more campaigns.

  • FastAPI — API and domain logic: cards, deals, segments, roles, delivery webhooks;
  • PostgreSQL — source of truth: clients, deals, sources, templates, SMS status;
  • Redis — queues and cache: segmentation, SigmaSMS rate limits, send idempotency;
  • SigmaSMS API — transactional and marketing SMS with delivery tracking.

Admin UI in React: fast filters, required fields on deal close, segment preview before a campaign goes out.

Product

Managers see a designer card: contacts, visit history, brunch attendance, deals and the channel that brought them in. Source isn’t optional — it’s part of closing a deal.

Campaigns build from Postgres segments: birthday this week, silent for N months, came from an event, bought fixtures / never bought accessories. Redis owns the queue and blocks duplicate sends on retries.

SigmaSMS statuses write back to the deal and card — who got the message, who was blocked by the carrier, where a manual follow‑up is still needed.

The real lesson

A month after launch we asked: “did you get what you wanted?” Answer: “nothing changed at all.”

CRM made the reason obvious: over 90% of deals were empty or so thin that source couldn’t be recovered. The tool was live. The process wasn’t.

We rewrote the playbook, walked real first‑month cases, closed edge scenarios and explained why a few extra clicks today become management decisions tomorrow. Shipping CRM isn’t only code. It’s adoption.

Outcome

  • one loop “base → deal → source → SMS” on FastAPI + PostgreSQL;
  • reliable SigmaSMS campaigns with a Redis queue;
  • a clear touch chain down to the offline sale;
  • a team that knows why the card must be filled — otherwise analytics is noise.

More on the human side of rollout — in Thinking and on vc.ru.

Next / Your project

Need a similar product?