What you get
Send transactional SMS to clients from your Quo number. Quo — formerly known as OpenPhone — exposes a simple REST API, and RemixCRM calls it directly with no client SDK and no extra dependencies.
Out of the box, Quo fires for:
- Payment receipts — when you record a payment on an event, the client's
primary phone gets a confirmation:
Thanks, [name]! We received your $250.00 deposit for your event on 2026-08-15. — [your business]
You can also send ad-hoc texts from the event page (📱 SMS tab) once Quo is enabled. Future versions will add reminders, day-of texts, and contract-sent notifications. The integration is org-scoped, so each org uses its own Quo workspace and number.
Inbound replies and STOP/START opt-outs are handled through a webhook (see Setup step 4). STOP-list suppression is honored on every send for TCPA compliance.
Prerequisites
- A Quo workspace with API access (Settings → API)
- A Quo phone number with SMS enabled
- US A2P / 10DLC registration completed if you're texting US numbers (Quo will reject unregistered US traffic)
Setup
1. Create an API key
In Quo:
- Settings → API
- Create a new API key and copy it (you'll paste it into RemixCRM)
Security: the API key grants access to send messages from your workspace. Store it only in RemixCRM's settings — it's kept server-side and never exposed to the browser.
2. Note your Quo number
Use your Quo phone number in E.164 format (e.g. +15551234567). You can also
use a Quo phone number ID (PN…) if you prefer.
3. Configure in RemixCRM
- Settings → Integrations → Quo SMS
- Check Enable Quo SMS
- Paste your API Key and From Number
- Save
4. Wire the inbound webhook (opt-outs + replies)
- In RemixCRM, copy the Inbound Webhook URL shown in the Quo SMS section
(
https://app.remixcrm.com/api/quo/inbound/<your-org-id>) - In Quo, create a Webhook for the message.received event and paste that URL as the endpoint
- Quo shows a signing secret starting with
whsec_— copy it into the Webhook Signing Secret field in RemixCRM and Save
Inbound STOP / UNSUBSCRIBE / CANCEL / END / QUIT adds an SMS suppression; START / UNSTOP / YES removes it. Other inbound messages are logged against the matching client's active event when we can identify the sender.
5. Test
The easiest test: record a small payment on a test event whose client has a phone on file. The client should receive the receipt SMS within a few seconds.
Or test directly with curl using your API key:
curl -X POST "https://api.quo.com/v1/messages" \
-H "Authorization: $QUO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"content":"Test from RemixCRM","from":"+15551234567","to":["+1YOURNUMBER"]}'
How RemixCRM uses Quo
| Event | When | What's sent |
|---|---|---|
| Payment recorded on event | Admin adds a payment | Receipt SMS to client's primary phone |
| Manual SMS | Admin sends from the event's SMS tab | Free-form message |
| Portal share (SMS) | Admin shares a client portal by text | Portal link |
All automatic sends are best-effort — if Quo isn't configured, or the client has no phone on file, or the send fails, the original action (recording the payment) still succeeds. The SMS failure is logged but doesn't surface to the user.
To find the client phone, RemixCRM uses the primary phone from client_phones
(falls back to the first phone if none is marked primary).
Costs
Pricing depends on your Quo plan. API access and outbound SMS may require a specific plan tier, and US traffic requires completed A2P/10DLC registration. Check your Quo billing page for current per-message and number costs.
Programmatic SMS
lib/sms/quo.ts exposes a single function:
import { sendSms } from '@/lib/sms/quo'
const result = await sendSms(orgId, '+15551234567', 'Your event is tomorrow!')
// → { ok: true, id: 'AC…' } or { ok: false, error: '…', disabled?: true }
Use this from any server action or cron job. It silently returns
{ ok: false, disabled: true } if Quo isn't configured for the org — no need to
gate calls. It also returns { ok: false, suppressed: true } if the recipient
has opted out.
Troubleshooting
"Quo not configured"
Settings → Integrations → Quo SMS — make sure the Enable checkbox is checked AND both the API Key and From Number are filled.
HTTP 401 Unauthorized
The API key is wrong or was revoked. Regenerate it in Quo (Settings → API) and paste the new one.
HTTP 400 A2P Registration Not Approved
You're trying to text US numbers before completing US A2P / 10DLC registration. Finish registration in Quo, then retry.
Invalid 'to' phone number
The recipient phone isn't in E.164 format. RemixCRM passes through whatever is
stored on the client record. Edit the client's phone to include +1 (or the
appropriate country code).
Inbound STOP/START or replies aren't recording
The webhook signing secret is missing or wrong. Re-copy the whsec_ secret from
your Quo webhook into Settings → Integrations → Quo SMS, and confirm the webhook
endpoint URL matches the one shown there.