Most marketing stacks already collect phone numbers. They sit in a Typeform field, a Calendly booking question, a Jotform quote request or a Mailchimp signup form. Very few of those numbers ever get a text. The tools that capture them are built for email or scheduling, so the number stays in a column nobody uses.

This post covers the wiring that turns those numbers into texts: three connector patterns, how to capture consent so the texts hold up, which triggers are worth building, and what they cost. We make Ready, so the API examples use our endpoints. The patterns work with any SMS provider that accepts an HTTP request.

The three connector patterns

Every form-to-SMS setup comes down to one of these three.

1. Native webhook straight to the SMS API

Typeform, Calendly and Jotform can all fire a webhook when someone submits or books. If you have a developer, or a small serverless function, you catch that webhook, pull out the phone number, and call the SMS API. Nothing sits in the middle, so delivery is fast and there's no per-task fee. The downside is that someone has to maintain the code.

2. No-code middleware (Zapier, Make)

Most marketing teams end up here. The trigger is "New Typeform entry" or "Invitee created" in Calendly. The action is a generic HTTP request step, such as Webhooks by Zapier or Make's HTTP module, that posts to the SMS API. You can set it up in an afternoon without a developer. You pay the middleware's task pricing, and you add one more place where things can break silently.

3. CRM in the middle

The form feeds a CRM, and the CRM sends the text. This makes sense once you have more than a couple of triggers. Contact history, opt-outs and replies then live in one place. If that's where you're headed, our guide to CRM SMS integrations for Pipedrive, Salesforce and Airtable covers it. The deepest integration Ready has is GoHighLevel, which uses OAuth and syncs two ways. If your forms already feed GHL, let GHL send the texts.

Here's how the three compare:

PatternSetup timeOngoing costBreaks whenBest for
Native webhook to APIA day of dev workHosting onlyForm fields get renamedTeams with a developer
Zapier / MakeAn afternoonPer-task feesAuth expires, a step errors quietlyOne to five triggers
CRM in the middleDepends on the CRMCRM seat costsSync mapping driftsMany triggers, shared inbox

What the API call looks like

Whichever pattern you use, the final step is one request. Ready's send endpoint looks like this:

curl -X POST https://api.tryready.com/v1/messages \
  -H "X-API-Key: YOUR_KEY" \
  -H "Idempotency-Key: 6f1c2a9e-3b7d-4e21-9a8f-2c5d7e0b1a44" \
  -H "Content-Type: application/json" \
  -d '{"to": "+12125550199", "body": "Thanks for booking with Northside Physio. Reply STOP to opt out.", "consent_attested": true}'

Three details in that request matter for form integrations:

  • Idempotency-Key. Zapier and Make retry failed steps, and webhooks sometimes fire twice. If you send a UUID with each request, generated once per form submission, a retry never sends a second text. Without it, a flaky network gives someone two copies of their booking confirmation.
  • The to field. Forms collect numbers in every format: "(212) 555-0199", "212.555.0199", "+1 212...". The API wants E.164. A bare 10-digit US number is treated as +1. Normalize everything else in a formatter step first. If your form doesn't validate numbers, you can check one with GET /v1/validate/:phone.
  • consent_attested. This flag is your promise that the recipient agreed to receive texts. The next section explains why that promise needs evidence behind it somewhere other than the SMS provider.

Full request details are in the messages API docs and the quickstart. For one notice going to many people, POST /v1/messages/bulk takes up to 100 numbers per call (bulk docs).

Consent capture: the part most setups get wrong

An email opt-in is not an SMS opt-in. A Mailchimp subscriber who handed over a phone number on a signup form has agreed to your newsletter. They have not agreed to texts. TCPA exposure runs roughly $500 to $1,500 per text, so this distinction matters more than anything else in this post.

Build the checkbox properly

On each form (Typeform, Jotform, Mailchimp signup or a Calendly booking question), add a separate SMS consent field:

  1. Unchecked by default. Pre-checked boxes don't count as consent.
  2. Its own field, not bundled. Don't fold it into "I agree to the terms."
  3. Specific wording. Name the business, the type of message, that frequency varies, that message and data rates may apply, and that replying STOP opts out.
  4. Stored as its own value. Make it a Mailchimp tag or merge field, a Typeform hidden variable passed downstream, or a Jotform column. Your trigger should filter on it.

Where the record lives

Be clear about who keeps what. When you send through Ready, we record the sender's attestation for each bulk send and each API send that sets consent_attested: who sent, to how many, and when. That's a useful audit trail. It is not a per-contact consent record. Ready doesn't store the recipient's opt-in time, the checkbox wording, or the page URL. (A contact who signs up on a Ready-hosted opt-in page is the exception: Ready stores that sign-up, with the time, IP address and exact wording, and support@tryready.com can send you a copy.)

