Communication

Quo SMS

Send transactional SMS to clients via Quo (formerly OpenPhone) — payment receipts, day-of texts.

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:

  1. Settings → API
  2. 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

  1. Settings → Integrations → Quo SMS
  2. Check Enable Quo SMS
  3. Paste your API Key and From Number
  4. Save

4. Wire the inbound webhook (opt-outs + replies)

  1. In RemixCRM, copy the Inbound Webhook URL shown in the Quo SMS section (https://app.remixcrm.com/api/quo/inbound/<your-org-id>)
  2. In Quo, create a Webhook for the message.received event and paste that URL as the endpoint
  3. 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.