Liftify
Centralized Messaging Inbox
A real-time, centralized messaging inbox built directly into Liftify's client portal — giving every client team instant visibility into customer SMS replies and the ability to respond from the same number that sent the original message.
Platform Overview

Real-time messaging inbox with conversation list, threaded view, and contact sidebar

Ticket management system with filtering, assignment, and status tracking

Liftify's reputation management platform homepage
The Challenge
Liftify's clients send thousands of SMS messages to customers on behalf of service businesses — requesting reviews, sending surveys, and driving engagement. But when customers replied, they hit a dead end: an automated response saying “this number is not being monitored for replies.”
Those replies weren't junk. They contained legitimate service issues, support requests, complaints, and opt-out requests. Clients had zero visibility into these conversations, meaning customer concerns went unanswered, brand trust eroded, and compliance risks grew silently.
Key Problems to Solve:
- Dead-End Replies: Customer responses to SMS campaigns received an automated “not monitored” message with no path to resolution
- Zero Visibility: Clients had no way to see what their customers were saying back
- Unanswered Concerns: Service complaints, support questions, and opt-out requests went completely ignored
- Compliance Risk: Opt-out requests buried in unmonitored replies created growing regulatory exposure
- Eroding Trust: Customers felt their voices didn't matter when replies disappeared into a void
- Multi-Tenant Complexity: Solution needed to work across thousands of client accounts, locations, and sending numbers
Our Solution
We built a centralized, real-time messaging inbox directly into Liftify's client portal — giving every client team instant visibility into customer replies and the ability to respond from the same number that sent the original message. The inbox was modeled after tools like Intercom, but purpose-built for Liftify's multi-tenant, multi-location business model.
The entire system runs on server-rendered HTML with Turbo Frames and Turbo Streams — no JavaScript framework, no client-side state management, no API layer to maintain. Real-time updates arrive as HTML fragments over WebSockets, keeping the architecture lean and performant.
Key Features Built:
Real-Time Message Feed
Inbound SMS replies appear instantly via WebSocket broadcasts with contact name, message preview, account, location, and assignment status.
Threaded Conversations
Full message history grouped by sender and time, with a companion sidebar showing customer details, review history, and campaign activity.
Direct SMS Reply
Compose and send replies using the original sending number with merge tag support, character counting for Twilio's 1,600-char limit, and keyboard shortcuts.
Conversation Lifecycle
Mark conversations as closed, reopen them, flag as unread, or assign to team members. Inbound messages automatically reopen closed conversations.
10-Dimension Filtering
Filter by account, location, assigned user, message source, campaign name/type, time period, custom fields, conversation status, and free-text search.
Saved Filter Configurations
Persist filter setups across sessions with granular sharing controls — private, shared with specific users, or shared with specific locations.
Contact Unsubscribe Workflow
Agents can unsubscribe customers directly from the conversation with confirmation safeguards, system message logging, and visual indicators.
SMS Ingestion Pipeline
Webhook processing for Twilio's Conversations API and direct SMS with phone normalization, customer matching, and duplicate prevention.
Technical Highlights:
| Metric | Detail |
|---|---|
| Database tables created | 6 (plus join tables and indexes) |
| Models | 5, with AASM state machines for conversation and message lifecycles |
| Service objects | 7 core + 3 shared, following single-responsibility principles |
| Domain events | 5, integrated with analytics pipeline for data warehouse reporting |
| ViewComponents | 5 reusable components |
| View partials | 27 across inbox and filter management |
| Stimulus controllers | 9 for thin client-side behavior |
| Filter dimensions | 10, with saved filter persistence and 30-second cached counts |
Architecture Decisions That Mattered:
- HTML-Over-the-Wire: The entire inbox runs on server-rendered HTML with Turbo Frames and Turbo Streams. No JavaScript framework, no client-side state management, no API layer to maintain. Real-time updates arrive as HTML fragments over WebSockets.
- Multi-Channel Foundation: While SMS is the launch channel, the data model and UI were designed for email, WhatsApp, and webchat from day one. Channel-agnostic abstractions mean adding a new channel doesn't require restructuring.
- Event-Driven Analytics: Every conversation action publishes domain events that flow through a buffered pipeline to the data warehouse, enabling reporting on response times, assignment patterns, and engagement metrics.
- Multi-Tenant by Design: Every query is scoped to the current account, authorization is enforced through Pundit policies with granular permissions, and saved filters respect organizational boundaries.
Results & Impact
Clients went from having zero visibility into customer replies to a fully managed communication channel. Customer concerns that previously went unanswered — service complaints, opt-out requests, support questions — now have a clear path to resolution.
Key Outcomes:
Ready to Build Your Messaging Platform?
Let's create a communication solution that turns customer replies into opportunities.