That evidence has to come from your form tool or CRM, so keep it there. Typeform, Jotform and Calendly all timestamp submissions. Mailchimp keeps signup source and time. Export it, back it up, and keep a copy of the exact checkbox wording each time you change it.

Compliance stays the sender's responsibility. The tooling reduces risk. It doesn't remove it.

Route opt-outs back

When someone texts STOP, Ready honors it and blocks that number across every campaign. Later sends to it are refused up front and not charged. Your email tool doesn't know any of this. Pull opt-outs with GET /v1/opt-outs on a schedule and update the matching Mailchimp tag. That list holds only this account's opted-out contacts, so check GET /v1/opt-outs/:phone before another tool texts a number. That way a later "send to everyone with SMS consent" segment doesn't include people who already said no.

Trigger ideas worth building

These are ordered roughly by how much value they add relative to setup effort.

Calendly: confirmation and reminder

This is the easiest one to justify. An "invitee created" event fires a confirmation text immediately, plus a reminder the day before the appointment. No-shows are where most booked revenue gets lost, and a text reminder is the standard fix. Our appointment reminder SMS guide covers timing and templates.

One catch: Ready enforces quiet hours based on the recipient's area. A text sent through the API is held only if the recipient's window opens within 6 hours, so a confirmation triggered by a booking at 11 PM is refused, not held, and isn't charged. Delay late-night confirmations until the window opens.

Typeform or Jotform: instant lead follow-up

Someone requests a quote. They get a text within seconds that confirms you received it and says when you'll call. The text buys you time, but the call still closes the deal. If your team calls from the Ready Dialer pad, that's billed at $0.025/min for answered time only. A ring-out costs nothing.

Mailchimp: welcome text for SMS opt-ins

New subscribers who ticked the SMS box get one welcome text with the offer they signed up for. Filter strictly on the consent tag. If no tag is set, don't send.

Jotform: intake and document follow-ups

If a form was started but a required upload is missing, send a text with the link. This works well for clinics, contractors and anyone else who runs paperwork-heavy intake.

Match the trigger to your registration

Confirmations and reminders count as a different 10DLC use case from promotions. If you register as marketing but send mostly reminders, or the other way round, you can end up throttled. Matching your campaign use case to what you actually send explains how to choose.

What it costs: a worked example

Here are the assumptions. A physio clinic gets 400 Calendly bookings a month. Each booking triggers a confirmation and a reminder, both under 160 plain characters, so 1 segment each. About a quarter of patients reply once, with a 1-segment reply. Inbound replies are billed like sent texts.

  • Outbound: 400 × 2 = 800 segments
  • Inbound: 100 segments
  • Total: 900 segments

On Ready's Standard rate of $0.0075/segment plus the $0.0045 carrier fee:

  • 900 × $0.0075 = $6.75, plus 900 × $0.0045 in carrier fees

That is all-in except the compliance surcharge. TCPA/DNC scrubbing and landline validation each add $0.003 per segment when switched on, and both are off by default.

Registration adds a monthly cost: $25/mo for registration and $2 per number. With one number, that's $27/mo.

Now watch the segment count. Suppose the clinic stretches the reminder to 175 characters. Plain text, that becomes 2 segments, because past 160 characters each part holds 153. Add a single emoji and it becomes 3 segments, because unicode parts hold 67 characters. On the reminders alone, that's 400 segments turning into 1,200. Keep templates short and skip the emoji on high-volume triggers.

When you don't need any of this

To be fair to Mailchimp: if your whole list lives there and all you want is the occasional promotional text to subscribers, Mailchimp's own SMS feature keeps everything in one tool. That can be the simpler choice. A separate SMS layer earns its place once texts come from several sources (forms, bookings, a CRM) and you want one inbox, one opt-out list and one registration covering all of them.

Ready's per-segment price isn't the lowest available. Raw carrier APIs and GoHighLevel's LeadConnector charge less per message. What Ready adds is the rest of the stack: self-serve 10DLC registration (most approvals take 2 to 7 days), opt-out handling, quiet hours, scrubbing, and a two-way inbox.

The practical takeaway

Start with one trigger, and make it the Calendly confirmation if you take bookings. Add a separate, unchecked SMS consent box to your forms before you send anything. Store that consent in the form tool, because the SMS provider won't. Send an Idempotency-Key with every request so retries don't double-text. Sync STOP replies back to your email list.

If you want to try the wiring on Ready, sign up and connect one form. To send, you add a card and get a number, which is $2 a month with the first month charged when you get it. Your first 20 one-to-one texts are free, so use them to test before you pay for registration. You can send up to 500 texts a month before registering, and after that registration is required.