Solicitudes de clientes, de tu app a tu teléfono

Actualizado el 7 de octubre de 2026 3 min de lectura

Lo normal es que un formulario de contacto te avise por correo, y ese correo se queda esperando entre boletines. Para una agencia pequeña o una tienda, una solicitud de presupuesto nueva merece una notificación: quién la envía, qué necesita, cuánto quiere gastar y un enlace para responder.

Esta guía envía cada solicitud a Honk desde una app Laravel, y te indica dónde está la misma receta para Node, Go, Swift, Kotlin y Rust. Cada solicitud tiene su propio grupo, así que dos clientes nunca se mezclan en una misma notificación, y un reintento de la cola nunca avisa dos veces.

Antes de empezar

  • Una cuenta de Honk (por ahora solo con invitación: solicita acceso) y un proyecto, por ejemplo «Tienda», con una clave de ingesta.
  • Laravel 13 con el paquete instalado: consulta Laravel y PHP.

1. Una notificación para la solicitud

Crea una notificación que use el canal honk. Va a la cola, así que el formulario responde al cliente sin esperas, y solo sale cuando se confirma la transacción de la base de datos:

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

Los campos que importan:

  • groupKey("requests/{$r->id}"): un grupo por solicitud. Lo que llegue después sobre la misma solicitud, como un recordatorio una hora más tarde, actualiza ese grupo en vez de abrir uno nuevo.
  • category('customers'): la bandeja de entrada y sus filtros la muestran como solicitud de cliente, y una sola regla puede ocuparse de todas.
  • url(…): aparece como Abrir enlace, y la notificación te lleva directamente a la solicitud en tu panel de administración.
  • action('Reply by email', …) y action('Call', …): dos botones en el mensaje, que también aparecen en la notificación del iPhone cuando muestra el texto. mailto: abre tu app de correo con la dirección del cliente y tel: lo llama; nada se abre hasta que tocas.
  • light(): la solicitud de un cliente no es una caída del servicio. Si quieres que te avise aunque tu umbral de push sea más alto, añade ->priority('high').

Haz que toHonk() sea determinista, sin now() dentro: un reintento de la cola debe enviar exactamente el mismo contenido; si no, Honk responde 409 idempotency_conflict.

2. Envíala al guardar la solicitud

// 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) envía sin necesidad de un modelo de usuario. Si tus administradores son usuarios de la app, también puedes usar $admin->notify(…).

3. En tu iPhone

La solicitud llega como notificación, con su título y las primeras líneas del mensaje. En los iPhone con Apple Intelligence, Honk extrae los datos clave (quién es, qué quiere, cuánto quiere gastar y para cuándo), cada uno junto al mensaje del que sale, y redacta una respuesta que puedes leer, editar y copiar en tu app de correo. Honk nunca envía nada en tu nombre. Todo ocurre en el dispositivo: la solicitud no se envía a ningún sitio para procesarla con IA, y siempre puedes ver el texto original con un toque.

El resumen diario puede empezar tu mañana con «5 nuevas solicitudes de clientes», y en el Apple Watch, cuando ya hayas respondido, Double Tap marca la solicitud como atendida.

Lo mismo en otros lenguajes

Cada biblioteca incluye esta receta en su README, con un grupo y una clave de idempotencia por solicitud:

Cuidado con el contenido

Honk guarda el mensaje en su servidor durante el periodo de conservación de tu plan (3, 14 o 30 días) y lo muestra en las notificaciones. Envía solo lo que necesitas para atender la solicitud, no la ficha completa del cliente. En proyectos con contenido sensible, pon la vista previa push en Genérica: las notificaciones no muestran contenido y los detalles se quedan en la app.

Por ahora, Honk funciona solo con invitación: solicita acceso. Todo lo que explica esta guía funciona con el plan Free.