ADR-0012 — Twilio for SMS
- Status: Accepted
- Date: 2026-04-28
- Decision-makers: Tom Anderson
Context
The Helm Service Tickets slice (and later Marketing slice) needs outbound SMS for:
- "Your bike is ready" notifications
- Appointment reminders
- Trade-in offers
- Marketing opt-in confirmations
Two-way conversational SMS is on the roadmap; v0.1 is one-way only.
Alternatives:
- Twilio — incumbent, full Canadian number support, mature API, A2P 10DLC handled, sub-accounts for multi-tenant cost attribution
- Bandwidth.com — cheaper US rates but limited Canadian-number support
- MessageBird — strong European presence, weaker Canadian pricing
- Plivo — competitive pricing, smaller ecosystem
- Per-shop Twilio accounts — each shop has their own Twilio account; eliminates Kvick from the middle but creates ops burden
Constraints:
- Canadian phone numbers (most shops are in BC; numbers should look local to the customer)
- Per-shop cost attribution (each shop pays for what they send)
- Low ops burden on Kvick
Decision
Use Twilio with one Kvick-owned account and per-shop sub-accounts:
- One master Twilio account (Kvick's)
- Each shop's deployment uses a Twilio sub-account (created at onboarding)
- Each shop owns one or more Twilio phone numbers attached to their sub-account
- Helm sends SMS via
fetch()tohttps://api.twilio.com/2010-04-01/Accounts/{sub}/Messages.jsonusing the sub-account's auth - Twilio's monthly invoice goes to Kvick; we re-bill each shop based on their sub-account's usage
- A2P 10DLC registration (US numbers) handled at the master-account level; Canadian numbers don't require it
Two-way SMS, when added, will use Twilio's webhooks (POST /api/webhooks/twilio/{shop}) and the same sub-account model.
Consequences
Positive:
- Twilio's reliability and Canadian number availability beats alternatives
- Sub-accounts give us clean per-shop cost attribution without N separate vendor relationships
- A2P 10DLC and compliance is centralized at the master account level
- Mature webhook + idempotency story
- Twilio's deliverability across carriers is the best in class
Negative:
- Twilio rates are higher than some competitors
- Kvick fronts the SMS spend and re-bills shops — small cash flow friction
- A vendor outage at Twilio affects every shop's SMS — but we deliberately fail-quietly (fail-quietly-recover-loudly) so the rest of the flow continues
Mitigations:
- The shop owner's monthly bill from Helm includes SMS pass-through with a small markup; cash flow nets out
- The SMS adapter (
src/lib/twilio.js) is the swap point if we ever consolidate to a cheaper vendor
Notes
For transactional email (receipts, owner digests), see future ADR on email provider — current preference Resend or Postmark; not chosen yet.
See also
- Slice 10 — Marketing
- AI integration — separate concern
- Tech stack summary