laravel-remarketing maintained by nandosr98
📦 Laravel Remarketing
Laravel Remarketing es una librería sencilla y flexible que permite automatizar el envío de correos electrónicos de remarketing a usuarios que han iniciado un proceso (por ejemplo, una compra o solicitud) pero no lo han completado.
La librería se integra fácilmente en cualquier proyecto Laravel y permite configurar el tiempo de espera, el asunto del correo, la plantilla Blade a usar y el nombre de la cola de ejecución.
🚀 Instalación
Instala el paquete mediante Composer:
composer require nandosr98/laravel-remarketing
Publica los archivos de configuración, vistas y migraciones:
php artisan vendor:publish --tag="remarketing-config"
php artisan vendor:publish --tag="remarketing-views"
php artisan vendor:publish --tag="remarketing-migrations"
Ejecuta la migración para crear la tabla de remarketing:
php artisan migrate
⚙️ Configuración
El archivo de configuración config/remarketing.php permite personalizar el comportamiento del sistema de remarketing:
return [
'send_after_hours' => 1, // Número de horas después de las cuales se enviará el correo
'queue_name' => 'remarketing', // Nombre de la cola
'queue_connection' => 'redis',
'model_related' => App\Models\MiProducto::class, // Modelo relacionado
'model_related_property_name' => 'producto_id', // Nombre del campo de la relación
'model_related_method_name' => 'producto', // Metodo de la relación para acceder a los datos
'mailable_class' => RemarketingMessage::class, // Clase utilizada para enviar el correo
'mail_name' => 'Sender Name', // Nombre del remitente del correo
'mail_subject' => 'Subject of the email',
'mail_view' => 'remarketing::default',
];
🧱 Estructura de la tabla
La migración create_laravel_remarketing_table crea una tabla simple para almacenar los registros de remarketing:
| Campo | Tipo | Descripción |
|---|---|---|
| id | bigint | Identificador |
| model | string | Modelo relacionado (ej: App\Models\Order) |
| model_id | bigint | ID del modelo |
| sent | boolean | Si ya se ha enviado el email |
| queued | boolean | Si ya fue incluido en un Job |
| created_at | timestamp | Fecha de creación |
| updated_at | timestamp | Fecha de actualización |
🧠 Flujo de funcionamiento
- Creación de un registro
- Ejecución del comando → selecciona los registros pendientes y crea Jobs.
- Job de envío → manda el correo
RemarketingMessage. - Evento de apertura → marca el registro como abierto.
- Evento de eliminación → borra el registro cuando se completa la acción.
⚡ Comando Artisan
php artisan remarketing:queue
Este comando:
- Busca todos los
remarketingsno enviados. - Verifica que hayan pasado las horas definidas en
hours_delay. - Los marca como
queuedysent. - Lanza un Job por cada registro.
📬 Job: RemarketingJob
public function handle()
{
Mail::send(new RemarketingMessage($this->id));
}
💌 Mailable: RemarketingMessage
public function build()
{
$remarketing = BaseRemarketing::where('id', $this->id)
->with(config('remarketing.model_related_method_name'))
->first();
if (!$remarketing) {
return null;
}
$remarketing->sent = true;
$remarketing->save();
return $this->view(config('remarketing.mail_view'))
->subject(config('remarketing.mail_subject'));
}
🎯 Eventos
| Evento | Descripción |
|---|---|
OpenedRemarketing |
Se lanza cuando el usuario abre el correo. |
DeleteRemarketing |
Se lanza cuando completa el proceso y se borra el registro. |
Ejemplo:
event(new DeleteRemarketing($remarketingId));
🧩 Service Provider
$package
->name('laravel-remarketing')
->hasConfigFile()
->hasViews()
->hasMigration('CreateRemarketingTable')
->hasCommands();
🧪 Ejemplo completo
use LaravelRemarketing\LaravelRemarketing\Models\Remarketing;
BaseRemarketing::create([
'model' => App\Models\User::class,
'model_id' => $user->id,
]);
Artisan::call('remarketing:queue');
event(new DeleteRemarketing($remarketingId));
🕐 Cron recomendado
0 * * * * php /path/to/artisan remarketing:queue >> /dev/null 2>&1
🧰 Requisitos
- PHP ≥ 8.2
- Laravel ≥ 10
- Cola configurada (Redis, Database, SQS, etc.)
- Sistema de correo configurado
🧑💻 Autor
Desarrollado por nandosr98
Con ❤️ para la comunidad Laravel.