Scalare un agente AI su WhatsApp: quanti numeri servono

Quanti numeri WhatsApp servono a un agente AI: limiti per numero, una formula in tre parti, esempi con i costi, instradamento degli utenti e livelli della Business API.

Una griglia di scaffali con telefoni tutti uguali, alcuni illuminati di verde, collegati da sottili linee a un hub centrale.

In breve

  • Un numero whasp ammette 100 chat attive in 30 giorni, 40 nuove chat in 24 ore e 1.500 messaggi inviati in 24 ore, e i numeri che ti servono sono il più grande di tre divisioni, ciascuna arrotondata per eccesso.
  • Pianifica all'80% di ogni limite, perché oltre l'80% un numero viene segnalato at_risk: così 100 utenti per numero diventano 80, 40 nuove chat al giorno diventano 32 e 1.500 invii diventano 1.200.
  • Un agente chiacchierone è limitato dai messaggi, non dagli utenti: alla soglia dell'80% un numero può inviare 15 messaggi al giorno per utente attivo.
  • Un picco di lancio è limitato dalle nuove chat: 1.000 iscrizioni in un giorno richiedono 32 numeri, mentre le stesse iscrizioni distribuite su cinque giorni ne richiedono 13.
  • La Business API di Meta scala in modo diverso: i suoi livelli (250, 2.000, 10.000, 100.000, illimitato) limitano quante persone puoi contattare fuori dalla finestra di 24 ore, non le tue risposte.

Con whasp, la quantità di numeri WhatsApp che serve al tuo agente AI è il più grande di tre risultati, ciascuno arrotondato per eccesso: utenti attivi diviso 80, iscrizioni del giorno di punta diviso 32, messaggi inviati nel giorno di punta diviso 1.200. Sono l’80% dei limiti per numero. Aggiungi un numero di scorta o due per i ban.

Quali limiti ha un numero?

Un numero whasp è un vero account WhatsApp personale su un telefono cloud e un IP tutti suoi, quindi i limiti valgono per ogni numero. Li elenca il riferimento API:

Limite, per numero Valore Cosa succede al limite
Chat attive (persone che hanno scritto negli ultimi 30 giorni) 100 Il numero esce da /numbers/pick; i messaggi in arrivo continuano a entrare
Nuove chat in 24 ore 40 Uguale
Messaggi inviati in 24 ore 1.500 Gli invii falliscono con 429 number_daily_limit
Messaggi ricevuti Nessun limite

Un numero viene segnalato at_risk quando un limite supera l’80%, quindi i tetti di pianificazione sono 80 utenti, 32 nuove chat e 1.200 invii. Altri due fatti influenzano il piano. I messaggi di un numero escono uno alla volta, a circa un secondo l’uno dall’altro, quindi una coda di 120 risposte si smaltisce in circa due minuti. E l’account ammette 100 richieste API ogni 10 secondi, cioè 10 al secondo, lo stesso ritmo di 10 numeri che inviano a pieno regime. Oltre questo, metti in coda dalla tua parte.

Conta gli utenti attivi come fa whasp: le persone che hanno scritto negli ultimi 30 giorni (finestra mobile), non le iscrizioni totali. Chi smette di scrivere esce dal conto dopo 30 giorni. GET /v1/numbers/{number}/chats elenca chi ha scritto e quando, così puoi misurarlo.

Come si calcola quanti numeri servono?

Il calcolo parte da tre dati dei tuoi log: gli utenti attivi (U), i nuovi utenti nel tuo giorno di punta (S) e i messaggi che invii nel tuo giorno di punta (M). Ogni limite dà un conteggio, e vince il più grande:

  • per utenti: U / (100 x 0,8) = U / 80
  • per iscrizioni: S / (40 x 0,8) = S / 32
  • per invii: M / (1.500 x 0,8) = M / 1.200

Poi aggiungi una scorta del 10%, almeno un numero. Quando un numero va critical (bannato, disconnesso, telefono offline da più di 10 minuti o invii che falliscono), /numbers/pick smette di proporlo e la sua quota di nuove iscrizioni va agli altri. Il sostituto arriva gratis ma vuoto, e la tua logica sposta gli utenti. La scorta è il posto dove entrano nel frattempo. Ogni numero costa $49 ogni 30 giorni.

