A sub-account that serves one city doesn't need to think about sender numbers. One registered number covers everyone. That changes when a client covers Phoenix, Tucson and Las Vegas. A lead in the 702 area code gets a text from a 602 number, and the question of which number sends which text becomes a real setup decision.

Ready gives GoHighLevel users two tags for this: #from:local# and #from:rotate#. They look similar and behave differently. This post covers what each one does, how many numbers to buy for a three-metro sub-account, and what local presence and the numbers cost. It also covers one constraint that doesn't change with any tag: every number still sits on the account's registered 10DLC campaign.

What local presence does

With local presence switched on, Ready sends each text from the account's number closest to the contact's area code. That is the whole mechanism. It picks among numbers you already own. It doesn't create numbers, borrow numbers or route around anything.

The two GHL tags control how that pick happens.

#from:local#: the closest number

#from:local# picks the account's number closest to the contact's area code. If the sub-account owns one 602 number, one 520 number and one 702 number:

  • A contact at 520 gets texted from the 520 number.
  • A contact at 702 gets texted from the 702 number.
  • A contact at 480 (also Phoenix metro) gets texted from the number Ready finds closest, which in this setup is the 602.

This is deterministic. The same contact goes to the same number every time, because the closest number doesn't change unless you add or release numbers.

#from:rotate#: spread new contacts inside the local group

#from:rotate# matters once you own more than one number per area. It spreads new contacts across the numbers inside the local area-code group. A contact who already texts with one of your numbers keeps that number.

Say the sub-account owns two Phoenix numbers. With #from:rotate#, new Phoenix leads are split across both. A lead who replied last week from 602-A stays on 602-A for every later message, so the conversation stays in one thread on their phone and in GHL.

That "keeps the number it already texts with" rule is the part people miss. Rotation doesn't reshuffle your existing contacts every time a workflow fires. It only distributes new ones.

Side by side

#from:local##from:rotate#
Picks fromThe single closest number to the contact's area codeAll numbers in the contact's local area-code group
New contactsAlways the closest numberSpread across the local group
Existing contactsClosest numberKept on the number they already text with
Useful whenOne number per areaTwo or more numbers in at least one area

If you own exactly one number per metro, the two tags behave about the same for new contacts, and #from:local# is the simpler choice. #from:rotate# starts doing something different once a metro has a second number.

Every number stays on the registered 10DLC campaign

Local presence chooses among registered numbers. It doesn't bypass registration, and it isn't a way to spread unregistered traffic across more numbers to avoid filtering.

In practice, each number you buy for the sub-account gets attached to its registered 10DLC campaign. The registration charge at submit is the first month, $25, and the monthly cost is $25 for registration + $2 per number. Most approvals take 2 to 7 days. If you're registering the client fresh, our GoHighLevel 10DLC registration guide covers what gets approved.

There is a second consequence, and it catches agencies out. Adding numbers doesn't add throughput. Carrier limits are set per campaign and per brand, not per number:

  • The per-second rate is set per campaign. A fresh standard campaign with no vetting gets about 1 to 4 segments per second.
  • T-Mobile's daily cap is set per brand by trust score. At the lowest trust score it is about 2,000 messages a day, and the higher tiers run up to about 200,000.

Ten numbers on one campaign share the same limits as one number. If the client's real problem is hitting a daily cap, the answer is the trust score, not more numbers. Our post on whether $79 brand vetting is worth it works through when that fixes the cap and when it doesn't.

For more on how many local numbers can sit on one campaign, see local presence SMS and 10DLC.

How many numbers a three-metro sub-account needs

Here is a worked example. The assumptions are stated, and the business is illustrative.

Assumptions: a home-services client with consented leads in three metros.

  • Phoenix metro: area codes 602, 480, 623. About 55% of contacts.
  • Tucson: 520. About 25% of contacts.
  • Las Vegas: 702, 725. About 20% of contacts.

Option A: one number per metro (3 numbers)

Buy one 602, one 520 and one 702. Use #from:local#.

  • Number cost: 3 × $2 = $6/mo
  • Phoenix leads at 480 or 623 get the 602 number. That is still a Phoenix-metro number, which is usually the point.
  • Las Vegas leads at 725 get the 702 number.

This is the right starting point for most three-metro sub-accounts. It gives every contact a number from their metro, and it is the cheapest setup that does so.

Option B: weighted by volume (5 numbers)

Buy two Phoenix numbers (602 and 480), one 520, and two Las Vegas numbers (702 and 725). Use #from:rotate#.

  • Number cost: 5 × $2 = $10/mo
  • New Phoenix leads are spread across two numbers, and existing ones stay put.
  • Inbound reply load is split, so a single number isn't the only one carrying a busy metro.

The two extra numbers, 2 × $2 = $4/mo, buy an exact area-code match for more contacts, plus distribution of new contacts within a metro. It doesn't buy throughput, as covered above.

Option C: one number per area code (6 numbers)

Buy 602, 480, 623, 520, 702 and 725. Use #from:local#.

  • Number cost: 6 × $2 = $12/mo
  • Every contact gets an exact area-code match.

