Demandes clients : de votre app à votre téléphone

Mis à jour le 7 octobre 2026 3 min de lecture

Un formulaire de contact vous envoie généralement un e-mail, qui se perd au milieu des newsletters. Pour une petite agence ou une boutique, une demande de devis mérite mieux : un push avec le nom du demandeur, son besoin, son budget et un lien pour répondre.

Ce guide envoie chaque demande à Honk depuis une app Laravel ; le principe est le même en Node, Go, Swift, Kotlin et Rust. Chaque demande a son propre groupe : deux clients ne se retrouvent jamais dans la même notification, et un job relancé ne notifie jamais deux fois.

Avant de commencer

  • Un compte Honk (pour l’instant sur invitation : demandez un accès) et un projet, par exemple « Boutique », avec une clé d’ingestion.
  • Laravel 13 avec le paquet installé : voir Laravel et PHP.

1. Créer la notification

Créez une notification qui passe par le canal honk. Elle est mise en file d’attente pour ne pas ralentir la requête du client, et ne part qu’une fois la transaction de base de données validée :

// app/Notifications/CustomerRequested.php
namespace App\Notifications;

use App\Models\CustomerRequest;
use HonkMe\Laravel\Notifications\HonkMessage;
use HonkMe\Laravel\Notifications\ToHonk;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Notification;
use Illuminate\Queue\Attributes\Backoff;
use Illuminate\Queue\Attributes\Tries;
use Illuminate\Support\Str;

#[Tries(5)]
#[Backoff(10, 60, 300, 900)]
class CustomerRequested extends Notification implements ShouldQueue, ToHonk
{
    use Queueable;

    public function __construct(public CustomerRequest $request)
    {
        $this->afterCommit();
    }

    public function via(object $notifiable): array
    {
        return ['honk']; // add 'mail', 'database', … as you like
    }

    public function toHonk(object $notifiable): HonkMessage
    {
        $r = $this->request;

        return HonkMessage::create()
            ->title(Str::limit("New request: {$r->subject}", 150))
            ->line("{$r->name} ({$r->company})")
            ->line(Str::limit($r->body, 2000))       // message: ≤ 8192 bytes
            ->light()                                // a light honk (info)
            ->category('customers')
            ->groupKey("requests/{$r->id}")          // one group per request
            ->occurredAt($r->created_at)
            ->url(route('admin.requests.show', $r))  // https only, shown as "Open link"
            // buttons, up to 3 (the first is the main one): https://, mailto:, tel: or sms:
            ->action('Reply by email', "mailto:{$r->email}")
            ->action('Call', "tel:{$r->phone}")
            ->meta('request_id', (string) $r->id);
    }
}

Les champs qui comptent :

  • groupKey("requests/{$r->id}") : un groupe par demande. Ce qui suit pour la même demande, une relance une heure plus tard par exemple, met à jour ce groupe au lieu d’en créer un nouveau.
  • category('customers') : la boîte de réception et les filtres la présentent comme une demande client, et une seule règle peut s’appliquer à toutes.
  • url(…) : s’affiche sous la forme Ouvrir le lien, et le push vous mène droit à la demande dans votre back-office.
  • action('Reply by email', …) et action('Call', …) : deux boutons sur le message, aussi présents sur le push de l’iPhone quand il affiche le texte. mailto: ouvre votre app de messagerie avec l’adresse du client et tel: l’appelle ; rien ne s’ouvre tant que vous ne touchez pas un bouton.
  • light() : une demande client n’est pas une panne. Pour qu’elle déclenche un push même si votre seuil de push est plus élevé, ajoutez ->priority('high').

Gardez toHonk() déterministe, sans now() à l’intérieur : une nouvelle tentative depuis la file d’attente doit envoyer exactement le même contenu, sinon Honk répond 409 idempotency_conflict.

2. L’envoyer là où la demande est enregistrée

// app/Http/Controllers/QuoteController.php
public function store(StoreQuoteRequest $request)
{
    $quote = CustomerRequest::create($request->validated());

    // queued, after the transaction commits: the customer never waits for Honk
    Notification::route('honk', null)->notify(new CustomerRequested($quote));

    return to_route('quote.thanks');
}

Notification::route('honk', null) envoie la notification sans passer par un modèle utilisateur. Si vos administrateurs ont un compte utilisateur, $admin->notify(…) fonctionne aussi.

3. Sur votre iPhone

La demande arrive en push, avec son titre et les premières lignes du message. Sur les iPhone compatibles avec Apple Intelligence, Honk en extrait les détails clés (qui, quoi, quel budget, pour quand), chacun relié au message d’où il vient, et rédige un brouillon de réponse que vous pouvez relire, modifier et copier dans votre app de messagerie. Honk n’envoie jamais rien à votre place. Tout se passe sur l’appareil : la demande n’est envoyée nulle part pour l’IA, et le texte d’origine reste accessible d’un toucher.

Le point du jour peut ouvrir votre matinée sur « 5 nouvelles demandes clients ». Sur Apple Watch, un Double Tap marque une demande comme traitée une fois votre réponse envoyée.

Dans d’autres langages

Chaque bibliothèque reprend cette recette dans son README, avec un groupe et une clé d’idempotence par demande :

Attention au contenu

Honk stocke le message sur son serveur pendant la durée de conservation de votre forfait (3, 14 ou 30 jours) et l’affiche dans les notifications. Envoyez ce qu’il faut pour répondre à la demande, pas toute la fiche client. Pour les projets au contenu sensible, réglez l’aperçu du push sur Générique : les notifications n’affichent alors aucun contenu, et les détails restent dans l’app.

Pour l’instant, Honk est sur invitation : demandez un accès. Tout ce guide fonctionne avec le forfait Free.