Skip to content
SaaSBeta2025

Trativa

Multi-tenant CRM SaaS with a kanban pipeline, WhatsApp Cloud API, and an Electron desktop app

React 18ViteTailwind CSSSocket.IONode.jsExpress
Runs onWebPWA (mobile)Desktop (Electron · Windows)
trativa.app
pipeline stages, from new to converted
9
repositories: app, API, landing page, and desktop
4
custom field types per company
11
surfaces: web, PWA, and Electron desktop
3

01

Overview

Trativa is a multi-tenant SaaS built across 4 separate repositories: a React/PWA front end, a Node.js/MongoDB back end, a landing page, and an installable Electron desktop app for Windows. The system has full multi-tenancy per Organization — each company has its own isolated leads, users, and custom fields. The pipeline has 9 real stages (new → in service → contacted → interested → no response → meeting scheduled → proposal sent → converted → lost), with drag-and-drop via dnd-kit and real-time updates through Socket.IO. Reports include the conversion funnel, performance by salesperson, by source, by city, stalled leads, and a conversion time series.

My role

Solo full-stack developer — 4-repository architecture, Node.js/Express/MongoDB back end, React/Vite/PWA front end, WhatsApp Cloud API integration, multi-plan Stripe, Electron desktop app, landing page with Framer Motion.


Category

SaaS

Year

2025

Status

Beta

Platforms

WebPWA (mobile)Desktop (Electron · Windows)

Four repositories, one product. The React app talks only to the API; the API is the only one that knows about organization, plan, and WhatsApp. Electron reimplements nothing — it loads the same app, which is already responsive.

React 18 App

Vite · PWA · Railway

Tailwind@dnd-kitSocket.IO clientRecharts

Express API

Node · Railway

JWT + refreshSocket.IOStripeMulti-tenant

Data and channels

MongoDB + integrations

MongooseWhatsApp Cloud APIResendSentry

Desktop app

Electron · Windows

NSIScontextIsolationsandboxNo sensitive code

Sync: scopeQuery applies Organization + soft delete on every endpoint: one company's lead never shows up in another's query, even if the id leaks.


02

The Problem

Brazilian sales teams lose opportunities for lack of structured tracking — leads arrive from different sources (Google Maps, Instagram, referrals, ads), get jotted down in a notebook or WhatsApp, and go without follow-up. Managers have no real-time visibility into the funnel.

03 — The Solution

A web + PWA + desktop CRM with a customizable 9-stage pipeline, WhatsApp Cloud API integration for direct communication, custom fields with 10+ types to fit each company's reality, sales goals per salesperson, and complete funnel reports — with Stripe subscriptions in 4 plans and a 14-day trial.


04

Inside the product

The system in action, recorded from the real application with a demo store — no screen is a mockup.

01

Pipeline

The lead moves through the funnel by drag and drop

Nine real sales stages, from first contact to converted. The card leaves one column and enters another with @dnd-kit, each stage's counter adjusts, the status saves instantly, and Socket.IO pushes the change to anyone with the same screen open.

  • Kanban, table, and cards over the same data and filters
  • Status also editable from the card's own selector
  • Each column loads 25 leads and fetches the rest on demand
Pipeline
02

WhatsApp

The official conversation happens inside the lead's record

Integration with Meta's WhatsApp Cloud API: the conversation lives in a lead tab, with the 24-hour window notice, the history of sent and received messages with read status, and the choice between a free-form message (inside the window) or an approved template (outside it).

  • Service window with its expiration visible before you write
  • Follow-up scheduled right from the conversation
  • Per-lead opt-out, respected in broadcasts and bulk contact
WhatsApp
03

Reports

The funnel shows where the process gets stuck

Stages become proportional bars with the conversion from one to the next. When a transition falls below 30%, it is flagged in red and the system explains what is happening there — the same view can be read by salesperson and by source.

  • Configurable period, from the last 7 days to a closed month
  • Per-salesperson and per-source views over the same numbers
  • Reports for stalled leads, by city, and conversion series
Reports
04

Customization

Each company creates the fields it uses — no deploy

Eleven field types (text, number, currency, date, yes/no, select, multiple choice, URL, email, phone, long text). The admin chooses where each one appears: on the kanban card, as a table column, or in the search filters — and the change applies to the whole organization instantly.

  • Key generated as a slug and stored in a Map<Mixed> in Mongoose
  • Fields are included in CSV export and import
  • A deactivated field disappears from the screens without deleting the stored data
Customization
05

Lead intake

Import before saving: review, duplicates, and API

The spreadsheet is uploaded, the system shows how many rows are valid, how many are duplicates, and how many have errors — and only saves after you confirm. The same route exists as an API with its own key, for those who prefer to send leads straight from automation.

  • Import session kept for 30 minutes between review and confirmation
  • Duplicate detection by phone, email, Instagram, and website
  • Unknown columns become custom fields on the spot
Lead intake
06

Team

Invitation with role and project, goals with real progress

