Kundenanfragen aus deiner App aufs Handy

Aktualisiert am 7. Oktober 2026 3 Min. Lesezeit

Ein Kontaktformular schickt dir meist eine E-Mail, und die wartet in einem Postfach voller Newsletter. Für eine kleine Agentur oder einen Shop ist eine neue Angebotsanfrage einen Push wert: wer anfragt, was gewünscht ist, das Budget und ein Link zum Antworten.

Diese Anleitung schickt jede Anfrage aus einer Laravel-App an Honk. Für Node, Go, Swift, Kotlin und Rust funktioniert es genauso. Jede Anfrage bekommt ihre eigene Gruppe. So landen zwei Kunden nie in derselben Mitteilung, und ein wiederholter Job benachrichtigt nie doppelt.

Voraussetzungen

  • Ein Honk-Konto (vorerst nur auf Einladung: Zugang anfragen) und ein Projekt mit Ingest-Schlüssel, zum Beispiel „Onlineshop“.
  • Laravel 13 mit installiertem Paket: siehe Laravel und PHP.

1. Eine Notification für die Anfrage

Erstelle eine Laravel-Notification, die den Kanal honk nutzt. Sie läuft über die Queue, damit der Kunde nicht warten muss, und geht erst nach dem Commit der Datenbanktransaktion raus:

// 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);
    }
}

Worauf es ankommt:

  • groupKey("requests/{$r->id}"): eine Gruppe pro Anfrage. Nachträge zur selben Anfrage, etwa eine Erinnerung eine Stunde später, aktualisieren diese Gruppe, statt einen neuen Verlauf zu beginnen.
  • category('customers'): Posteingang und Filter weisen sie als Kundenanfrage aus, und eine Regel kann alle gemeinsam behandeln.
  • url(…): erscheint als Link öffnen. Ein Tipp, und du bist bei der Anfrage in deinem Admin-Bereich.
  • action('Reply by email', …) und action('Call', …): zwei Buttons an der Nachricht, die auch im Push auf dem iPhone erscheinen, wenn er den Text zeigt. mailto: öffnet deine Mail-App mit der Adresse der Kundin oder des Kunden, tel: ruft an; geöffnet wird erst, wenn du tippst.
  • light(): ein Leichtes Hupen, denn eine Kundenanfrage ist kein Ausfall. Soll sie auch dann gepusht werden, wenn deine Push-Schwelle höher liegt, ergänze ->priority('high').

Halte toHonk() deterministisch, also ohne now() darin: Ein Retry aus der Queue muss denselben Payload senden, sonst antwortet Honk mit 409 idempotency_conflict.

2. Beim Speichern der Anfrage senden

// 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) sendet ohne User-Model. Wenn deine Admins als User angelegt sind, funktioniert auch $admin->notify(…).

3. Auf deinem iPhone

Die Anfrage kommt als Push mit Titel und den ersten Zeilen der Nachricht an. Auf iPhones mit Apple Intelligence listet Honk die wichtigsten Angaben auf: wer anfragt, was gewünscht ist, Budget und Frist, jeweils mit der Nachricht, aus der sie stammen. Dazu entwirft Honk eine Antwort, die du lesen, bearbeiten und in deine Mail-App kopieren kannst. Honk verschickt nie etwas in deinem Namen. Das alles passiert auf dem Gerät: Die Anfrage wird für die KI nirgendwohin geschickt, und den Originaltext öffnest du jederzeit mit einem Tippen.

Morgens kann dir der Tagesüberblick „5 neue Kundenanfragen“ melden, und auf der Apple Watch markierst du eine Anfrage per Doppeltippen als erledigt, sobald du geantwortet hast.

Dasselbe in anderen Sprachen

Jede Bibliothek hat dieses Rezept im README, mit einer Gruppe und einem Idempotency-Key pro Anfrage:

Was in die Nachricht gehört

Honk speichert die Nachricht für die Aufbewahrungsdauer deines Tarifs (3, 14 oder 30 Tage) auf seinem Server und zeigt sie in Mitteilungen an. Schick nur, was du zum Bearbeiten der Anfrage brauchst, nicht den ganzen Kundendatensatz. Bei Projekten mit sensiblen Inhalten stellst du die Push-Vorschau auf Allgemein. Mitteilungen zeigen dann keinen Inhalt, und die Details bleiben in der App.

Honk gibt es vorerst nur auf Einladung: Zugang anfragen. Alles in dieser Anleitung funktioniert schon im Free-Tarif.