▲ Capture a lead. Route it to the right agent. Keep the sales trail. Hold and release commission. Resolve disputes with a record you can replay. Tandem gives your app the workflow primitives; you keep the decisions.
Tandem keeps a clear record in Postgres so your app can show the whole sales journey and your team can trace what happened.
Every important change is a typed event. You can trace the story without losing earlier decisions.
Lead, payout, and activity views build from events. Rebuild them whenever you need to.
Commission amounts use whole cents or sen. Rounding is part of the rule, so the numbers stay clear.
Set a qualification threshold. Choose round robin, least loaded, or manual assignment for each lead.
Hold commissions until they are ready. Run release_due_commissions() on the schedule that suits your app.
Use Supabase, plain Postgres, or your own identity provider. Tandem keeps each workspace separate.
Tandem fits into the routes and database you already use.
// Minimal install: engine + Postgres. Nothing else. import { createTandemPool, applyTandemMigrations, withTandemSession } from 'tandem-crm/db'; import { qualifyLead, defaultTandemConfig } from 'tandem-crm'; const pool = createTandemPool(process.env.DATABASE_URL); await applyTandemMigrations(pool); // Adapters map external payloads into typed events, then write them // inside a transaction scoped to the caller's identity. await withTandemSession(pool, userId, async (client) => { const { status } = qualifyLead({ qualificationMetric: 12 }, defaultTandemConfig); await client.query('insert into tandem.events (...) values (...)', [/* ... */]); }); // release_due_commissions() runs inside Postgres. Wire it to pg_cron // or any scheduler you already have. No separate worker process.
A customer's journey from first lead to a clear, lasting record.
The ground truth beneath the CRM: leads, typed event history, rebuildable state, exact money math, and tenant-safe Postgres access.
Agent onboarding and certification. Teams define the checkpoints; agents complete them; your app decides what certification unlocks.
A full CRM interface for your team: leads, agents, sales activity, commissions, disputes. It mounts into your own Next.js app in one catch-all route.
Lightweight sales activity for a real CRM: calls, emails, visits, confidence, stages, corrections, and retractions without deleting history. Log CHAMP qualification when you want it: challenges, authority, money, prioritization.
Territory-aware recommendations for who should own a lead: round-robin, least-loaded, or manual. Terrain records what is true; Waypoint recommends where to go next.
A safe place to handle commission disputes. It holds a payout while a case is open and records the operator's decision.
It's MIT licensed, so you can self-host it, fork it, swap out the UI, or strip out whatever you don't need.