How we collapsed the SaaS stack by embedding a full CRM into our Node.js and Firestore scheduling engine with zero-touch lifecycle automation.
TL;DR
We built Bright Canoe (powered by the Scheduling Studio engine), an AI-powered scheduling and operations platform for studios, clinics, coaches, and mobile professionals.
One of our foundational architectural decisions was to ship a full CRM (unlimited contacts, lifecycle automation, AI win-back, e-sign doc vault, and meeting transcription) as a free, built-in layer on every plan, including the $0 tier.
This post explains why we made that decision and how the data flows under the hood.
The Problem We Kept Hearing
Every independent studio owner and service operator we interviewed was running 4 to 6 separate SaaS tools to manage a single customer relationship:
Booking Tool -> CRM -> Invoicing Tool -> E-Sign Tool -> Email Tool -> Spreadsheet
Each connection was either manual copy-paste or a brittle Zapier webhook chain. Customer data lived in isolated silos, and the "client record" was a fiction assembled across half a dozen browser tabs.
We decided the solution wasn't another integration. It was collapsing the stack.
The Firestore Data Model
Everything lives in a single Firebase project. The primary collections powering the CRM layer:
-
users/{uid}/clients: CRM contacts, lifecycle stage (lead,client,repeat), tags, and private host notes. -
bookings: Appointments linked directly to a client record. -
esign_requests: Signature workflows tied to a client and booking. -
invoices: Stripe invoices and payment receipts. -
users/{uid}/agent_audit_log: AI Agent decisions (Guardian, Negotiator, Scout) logged per client.
The critical architectural choice: bookings and users/{uid}/clients share an atomic boundary. There is no background sync job. A booking is a CRM write.
During the booking flow, bookingController.js executes an atomic Firestore transaction that creates or updates the client document in the exact same operation that confirms the appointment.
Lifecycle Automation (Zero Manual Steps)
We implemented an event-driven three-stage pipeline:
booking.created -> if client.stage === null -> set stage = "lead"
booking.completed -> if client.stage === "lead" -> set stage = "client"
booking.completed -> if client.bookings_completed >= 2 -> set stage = "repeat"
Full chain of custody, zero tab-switching, and no separate third-party e-signature subscription required.
Why Free?
The CRM is not a loss leader; it is our primary retention layer. A scheduling tool that does not remember your client between sessions is just a calendar with a checkout form.
By making the CRM free and unlimited, we provide massive utility while monetizing through advanced AI voice and team capabilities:
- Free ($0/mo): Core booking, Google Calendar 2-way sync, and full Client 360 CRM with unlimited contacts.
- Starter ($24.99/mo or $20/mo annual): SMS reminders, custom branding, and modular add-on support.
- All-In-One Studio Suite ($59/mo or $50/mo annual): 24/7 AI Voice Receptionist with dedicated phone number, unlimited legally-binding e-signatures, and win-back autopilot.
- Premium Scale ($99/mo or $80/mo annual): Outbound sales dialer, Scribe meeting bot (25 hrs/mo), and multi-provider team scheduling. We charge for heavy compute and telephony (AI Voice Receptionist, outbound dialer, custom contracts, multi-provider operations), not for remembering a customer's name.
Data Migration and Sovereignty
- 100% Free CSV Import: Anyone can import their customer database from Mindbody, Acuity, Calendly, or Google Sheets on day one with zero lock-in.
- Full CSV Export: Active plans can export full CSV backups of client databases and financial transaction ledgers at any time.
What's Next on the Roadmap
-
Webhook Parity: Adding
client.stage_changedandclient.winback_sentwebhooks to our REST API (/openapi.yaml). - Custom Pipeline Stages: Allowing multi-location clinics and studios to define custom deal pipelines beyond Lead, Client, and Repeat.
- Automated Scout Dossiers: Attaching pre-meeting research dossiers (company intel, attendee bios, Gmail history) directly into client records prior to calls.
Try It Out
- Live Platform: brightcanoe.com formerly scheduling.studio
-
API Documentation:
/openapi.yaml - Directory & Semantic Search: brightcanoe.com/directory If you are building SaaS for appointment-based businesses or have tackled the challenge of unifying scheduling with CRM data models, I'd love to hear your insights in the comments.
Top comments (0)