The invitation defines the role and which projects the person can access. Goals are measured against the lead's history — not against a separate counter — so each salesperson's progress reflects exactly the status changes in the period.

  • Roles: owner, admin, and collaborator, each with its own scope
  • Four goal types: converted, contacted, proposals, and meetings
  • Collaborators see only the leads they are responsible for
Team
07

Interface

Six palettes for the interface — the brand stays blue

Each user picks the system palette (blue, purple, green, orange, pink, or gray) and it is applied through data-theme on the root, overriding the Tailwind tokens. The brand identity doesn't change with it: the institutional blue stays in the logo and communications.

  • Preference stored per user, applied before first paint
  • On mobile the sidebar becomes a drawer and the kanban becomes tabs by stage
  • The same app runs installed as a PWA and as an Electron desktop app
Interface

05

8 video walkthroughs

Each video shows a complete task, end to end. Click to watch with controls.


06

Key Features

01

9-Stage Kanban Pipeline

Drag-and-drop via @dnd-kit with 9 real sales statuses. Switchable views: kanban, table, and cards. Real-time updates via Socket.IO for the whole team simultaneously.

02

WhatsApp Cloud API

Native WhatsApp Cloud API integration — send and receive messages right in the lead's timeline, without leaving the CRM.

03

Custom Fields

10+ field types (text, number, currency, date, boolean, select, multiselect, URL, email, phone) created by the admin and displayable on the kanban, in the table, or in filters.

04

Reports and Sales Funnel

8+ report endpoints: conversion funnel with bottlenecks (<30%), performance by salesperson, leads by source, by city, stalled leads, and a conversion time series.

05

Sales Goals

Goals per salesperson with 4 types (converted, contacted, proposals, meetings), a configurable period, and progress calculated in real time against the LeadHistory.

06

Electron Desktop App

Installable desktop version for Windows (.exe NSIS) via Electron.js — the same experience as the web app, with native notifications and keyboard shortcuts. Available at trativa.app/download.


07

Product screens

Real screenshots of the product, organized by module. Click any screen to enlarge it.

Twelve funnel indicators, from new lead to converted
Leads by status, by source, and by owner
Received messages, conversions, today's tasks, and stalled leads
9-stage kanban with a count per column
Meeting scheduled, proposal sent, converted, and lost
The same data in a table, with custom field columns
Filters by status, owner, source, city, and custom fields
Search by name, phone, email, or Instagram
Record with data, custom fields, and pending follow-ups
Cloud API conversation with 24h window and read status
Outside the window, sending switches to an approved template
Action history: creation, assignment, and every status change

08

On mobile

The salesperson opens the CRM between visits: on mobile the sidebar becomes a drawer, the kanban becomes tabs by stage, and the WhatsApp conversation stays inside the lead's record. The same app is installed as a PWA.

Home
Menu
Leads
Kanban
Lead record
WhatsApp
Funnel
Goals
Notifications
New lead
Login

09

Technologies

Front-end

React 18ViteTailwind CSSSocket.IO

Back-end

Node.jsExpressMongoDBMongoose

Database

MongoDBMongoose

Deployment

Railway

Integrations

StripeWhatsApp Cloud APIResendSocket.IOElectron.jsSentry

Libraries

@dnd-kit/coreRechartsReact Router 6vite-plugin-pwaFramer MotionPapaparse

10

Design Decisions

A product split into 4 repositories with clear responsibilities: back end (API + business rules), front end (SPA/PWA), landing page (marketing/SEO), and desktop (Electron wrapper). Electron reimplements nothing — it loads the web app, which is already responsive. Custom fields are configured by an admin and propagate to the kanban, table, and filters automatically, with no deploy.

11

Technical Challenges

Custom fields in filters and CSV export: the customFields field is a Map<Mixed> in Mongoose, but it arrived as a plain object from the JSON. The front end had to handle both formats (getCustomValue accepts Map and object). On export, Papaparse receives dynamic columns computed from the organization's active fields — inactive fields don't appear even if the lead has the value stored.


12

Results

  • Working multi-tenant SaaS with 4 Stripe plans (R$49 to R$397) and a 14-day trial
  • Installable Windows desktop app via Electron + PWA for mobile — one product, three surfaces
  • Pipeline with 9 stages, funnel reports, goals per salesperson, and integrated WhatsApp in production

13

Learnings

  • Real multi-tenancy in MongoDB: scopeQuery automatically applies Organization + soft delete on every endpoint, with no risk of data leaking between companies
  • WhatsApp Cloud API: direct integration with Meta's official API for sending and receiving messages in the lead's timeline
  • Flexible custom fields: a CustomField per organization with a key generated as a slug, configurable display on the kanban/table/filters, and storage as Map<Mixed> in Mongoose
  • CSV import/export with custom fields: two steps (preview → confirm) with a 30-minute in-memory session for validation before saving
  • Electron as a secure wrapper: nodeIntegration false, contextIsolation true, sandbox true — JWT and authentication handled by Chromium cookies, zero sensitive code on the client