// Limiti per numero dal riferimento API di whasp, e il carico a cui pianifichiamo.
const LIMITS = { users: 100, signups: 40, sends: 1500 };
const PLAN = 0.8; // oltre l'80% di un limite il numero viene segnalato at_risk

export function numbersNeeded(users: number, busiestDaySignups: number, busiestDaySends: number) {
  const byUsers = Math.ceil(users / (LIMITS.users * PLAN));
  const bySignups = Math.ceil(busiestDaySignups / (LIMITS.signups * PLAN));
  const bySends = Math.ceil(busiestDaySends / (LIMITS.sends * PLAN));
  const base = Math.max(byUsers, bySignups, bySends);
  const spare = Math.max(1, Math.ceil(base * 0.1)); // margine per un numero che va in critical
  return { byUsers, bySignups, bySends, base, spare, total: base + spare, monthlyUsd: (base + spare) * 49 };
}

Come sono fatti tre piani di dimensioni reali?

I tre piani qui sotto usano ipotesi scelte da noi, non misurazioni. Sostituiscile con i numeri dei tuoi log.

Un tutor di lingue con 3.000 utenti attivi

Ipotizza che il 25% degli utenti attivi scriva in un dato giorno, che l’agente invii a ciascuno 12 messaggi, che il giorno di punta valga il doppio della media e che un lancio porti 400 nuovi utenti in un giorno.

  • Invii: 3.000 x 0,25 x 12 = 9.000 in un giorno medio, 18.000 nel giorno di punta.
  • Per utenti: 3.000 / 80 = 37,5, quindi 38. Per iscrizioni: 400 / 32 = 12,5, quindi 13. Per invii: 18.000 / 1.200 = 15.
  • Il più grande è 38. Scorta: 10% di 38 = 3,8, quindi 4. In tutto 42 numeri, 42 x $49 = $2.058 al mese, cioè $0,69 per utente attivo.

Qui decidono gli utenti.

Un companion chiacchierone con 1.200 utenti attivi

Ipotizza che il 50% scriva in un dato giorno, che l’agente invii a ciascuno 40 messaggi, che il giorno di punta valga 1,5 volte la media e che in quel giorno arrivino 100 nuovi utenti.

  • Invii: 1.200 x 0,5 x 40 = 24.000 in un giorno medio, 36.000 nel giorno di punta.
  • Per utenti: 1.200 / 80 = 15. Per iscrizioni: 100 / 32 = 3,1, quindi 4. Per invii: 36.000 / 1.200 = 30.
  • Il più grande è 30. Scorta 3. In tutto 33 numeri, 33 x $49 = $1.617, cioè $1,35 per utente attivo.

Qui decidono i messaggi. Con 80 utenti per numero, 1.200 invii al giorno permettono 15 messaggi al giorno per utente attivo. Questo companion ne invia 30 per utente attivo nel giorno di punta, quindi gli servono il doppio dei numeri che il suo numero di utenti suggerirebbe.

Un lancio con 1.000 iscrizioni in un giorno

Ipotizza 1.000 utenti in tutto e 6.000 messaggi inviati quel giorno.

  • Per utenti: 1.000 / 80 = 12,5, quindi 13. Per iscrizioni: 1.000 / 32 = 31,25, quindi 32. Per invii: 6.000 / 1.200 = 5.
  • Il più grande è 32. Scorta 4. In tutto 36 numeri, $1.764 al mese.

Ora distribuisci le stesse 1.000 iscrizioni su cinque giorni, 200 al giorno, con 1.200 invii nel giorno di punta:

  • Per utenti: 13. Per iscrizioni: 200 / 32 = 6,25, quindi 7. Per invii: 1.200 / 1.200 = 1.
  • Il più grande è 13. Scorta 2. In tutto 15 numeri, $735 al mese.

Una lista d’attesa o dei codici d’invito farebbero risparmiare 21 numeri e $1.029 al mese. In questo esempio il limite che vincola sono le nuove chat al giorno, non gli utenti.

Piano Utenti attivi Iscrizioni, giorno di punta Invii, giorno di punta Numeri Al mese
Tutor 3.000 400 18.000 42 $2.058
Companion 1.200 100 36.000 33 $1.617
Lancio in un giorno 1.000 1.000 6.000 36 $1.764
Lancio in cinque giorni 1.000 200 1.200 15 $735

