> ## Documentation Index
> Fetch the complete documentation index at: https://docs.orbit.devotel.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Grow an SMS list: opt-in capture, 10DLC, first campaign

> Sequence the SMS list-growth funnel as one job — capture opt-ins on a public form, register the 10DLC brand and campaign, import subscribers, launch a compliant first campaign, and keep the list clean.

# Grow an SMS list

US SMS marketing is one job with three rungs: capture opt-ins, register the brand and campaign for 10DLC, and grow subscribers to a first compliant send. The platform pages cover each rung separately — this guide sequences them into the funnel a first-time marketer runs, in order.

## 1. The funnel picture

Every rung feeds the next. A capture form with no 10DLC campaign behind it collects subscribers you cannot text; a 10DLC campaign with no opt-in funnel behind it has no audience to address.

```
 Capture opt-in          Register sender           Grow the list             First campaign
 ──────────────          ───────────────           ───────────────            ──────────────
 web form / QR /      →  brand + campaign      →   imports merge all    →  blast to the list,
 SMS keyword +             vetting (10DLC)        sources into one       suppression-safe
 consent text                                  →  Orbit list
```

The first-run numbers move in the direction shown: capture makes registration worth doing, registration makes capture legal, and growth makes the first campaign measurable.

## 2. The building blocks

One line each; the rest of this page sequences them.

* [Public consent form](/guides/public-consent-form) — Orbit-hosted opt-in/opt-out page that writes to the same consent records carrier-side STOP / START keywords touch.
* [Landing pages](/guides/landing-pages) — no-code mobile page or link-in-bio you put the form (or QR widget) on.
* [10DLC registration](/guides/10dlc-registration) — register the brand and its campaign(s) so US carriers accept A2P traffic on your long code.
* [10DLC marketing baseline](/guides/10dlc-marketing-baseline) — the daily-ops checklist (lane split, quiet hours, suppression gates) you run per sender once registered.
* [Opt-out lists](/guides/opt-out-lists) — per-brand STOP / HELP / START keyword aliases and branded auto-reply copy attached to your messaging service.
* [Import contacts](/guides/import-contacts) — dry-run, run, and roll back CSV imports so offline-subscribed contacts land on the same list the webform feeds.

## 3. Design the capture form

Collect the minimum a compliant marketing send needs: phone number, an explicit opt-in checkbox, and (optionally) first name for personalization.

US carriers expect the consent disclosure verbatim at signup — post it next to the checkbox, not behind a link: "\[Brand]: by checking this box you agree to receive recurring marketing SMS messages. Message and data rates may apply. Reply STOP to opt out, HELP for help. Consent is not a condition of purchase."

Decide the double-opt-in question before you wire anything. Single opt-in (form submit = on the list) is what most marketing lists use; double opt-in adds a confirm-by-reply step, which costs conversion but hardens the consent evidence. If you choose it, run the confirmation through Orbit's [Verify OTP flow](/guides/verify-in-30-min) — send a code on form submit, add the contact only when the recipient replies or confirms it.

## 4. Wire the form

The Orbit-hosted [public consent form](/guides/public-consent-form) is the fastest rung: enable it under **Settings → Compliance → Public consent form**, brand it, and point web traffic or a QR code at the hosted URL. Submissions land as consent records the send gate honors.

If your own marketing site hosts the form instead, POST each signup to the contacts API with the list your campaigns will read:

<Tabs>
  <Tab title="Create a contact on a list">
    ```bash theme={null}
    curl -X POST https://api.orbit.devotel.io/api/v1/contacts \
      -H "X-API-Key: $ORBIT_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{
        "phone_number": "+14155552671",
        "first_name": "Sam",
        "listId": "list_webform_optins",
        "source": "website_signup"
      }'
    ```
  </Tab>

  <Tab title="Opt-out webhook subscription">
    ```bash theme={null}
    curl -X POST https://api.orbit.devotel.io/api/v1/webhooks \
      -H "X-API-Key: $ORBIT_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{
        "url": "https://yourapp.com/webhooks/orbit-optouts",
        "events": ["contact.opted_out", "contact.opted_in"]
      }'
    ```
  </Tab>
