Skip to content
lydia.hillary
  • Home page
  • Work page
  • About page
  • Contact page
  • FHIR Form Engine project
  • Smsify project

Smsify

SMS outreach campaigns with automatic reply classification.

date
status
live
tech
  • Vue
  • TypeScript
  • Node
  • Express
  • PostgreSQL
  • Twilio
  • OpenAI
  • JWT

A full-stack tool for sending SMS outreach campaigns and handling the replies. You connect your own Twilio account, add contacts, send a campaign, and read the responses. Inbound replies come back through a Twilio webhook, and an OpenAI classifier sorts each one into a category so you can triage responses without reading every message by hand.

I built it a couple of years ago and recently restored the live deployment on both ends, cleaned it up, and updated it. It is a working application, not a finished product: there is no payment or subscription billing, and it runs on a bring-your-own-Twilio model, so using it means connecting a Twilio account of your own.

How it works

The backend is a versioned REST API (Node, Express, TypeScript) over a PostgreSQL database with migrations, with JWT authentication, Swagger documentation, and a test suite. It sends messages through Twilio and receives replies through a Twilio webhook. Each inbound reply is passed to OpenAI, which returns a category for it, and that category is stored alongside the message.

The frontend is a Vue and TypeScript SPA that talks to the API through a client generated from the API’s OpenAPI spec, so the request and response types stay in sync with the backend contract.

A few decisions

Twilio Connect, so users bill their own account. Rather than route every user’s messages through one central Twilio account, each user connects their own. Messages send and bill through their account, not mine. It keeps the cost model sane and avoids holding other people’s sending under my credentials.

Reply classification instead of a raw inbox. Bulk outreach produces a pile of replies, most of which you only need to skim. Running each reply through a classifier turns the inbox into something you can sort and act on, which is the part that makes the results usable.

Contract-first frontend. The Vue client is generated from the API’s OpenAPI spec, so the two sides do not drift. Changing the API contract regenerates the client types.

Scope

This is a real, deployed, usable app, but it is not a monetized SaaS. There is no payment integration and no subscription tiers beyond scaffolding, and it assumes you bring your own Twilio account. The repositories are split: the API and the frontend.