Come instradi i nuovi utenti e li tieni su un numero?

GET /v1/numbers/pick restituisce il numero sano e online con più margine per un nuovo utente, e un link wa.me che apre la chat. Passa text e il link si apre con quel messaggio già scritto. Mettici dentro l’id del tuo utente, così l’agente sa chi sta scrivendo (altro sui link di onboarding).

const API = "https://api.whasp.ai/v1";
const headers = { Authorization: `Bearer ${process.env.WHASP_API_KEY}` };

/** Il link da mostrare a un nuovo utente, o null quando tutti i numeri sono pieni. */
export async function signupLink(userId: string): Promise<string | null> {
  const params = new URLSearchParams({ text: `Ciao, il mio codice è ${userId}` });
  const res = await fetch(`${API}/numbers/pick?${params}`, { headers });
  if (res.status === 409) return null; // no_capacity: tieni in attesa l'iscrizione, aggiungi un numero
  if (!res.ok) throw new Error(`pick failed with ${res.status}`);
  const { wa_link } = (await res.json()) as { number: string; wa_link: string };
  return wa_link;
}

Una chat resta sul suo numero. Quando invii senza from, whasp usa il numero a cui la persona ha scritto per ultimo, che è quello che vuoi. Un from diverso restituisce 409 chat_not_open, a meno che quella persona non abbia scritto anche a quel numero.

Quando signupLink restituisce null, mostra una schermata d’attesa e aggiungi numeri. Aggiungili prima di averne bisogno: POST /v1/numbers può rispondere 503 no_capacity quando nessuno è pronto (non viene addebitato nulla), e un numero configurato da zero richiede circa 30 minuti.

Come controlli il margine e aggiungi numeri?

Interroga GET /v1/numbers ogni pochi minuti. Ogni numero riporta le sue stats e i suoi limits, così puoi sommare il margine rimasto fino all’80% sui numeri sani e mandare un avviso per ogni numero che non è healthy. Il webhook number.status_changed ti avvisa nel momento in cui cambiano la salute o online (vedi webhook WhatsApp: verifica della firma, retry e duplicati).

type Num = {
  number: string;
  status: "provisioning" | "active" | "retired";
  health: "healthy" | "at_risk" | "critical";
  stats: { active_chats_30d: number; new_chats_24h: number; outbound_24h: number };
  limits: { active_chats_30d: number; new_chats_24h: number; outbound_24h: number };
};

/** Margine libero sui numeri sani, contato fino all'80% di ogni limite. */
export async function headroom() {
  const res = await fetch(`${API}/numbers`, { headers });
  const { data } = (await res.json()) as { data: Num[] };
  const live = data.filter((n) => n.status === "active");
  const sick = live.filter((n) => n.health !== "healthy").map((n) => n.number);
  const room = { users: 0, signups: 0, sends: 0 };
  for (const n of live.filter((n) => n.health === "healthy")) {
    room.users += Math.max(0, Math.floor(n.limits.active_chats_30d * PLAN) - n.stats.active_chats_30d);
    room.signups += Math.max(0, Math.floor(n.limits.new_chats_24h * PLAN) - n.stats.new_chats_24h);
    room.sends += Math.max(0, Math.floor(n.limits.outbound_24h * PLAN) - n.stats.outbound_24h);
  }
  return { numbers: live.length, sick, room };
}

/** Aggiunge un numero. Addebita $49 subito, quindi chiamala dietro un tetto. */
export async function addNumber(label: string): Promise<Num> {
  const res = await fetch(`${API}/numbers`, {
    method: "POST",
    headers: { ...headers, "Content-Type": "application/json" },
    body: JSON.stringify({ label, profile: { name: "Ava", about: "La tua amica AI" } }),
  });
  if (res.status === 402) throw new Error("balance too low: top up first");
  if (res.status === 503) throw new Error("no_capacity: nothing charged, retry later");
  if (!res.ok) throw new Error(`add failed with ${res.status}`);
  return (await res.json()) as Num;
}

Chiama addNumber quando room.users scende sotto le iscrizioni che ti aspetti nelle prossime due settimane, o room.signups sotto il tuo giorno di punta, e metti un tetto al totale perché un bug non possa spendere il tuo saldo. Tieni il saldo sopra numeri x $49: un numero si rinnova da solo finché il saldo lo copre, e quando il saldo finisce ha 3 giorni di tolleranza e poi viene ritirato.

