Un SMS lu dans les trois minutes contre un e-mail de confirmation qui traîne des heures dans une boîte de réception surchargée : c’est l’écart qui pousse de plus en plus de boutiques à doubler leur confirmation de commande WooCommerce d’un message texte, en complément de l’e-mail natif, pas à sa place.
Choisir le bon déclencheur
Le hook le plus adapté dépend du mode de paiement dominant sur la boutique. Pour un paiement immédiat par carte, woocommerce_order_status_processing ou woocommerce_order_status_completed conviennent, selon que la boutique nécessite une préparation manuelle avant expédition. Pour une boutique acceptant le virement ou le chèque, il vaut mieux réserver le SMS à la confirmation de réception du paiement plutôt qu’à la simple création de la commande, sous peine d’envoyer un SMS avant même d’avoir reçu l’argent.
add_action('woocommerce_order_status_processing', function ($order_id) {
$order = wc_get_order($order_id);
envoyer_sms_confirmation($order);
});
Formater le numéro au format international
Twilio, comme la plupart des passerelles SMS, attend un numéro au format E.164 (préfixe international, sans le zéro initial). Le champ de téléphone WooCommerce collecte généralement un numéro au format national, ce qui nécessite une conversion avant l’appel API :
function formater_numero_e164(string $numero_national, string $indicatif = '+33'): string
{
$numero = preg_replace('/[^0-9]/', '', $numero_national);
$numero = ltrim($numero, '0');
return $indicatif . $numero;
}
Cette conversion reste approximative pour un catalogue de clients internationaux : une boutique qui vend hors de la zone francophone doit collecter l’indicatif directement, par exemple via un champ de téléphone dédié gérant la sélection du pays, plutôt que de deviner l’indicatif à partir d’un format national ambigu.

Appeler l’API Twilio et gérer l’échec sans bloquer la commande
function envoyer_sms_confirmation(WC_Order $order): void
{
$numero = formater_numero_e164($order->get_billing_phone());
try {
$client = new Twilio\Rest\Client(
getenv('TWILIO_SID'),
getenv('TWILIO_TOKEN')
);
$client->messages->create($numero, [
'from' => getenv('TWILIO_NUMERO_EXPEDITEUR'),
'body' => sprintf(
'Commande #%d confirmée, total %s. Merci !',
$order->get_order_number(),
$order->get_formatted_order_total()
),
]);
} catch (\Exception $e) {
error_log('Échec envoi SMS commande #' . $order->get_id() . ' : ' . $e->getMessage());
}
}
Le bloc try/catch n’est pas accessoire : un numéro mal renseigné, un solde Twilio épuisé ou une panne temporaire de l’API ne doivent jamais empêcher la validation de la commande elle-même. L’envoi du SMS reste une notification secondaire, la commande doit aboutir même si elle échoue.
Ce qu’il ne faut pas envoyer par SMS
- Le détail complet du panier : un SMS reste limité en longueur et coûte par segment de 160 caractères
- Des informations sensibles comme un lien de réinitialisation de mot de passe
- Des SMS de relance marketing sans consentement explicite distinct de la confirmation transactionnelle, pour rester conforme aux règles de prospection commerciale
Suivre les coûts sans mauvaise surprise
Twilio facture chaque SMS envoyé, avec un tarif qui varie selon le pays de destination et l’opérateur du destinataire. Sur une boutique à fort volume de commandes, il vaut mieux prévoir un plafond de dépense quotidien configurable côté Twilio, ainsi qu’une alerte de solde bas, plutôt que de découvrir a posteriori une facture inattendue après une période de forte activité commerciale. Un tableau de bord simple, alimenté par les webhooks de statut Twilio, permet de suivre le taux de livraison réel des SMS et de repérer rapidement un opérateur ou un pays où le taux d’échec grimperait anormalement, signe fréquent d’un problème de format de numéro non couvert par la fonction de conversion.
En résumé
Un SMS de confirmation via Twilio se branche en quelques lignes sur le bon statut de commande WooCommerce, à condition de soigner le formatage du numéro et de traiter l’échec d’envoi comme un événement secondaire, jamais bloquant. Le gain en réassurance client, pour une boutique où l’e-mail se perd facilement, justifie largement cette dizaine de lignes de code.