Cererile clienților, din aplicația ta pe telefon

Actualizat pe 7 octombrie 2026 3 min de lectură

Un formular de contact îți trimite de obicei un email, care apoi așteaptă într-un inbox plin de newslettere. Pentru o agenție mică sau un magazin, o cerere nouă de ofertă merită o notificare: cine a scris, ce vrea, ce buget are și un link ca să-i răspunzi.

Ghidul trimite fiecare cerere către Honk dintr-o aplicație Laravel și îți arată unde găsești aceeași rețetă pentru Node, Go, Swift, Kotlin și Rust. Fiecare cerere are grupul ei, așa că doi clienți nu ajung niciodată în aceeași notificare, iar un job reluat nu te anunță de două ori.

Înainte să începi

  • Un cont Honk (deocamdată, doar pe bază de invitație: cere acces) și un proiect, de exemplu „Magazin”, cu o cheie API.
  • Laravel 13 cu pachetul instalat: vezi Laravel și PHP.

1. O notificare pentru cerere

Creează o notificare care folosește canalul honk. Notificarea intră în coadă, ca cererea clientului să rămână rapidă, și pleacă abia după commitul tranzacției din baza de date:

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

Ce contează aici:

  • groupKey("requests/{$r->id}"): un grup pentru fiecare cerere. Ce trimiți ulterior despre aceeași cerere, de exemplu o reamintire după o oră, actualizează grupul ei în loc să deschidă unul nou.
  • category('customers'): în inbox și în filtre apare ca cerere de la un client, iar o singură regulă le poate trata pe toate.
  • url(…): apare ca Deschide linkul, deci din notificare ajungi direct la cerere, în panoul tău de administrare.
  • action('Reply by email', …) și action('Call', …): două butoane pe mesaj, care apar și în notificarea de pe iPhone când aceasta arată textul. mailto: deschide aplicația de email cu adresa clientului, iar tel: îl sună; nimic nu se deschide până nu apeși.
  • light(): o cerere de la un client nu e o cădere de server. Dacă vrei notificare chiar și când pragul tău pentru notificări e mai sus, adaugă ->priority('high').

Păstrează toHonk() determinist, fără now() în el: o reîncercare din coadă trebuie să trimită exact același conținut, altfel Honk răspunde cu 409 idempotency_conflict.

2. Trimite notificarea acolo unde salvezi cererea

// 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) trimite fără un model de utilizator. Dacă administratorii tăi sunt utilizatori în aplicație, merge și $admin->notify(…).

3. Pe iPhone

Cererea vine ca notificare, cu titlul ei și primele rânduri din mesaj. Pe iPhone-urile cu Apple Intelligence, Honk scoate în evidență detaliile importante (cine scrie, ce vrea, bugetul, termenul), fiecare cu mesajul din care provine, și schițează un răspuns pe care îl citești, îl editezi și îl copiezi în aplicația ta de email. Honk nu trimite nimic în locul tău. Totul rulează pe dispozitiv: cererea nu pleacă nicăieri pentru AI, iar textul original se deschide oricând cu o atingere.

Rezumatul zilnic îți poate începe dimineața cu „5 cereri noi de la clienți”, iar pe Apple Watch, după ce ai răspuns, marchezi cererea ca gestionată cu Double Tap.

Același lucru în alte limbaje

Fiecare bibliotecă are rețeta asta în README, cu un grup și o cheie de idempotență pentru fiecare cerere:

Grijă la conținut

Honk păstrează mesajul pe server 3, 14 sau 30 de zile, în funcție de plan, și îl afișează în notificări. Trimite doar ce îți trebuie ca să te ocupi de cerere, nu toată fișa clientului. Pentru proiectele cu conținut sensibil, setează previzualizarea notificărilor la Generic: notificările nu mai arată conținutul, iar detaliile rămân în aplicație.

Deocamdată, Honk e disponibil doar pe bază de invitație: cere acces. Tot ce face acest ghid merge și pe planul Free.