Più prodotti o più clienti

Un account ha un solo URL di webhook, quindi gestisci un gruppo di numeri per ogni prodotto, personaggio o cliente e distinguili da solo. Dai a ogni numero una label come tutor-fr-1, imposta il suo profilo (nome, descrizione, foto) sul personaggio e instrada ogni evento in base al campo number. Esegui numbersNeeded per ogni gruppo. La fatturazione è un unico saldo, quindi addebita a ogni cliente il suo numero di numeri x $49 dalla tua parte.

Come si confrontano i limiti della Business API?

Meta limita le persone uniche che un’azienda può contattare fuori dalla finestra di assistenza clienti di 24 ore, ogni 24 ore mobili e per portfolio business, condivisi da tutti i suoi numeri. I portfolio nuovi partono da 250. La verifica, oppure l’invio di 2.000 messaggi consegnati di alta qualità, lo porta a 2.000. Dopo sale in automatico a 10.000, 100.000 e illimitato quando i tuoi messaggi sono di alta qualità e hai usato almeno metà del limite negli ultimi 7 giorni.

whasp WhatsApp Business Platform
Cosa viene limitato Chat attive, nuove chat e invii, per numero Persone uniche contattate fuori dalla finestra di 24 ore, per portfolio
Risposte a chi ha scritto Contano per i 1.500 invii Non fanno parte del livello
Come aggiungi capacità Aggiungi un numero: $49 ogni 30 giorni, di solito pronto subito Ottieni un livello più alto con verifica e qualità
Velocità per numero Un messaggio circa ogni secondo 80 messaggi al secondo di default, fino a 1.000
Numeri per account Li aggiungi con POST /v1/numbers 2 all’inizio, 20 dopo la verifica

La piattaforma ufficiale scala a quote, whasp a telefoni. Le risposte dentro la finestra non fanno parte del livello di Meta e non abbiamo trovato un tetto agli utenti attivi per numero ufficiale, quindi per un agente che Meta ammette un solo numero ufficiale può servire un pubblico molto grande. Se la tua AI sia ammessa lì è la prima domanda, e i costi della WhatsApp Business API nel 2026 mostrano quanto costa la strada ufficiale.

Cosa fare adesso

Prendi tre numeri dai tuoi log: gli utenti attivi negli ultimi 30 giorni, le iscrizioni nel tuo giorno di punta e i messaggi inviati nel tuo giorno di punta. Esegui numbersNeeded e aggiungi i numeri con un lancio di anticipo. Collega il controllo del margine e leggi perché i numeri vengono bannati per dimensionare la scorta.

Domande

Quanti numeri WhatsApp servono per 1.000 utenti?

Con whasp, 1.000 utenti attivi richiedono 13 numeri alla soglia di pianificazione di 80 utenti, o 10 al limite massimo di 100. Controlla anche le nuove chat e i messaggi al giorno, perché ciascuno dei due può richiedere più numeri degli utenti.

Qual è il limite di messaggi per numero WhatsApp su whasp?

Un numero può inviare fino a 1.500 messaggi in 24 ore, tenere 100 chat attive in 30 giorni e aprire 40 nuove chat in 24 ore. I messaggi in arrivo sono illimitati, e a 1.500 invii l'API risponde 429 number_daily_limit.

Come mando i nuovi utenti sul numero giusto?

Chiama GET /v1/numbers/pick. Restituisce il numero sano e online con più margine e un link wa.me, e da lì la chat resta su quel numero. Risponde 409 no_capacity quando tutti i numeri sono pieni, offline o non sani.

Quali sono i limiti di messaggi della WhatsApp Business API?

Meta limita le persone uniche che un'azienda può contattare fuori dalla finestra di 24 ore ogni 24 ore mobili, per portfolio business: 250 all'inizio, poi 2.000, 10.000, 100.000 e illimitato man mano che l'account si verifica e invia messaggi di alta qualità.

Cosa succede quando un numero whasp è pieno?

Smette di essere proposto da /numbers/pick, ma i messaggi dei suoi utenti già presenti continuano ad arrivare. Oltre i 1.500 invii in 24 ore, gli invii da quel numero falliscono con 429 number_daily_limit.

Tutti gli articoli