</Tabs>

Passing `listId` on signup keeps every capture source (web form, QR widget, paper-form transcription) writing into one marketing list, so step 6's import merges against the same destination. For double opt-in, POST the contact only after the [Verify](/guides/verify-in-30-min) check passes.

## 5. Register the 10DLC campaign

Work the three registration steps once, in this order, and every later send inherits the result:

1. **Brand** — register the business entity (legal name, EIN, address) through the [10DLC registration guide](/guides/10dlc-registration); the brand score sets your throughput ceiling.
2. **Campaign** — declare the use case (marketing), message samples that include opt-out instructions, and the signup-flow description — carriers vet the funnel this page builds, so describe the step-3 form honestly.
3. **Vetting** — complete any carrier-requested re-submission per the [10DLC rejections and re-vet guide](/guides/10dlc-rejections-and-revet) before you import at scale.

Until both steps read approved, keep capture open but hold sends — the funnel tolerates a pending campaign at step 4 but not at step 7.

## 6. Sync imported and webform subscribers

Offline sources (POS signups, paper forms, an old platform's export) land through one import job, not one-off API calls. Follow the [import guide](/guides/import-contacts): dry-run the CSV, run the async job with your chosen merge strategy, poll to completion, then roll back within the 24-hour window if the dry-run mis-mapped a column.

Map the CSV onto the same `listId` your webform feeds (step 4), so the whole funnel — web, QR, offline — reports to one list and one audience.

## 7. Launch the first campaign

With the list populated and the campaign approved, run steps 4–6 of the [end-to-end campaign guide](/guides/campaign-end-to-end): preview the personalization, run the dry-run, launch the blast. That guide's prerequisites (sender identity, sanctioned audience) are exactly what this funnel built.

The dry-run nets your list against suppression and per-channel opt-outs before launch — check `audience.deliverable`, not the gross count, and keep the template's opt-out instruction ("Reply STOP to opt out") in the body exactly once.

## 8. Housekeeping

Suppression and opt-outs are webhook-driven so re-permission reminders and CRM sync stay compliant. Subscribe to `contact.opted_out` and `contact.opted_in` (step 4's second tab), and treat `contact.opted_out` as terminal for that channel in your CRM. Carrier-side STOP / START keywords, the hosted consent form, and the import path all converge on the same consent records, so any of them can close a subscription — and your CRM hears about it from the same event stream.

If you send under a second brand or language, attach a [custom opt-out list](/guides/opt-out-lists) to the messaging service before the first campaign, not after the first unsubscribe. The [10DLC marketing baseline](/guides/10dlc-marketing-baseline) checklist keeps the daily-ops gates (lane split, quiet hours, suppression) running per sender as the list grows.

## 9. Worked example: 500/month web + QR funnel

A retailer runs this funnel with web signups and a QR widget at checkout, growing about 500 subscribers a month.

1. **Capture** — the public consent form (step 3's disclosure text verbatim) linked from the website footer and printed as an in-store QR code.
2. **Register** — brand and marketing campaign submitted (step 5); vetting completes while capture keeps collecting.
3. **Wire** — web POSTs carry `list_webform_optins` as `listId`; the QR widget points at the hosted form; single opt-in chosen.
4. **Sync** — a one-time legacy-CRM CSV import merges \~4,000 historical subscribers onto the same list.
5. **Launch** — dry-run shows 4,400 deliverable of 4,500 gross after suppression; blast launches at 50 msg/s with a holdout so the lift number is real.
6. **Housekeeping** — opt-out webhook feeds the CRM; weekly growth continues to use the same listId, so every campaign reads one audience.

From baseline 10DLC vet to a live SMS blast is the same six steps at any volume; the numbers above just put one month on the funnel.
