Si paga a parti, non a messaggi
La rete mobile non trasporta "un messaggio": trasporta parti. Un SMS lungo viene spezzato in più parti, ognuna viaggia come un SMS autonomo e ognuna viene fatturata come un SMS. Il campo parts nella risposta dell'API dice esattamente quante parti sono state addebitate, in modo sincrono.
Quante parti servono dipende da due sole cose: la codifica del testo e la sua lunghezza. Entrambe seguono regole fisse dello standard GSM — non scelte nostre — ma conviene conoscerle, perché un singolo carattere può cambiare il prezzo.
GSM-7: 160 caratteri, poi 153
La codifica di base è GSM-7: 7 bit per carattere, un set che copre lettere latine, cifre, punteggiatura comune e alcune lettere accentate (è, é, ù, ì, ò, à…). Finché il testo resta dentro il set, in una parte singola entrano 160 caratteri.
Superati i 160 caratteri scatta la concatenazione: ogni parte deve trasportare un'intestazione tecnica (UDH) che dice al telefono come ricomporre il messaggio, e quell'intestazione costa 7 caratteri. Ogni parte concatenata ne trasporta quindi 153, non 160. Un testo di 161 caratteri occupa 2 parti.
I caratteri estesi contano doppio
Alcuni caratteri utili — € [ ] { } ~ \ | ^ — non stanno nel set base: vengono codificati come coppia di escape e costano 2 caratteri l'uno. Un testo pieno di parentesi, o con il simbolo dell'euro, riempie la parte più in fretta di quanto suggerisca il conteggio a occhio.
La coppia non viene mai spezzata a cavallo di due parti: se non ci sta, slitta per intero nella parte successiva.
Un carattere fuori dal set e tutto il messaggio diventa Unicode
La codifica è una proprietà dell'intero messaggio, non del singolo carattere. Basta un'emoji, una virgoletta tipografica (quelle "curve" che molti editor inseriscono da soli) o un ideogramma perché tutto il testo passi a Unicode (UCS-2): 70 caratteri in parte singola, 67 per parte concatenata.
Lo stesso testo di 100 caratteri costa 1 parte in GSM-7 e 2 parti se contiene una sola emoji. Il campo encoding nella risposta ("gsm7" o "unicode") dice quale codifica è stata applicata.
Ogni parte è un SMS in fattura: l'esempio dei 320 caratteri
Il limite della piattaforma è 4 parti per messaggio (612 caratteri GSM-7, 268 Unicode); oltre, la richiesta viene rifiutata con VALIDATION_FAILED. Fino a lì il conto è lineare: numero di parti × prezzo per parte.
Un messaggio GSM-7 di 320 caratteri supera i 160 della parte singola, quindi si concatena a 153 caratteri per parte. L'esempio usa il prezzo del mittente di sistema per un invio transazionale:
Esempio (mittente di sistema)
text: 320 GSM-7 characters per-part capacity: 153 (concatenated) price basis: system sender, transactional parts = ceil(320 / 153) = 3 price = 3 × 0.0298 EUR = 0.0894 EUR
In pratica
- Tieni OTP e messaggi transazionali sotto i 160 caratteri GSM-7: restano sempre 1 parte, al prezzo minimo.
- Attenzione al copia-incolla dagli editor di testo: virgolette tipografiche e trattini lunghi sono fuori dal set GSM e trasformano l'intero messaggio in Unicode.
- Il simbolo € è legittimo ma sta nel set esteso: conta come 2 caratteri.
- Non serve fare i conti a mano: ogni risposta dell'API riporta parts e price_eur per quell'invio.
