Noli over SMS.
SMS is the channel that reaches everyone - no app, no install, no opt-in to a platform. Noli uses it for verification codes, automation steps and marketing campaigns, and every marketing message carries its own unsubscribe link.
Where SMS is used
| Use | What it looks like | Unsubscribe link |
|---|---|---|
| Verification codes | Confirming a phone number at sign-up, and in opt-in forms. | No - transactional. |
| Automation steps | A send SMS action in any flow. See Automations. | Yes, unless you mark the step as transactional. |
| Campaigns | A one-off broadcast to your customers or to a segment of them. | Always. |
| Your own systems | Order updates sent through the REST API. | No - the endpoint is for transactional messages only. |
Sending a campaign
Campaigns live under Campaigns → SMS. A campaign is a name (internal, the customer never sees it), a message and an audience.
- Write the message. Merge tags fill in per recipient:
{{first_name}},{{full_name}},{{points}},{{tier}},{{business_name}}. The counter under the box shows segments, credits per recipient and the characters left in the current segment - and it already includes the unsubscribe link that is appended at send. - Pick the audience. With nothing selected the campaign goes to every customer who gave SMS consent. Or tap one or more RFM segments - each chip shows how many consenting numbers it holds - to narrow it down.
- Check the two numbers. Recipients is the exact count the send will use, deduplicated by phone number. Expected cost is recipients × segments × your rate. If customers have a phone but no consent, the composer says how many - they are reachable once they opt in.
- Save as draft or send now. A send fails before anything goes out if the credit balance does not cover the whole audience; you never pay for half a campaign.
After the send, the campaign row shows delivered, failed and credits spent - and how many recipients used the unsubscribe link in the week that followed.
The unsubscribe link
Every marketing SMS ends with Отписване: noli.cx/k7m2xq (in the language of your business). The code is unique to that customer and that business, so the page it opens already knows who is asking - one button, no phone number to type, no code to receive.
| What the customer sees | What happens |
|---|---|
| Your name and logo, and an Unsubscribe me button | Nothing yet. Opening the link changes nothing - messaging apps preview links, and a preview must never opt someone out. |
| They press the button | The number is marked opted out for your business. It stops receiving campaigns and automation SMS; verification codes and order notifications still arrive. The opt-out is recorded in the consent log. |
| Subscribe me again | Undoes it. A mis-tap costs you a customer otherwise. |
Why a link and not "reply STOP"? The carrier Noli uses for Bulgarian numbers cannot receive messages, so a reply would go nowhere. The link works on every phone and every carrier, and it is counted in the price you see while typing - about 26 characters, always the same length.
In automations, a send SMS step has a Transactional message checkbox. Tick it only for messages the customer asked for - "your order has shipped", a booking reminder - and the link is left off. Everything else is marketing and must carry it; that is the law, not a Noli preference.
What it costs, and the Cyrillic trap
SMS is billed per segment, not per message - 0.6 credits per segment by default. A segment is 160 characters in Latin script but only 67 in Cyrillic, because the whole message switches to a wider encoding the moment one Cyrillic character appears.
A Bulgarian message is roughly two and a half times more expensive per character. A 150-character message in Latin script is one segment; the same message in Cyrillic is three. The unsubscribe link and a long first name from a merge tag eat into the same budget - the counter in the composer accounts for the link, but a name expands only at send.
Consent is not optional
A phone number in your database is not permission to market to it. Noli only includes a customer in SMS campaigns and marketing automations if consent was recorded. There are two ways it gets recorded:
| Source | How it works |
|---|---|
| Opt-in forms | The customer ticks your consent wording and confirms the number with a code. The wording shown is stored as the proof. See Opt-in forms. |
| Shopify SMS marketing consent | If your store is on Shopify, customers who ticked "text me with news and offers" at checkout are imported automatically, every hour, with the date of their consent. A customer who withdraws it in Shopify is opted out here on the next run. |
A customer imported from Shopify who is not a member of your programme yet appears in Customers with the status SMS consent only. They receive your SMS campaigns and nothing else: no points on orders, no emails, no automations, and they are not counted as members. The moment they sign in to the portal, share their number with the Viber bot or fill in an opt-in form, they become a full member and keep their consent.
Numbers that arrived any other way - a portal login, a Viber registration, an order - can receive verification codes and transactional messages, but not marketing.
Delivery
Noli sends through a primary carrier with an automatic fallback to a second provider, so a single carrier outage does not take verification codes down with it. Delivery receipts come back per message and are visible against the send.
The fallback covers individual sends such as verification codes. Large campaign batches go through the primary carrier only, so if your credit balance with it runs dry, a campaign fails where a login code would still get through.
Sending from your own systems
There is a public SMS endpoint if you want to trigger messages from your own backend on the same credit balance and the same delivery path. It is for transactional messages - order updates, reminders - and does not add the unsubscribe link, so do not use it for marketing. It is documented with the rest of the API - see REST API.