Whether an exact match beats a same-metro match is a judgment call. Many people in a multi-area-code metro treat any of its codes as local. We don't have a measured reply-rate lift to quote you for local presence in general, or for exact matches over metro matches. The reason teams turn local presence on is that a familiar area code is less likely to be ignored. Test it on the client's own list before you buy six numbers.

Our recommendation is to start with Option A and add a number to whichever metro produces the most replies. Switch to #from:rotate# once a metro has two.

What local presence costs

Local presence has a listed price of $0.0015 for each segment of a delivered text. A 2-segment message counts twice. The numbers are $2/mo each, so a three-metro sub-account with one number per metro is 3 × $2 = $6/mo. Replies count too: inbound replies are billed like a sent text, at the per-segment rate plus the carrier fee, and segment count drives that bill far more than anything else. One emoji in a 140-character text turns 1 segment into 3, so check templates first.

If you rebill clients, decide up front how you will price the sender choice in your per-message price. Our SMS rebilling math guide covers both models.

Setting it up in GoHighLevel

The order matters. Working backward from a failed send wastes a day.

  1. Confirm the registration is approved for the sub-account. Numbers you add later attach to the same campaign.
  2. Buy the numbers for each metro at $2/mo each. Start with one per metro.
  3. Make sure local presence is on for the account. Without it, the tags have nothing to choose with.
  4. Put the tag in the workflow or template where the sender is chosen. Use #from:local# if you have one number per area, and #from:rotate# once any area has two or more.
  5. Send a test to a consented contact in each metro and check which number each one came from in the GHL conversation.

Inbound replies sync back to the GHL conversation through the native OAuth integration, mapped per sub-account. Because #from:rotate# keeps existing contacts on their number, the thread stays continuous. If you're curious why that continuity breaks on webhook-based setups, see what native sync preserves.

For platforms sending through the API rather than GHL, the equivalent is the optional from_strategy field on POST /v1/messages, set to local, even or random. See the messages API docs.

Things local presence doesn't change

  • Quiet hours are based on the recipient's area, not the sending number. This is useful in this example, because Arizona and Nevada don't share the same clock for part of the year. A text sent during the recipient's quiet hours is held and sent later, and charged only when it sends. Campaigns, drip campaigns and automations wait up to 24 hours for the window; a one-to-one or API text is held only if the window opens within 6 hours, otherwise it is refused and must be resent; a one-to-one reply to someone who texted you in the last 24 hours goes out at any hour.
  • Consent is still required. A local number on an unconsented contact is still an unconsented text. Cold contact belongs on the phone and in the mail. SMS goes to leads who opted in or replied, and keeping each contact's opt-in record is the client's job.
  • Opt-outs propagate across the account. A contact who texts STOP to the 520 number can't be messaged from the 602 number either.
  • Content filtering still applies. A registered number in the right area code can still be filtered for its content.

When to skip it

If 90% of a client's contacts sit in one area code, local presence changes the sender for only 10% of people. One number and no tag is a fine answer. Turn it on when the contact base is genuinely split across metros, which is the situation the feature was built for.

The practical takeaway

For a three-metro sub-account, start with one registered number per metro (3 × $2 = $6/mo), use #from:local#, and check the listed price of local presence ($0.0015 for each segment of a delivered text) before you turn it on. Add a second number to your busiest metro when its volume justifies it, then switch that sub-account to #from:rotate# so new contacts spread out and existing ones stay in their threads. Don't buy numbers expecting more throughput, because the limits are set per campaign and per brand.

Rates are on the pricing page, and the broader overview is in local presence texting. When you're ready to try it on one sub-account, you can sign up here.

Frequently asked questions

Does adding more phone numbers increase SMS throughput in GoHighLevel?

No, adding numbers doesn't add throughput. Carrier limits are set per campaign and per brand, not per number. The per-second rate is set per campaign, and a fresh standard campaign with no vetting gets about 1 to 4 segments per second. T-Mobile's daily cap is set per brand by trust score, starting around 2,000 messages a day at the lowest score. Ten numbers on one campaign share the same limits as one number, so a daily cap problem gets fixed through the trust score.

What is the listed price of local presence texting?

Local presence has a listed price of $0.0015 for each segment of a delivered text. Texts that don't deliver don't count, and opt-outs, numbers on your Ban list and known landlines are refused up front.

Does #from:rotate# move existing contacts to a different number?

No, #from:rotate# only spreads new contacts across the numbers in the local area-code group. A contact who already texts with one of your numbers keeps that number for every later message. That keeps the conversation in one thread on their phone and in GoHighLevel. Rotation only behaves differently from #from:local# once a metro has two or more numbers, so with one number per metro the simpler #from:local# tag works fine.

Do SMS quiet hours follow the sending number or the recipient's location?

Quiet hours are based on the recipient's area, not the number that sends the text. That matters for a sub-account covering Arizona and Nevada, because the two states don't share the same clock for part of the year. A text sent during the recipient's quiet hours is held and sent later, and it's charged only when it sends. Local presence doesn't change consent requirements either, and opt-outs still propagate across every number on the account. Campaigns, drip campaigns and automations wait up to 24 hours for the window; a one-to-one or API text is held only if the window opens within 6 hours, otherwise it is refused and must be resent; a one-to-one reply to someone who texted you in the last 24 hours goes out at any hour.