Two weeks before our launch, we sat down and listed every feature SalesSheet needed to be a complete, competitive CRM. Not a "MVP" with asterisks and disclaimers. A product that someone could adopt as their primary CRM on day one and not hit a wall. The list had 15 features. We shipped all 15. This post explains the philosophy behind that sprint, breaks down each feature, and shares what we learned about development velocity when you refuse to compromise.
The conventional startup advice is to launch with the minimum viable product. Ship the smallest thing that delivers value, then iterate based on feedback. We understand the logic, and it works for consumer apps where you are testing product-market fit. But a CRM is different. If your CRM does not have email integration, your users will not give feedback saying "please add email" - they will leave and go back to HubSpot. If there is no mobile app, they will not adapt their workflow. They will just use the competitor that has one.
We decided the minimum for a viable CRM was all 15 features on our list. Not 10. Not "most of them." All of them. The constraint was not what to build - it was how to build 15 features in two weeks with a single developer. That constraint forced every other decision: technology choices, architecture patterns, scope for each feature, and how we worked.
The question was never "which features can we cut?" It was "how do we build all of them fast enough?" That reframing changed everything.
Here is every feature we shipped during the sprint, in roughly the order they were built.
1. AI Chat Assistant - The conversational interface that lets users interact with their CRM through natural language. Ask questions about your pipeline, create contacts, update deals, and get recommendations. Built on OpenAI's API with a system prompt engineered specifically for CRM operations. This was the first feature built because it defined the architecture everything else would plug into.
2. Contacts Grid - The core data view. A sortable, filterable, searchable grid of all contacts with inline editing, bulk actions, and real-time updates via Supabase subscriptions. We modeled the UX after the best spreadsheet interfaces (Airtable, Notion) because salespeople live in grids.
3. Pipeline Kanban - Drag-and-drop deal management organized by stages. Each card shows the deal value, contact, expected close date, and probability. Dragging a card between columns updates the deal stage and logs the change to the activity timeline. We added mobile gesture support so pipeline management works on phones too.
4. Sincronización de Email - Bi-directional Gmail integration that pulls email threads into contact timelines and lets users send email from within SalesSheet. This was one of the hardest features to build correctly. We went through a complete rebuild with 90 tests to get the sync reliability right.
5. Llamadas Integradas - WebRTC-powered phone calls through the browser via our VoIP infrastructure. One-click calling from any contact record, in-call note-taking, and automatic call logging. We documented the full architecture in our phone dialer deep-dive. The telephony provider migration happened mid-sprint and cut our calling costs significantly.
6. Analytics Dashboard - Four real-time charts showing pipeline value by stage, deal velocity, win/loss rates, and activity trends. Built with Recharts, powered by live Supabase queries. We wrote about the design decisions behind these four charts.
7. Integración con Slack - Send CRM updates to Slack channels, create contacts from Slack messages, and get AI summaries of deal activity posted to team channels. The channel picker and one-click AI actions made this feel native rather than bolted on.
8. CRM Móvil - A fully responsive mobile interface with Linear and Attio-inspired design, a T9-style keypad for calling, contact detail views optimized for thumb navigation, and offline-capable contact access. We treated mobile as a first-class experience, not a responsive afterthought.
9. Voice DNA - An AI feature that learns each user's writing style from their sent emails and generates drafts that sound like them. This required building a style analysis pipeline that extracts tone, vocabulary, sentence structure, and greeting patterns from a corpus of the user's actual writing.
10. Saved Views - Custom filtered views of the contacts grid and pipeline that persist across sessions. Users create views like "My Active Deals Over $10K" or "Contacts Not Contacted in 30 Days" and switch between them with one click. Saved views are per-user but can be shared across an organization.
11. Voice Input - Microphone button in the AI chat, note composer, and email body that records speech and transcribes it via OpenAI Whisper. We replaced the Web Speech API after it proved unreliable across browsers.
12. Organization Sharing - Multi-user support with invitation flows, role-based access, and shared data scoped by organization. Row-level security in Supabase ensures that users can only see data belonging to their organization, and we tested every permission boundary extensively.
13. Calendar Sync - Google Calendar integration that surfaces upcoming meetings in the contact timeline and suggests follow-up actions based on scheduled events. If you have a meeting with a contact tomorrow, SalesSheet surfaces their recent activity so you can prepare.
14. Enriquecimiento de Contactos - Automatic profile enrichment that fills in company, title, LinkedIn URL, location, and profile photo from a name and email address. Built on a combination of Clearbit and custom scraping logic, documented in our enrichment deep-dive.
15. Security Hardening - Content Security Policy headers, server-side AI security, rate limiting on all API routes, input sanitization, and a comprehensive production hardening checklist. Security was not a feature we would compromise on, even under time pressure.
Shipping 15 features in two weeks as a solo developer would not have been possible without Claude Code. This was not a case of AI generating boilerplate that we then rewrote - Claude Code was a genuine pair programmer that contributed meaningful architecture decisions, caught bugs before they shipped, and generated production-quality code including comprehensive test coverage.
The workflow was straightforward: describe the feature, discuss the implementation approach, let Claude generate the initial code, review and refine, write tests (also AI-assisted, as we described in our testing post), and ship. For well-scoped features, this workflow produced a complete, tested feature in 2 to 4 hours. For more complex features like email sync and calling, it took 1 to 2 days including iteration.
The velocity we achieved with Claude Code was not just about typing speed. It was about reducing the time spent on implementation details so we could focus on product decisions. Instead of spending an hour writing the telephony webhook handler, we spent that hour deciding what information the call summary should extract. The AI handled the mechanical work; we focused on the product thinking.
Several early architecture choices compounded throughout the sprint. Choosing Supabase as our backend gave us a PostgreSQL database, authentication, real-time subscriptions, edge functions, and file storage from a single platform. We never had to stitch together separate services for auth, database, and serverless functions. Choosing React with Vite gave us fast hot-reload during development, which matters enormously when you are iterating on 15 features simultaneously.
The AI-native architecture we adopted early - where the AI chat interface can trigger any action in the system - meant that new features automatically became accessible through chat. When we built the pipeline kanban, the AI could immediately help users manage deals through conversation. When we added calling, the AI could initiate calls. This composability meant each new feature amplified the value of every existing feature.
Row-level security in Supabase deserves special mention. By defining access policies at the database level rather than in application code, we got multi-tenant data isolation for free. Every new table we created automatically inherited the organization-scoped access policies. This saved us from writing authorization checks in every API route and eliminated an entire category of security bugs.
When we say zero compromises, we do not mean every feature is perfect. We mean every feature is complete enough to be useful, stable enough to be relied on, and tested enough to not break other features. The email sync works - it pulls threads, sends emails, and handles edge cases. The calling works - it connects calls, records them, and generates summaries. The analytics work - they show real data in real time.
Zero compromises means we did not ship a calling feature that only works on desktop and add mobile "later." We did not ship email sync without send capability and call it "phase one." We did not ship the analytics dashboard with placeholder charts. Every feature on the list shipped in a state where a user could adopt it immediately without hitting a "coming soon" wall.
The lesson from this sprint is not "just work harder." It is that the right tools, the right architecture, and the right development methodology can dramatically expand what a single developer can accomplish. We planned 15 features and shipped 15 features because we chose technologies that compose well, we used AI to handle implementation velocity, and we refused to accept that scope reduction was the only path to launching on time. Sometimes the answer is not to do less. It is to find a way to do more.
Sin tarjeta de crédito. Comienza a vender de forma más inteligente hoy.
Comenzar Prueba Gratis