Para enviar las facturas de Cashier por email en Laravel lo único que debemos tener guardado en base de datos es el invoice_id, algo que Stripe nos ofrece si por ejemplo realizamos el pago con el método invoiceFor.
Yo en mi caso guardo la columna invoice_id en la tabla Orders, así, cuando Stripe me notifica que el pago ha sido correcto, puedo obtener esa factura y adjuntarla en un email para que el cliente la pueda recibir.
El ejemplo que voy a poner aquí es algo que cubrimos en el curso Plataforma de cursos con Laravel 7: Roles, Pagos con Stripe SCA, Cupones, Xdebug. Instalar laravel-dompdf para adjuntar PDF
composer require barryvdh/laravel-dompdf
Crear un Mailable para enviar facturas con Cashier
php artisan make:mail StudentNewOrder
Una vez tenemos el Mailable StudentNewOrder (cuando un cliente ha realizado un pago), vamos a añadir lógica a este archivo.
<?php
namespace App\Mail;
use App\Models\Order;
use App\Models\User;
use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use Laravel\Cashier\Invoice;
class StudentNewOrder extends Mailable
{
use Queueable, SerializesModels;
/**
* @var User
*/
public User $user;
/**
* @var Order
*/
public Order $order;
/**
* @var Invoice|null
*/
public ?Invoice $invoice;
/**
* Create a new message instance.
*
* @param User $user
* @param Order $order
*/
public function __construct(User $user, Order $order)
{
$this->user = $user;
$this->order = $order;
$this->invoice = $user->findInvoice($order->invoice_id);
}
/**
* Build the message.
*
* @return $this
*/
public function build()
{
$vendor = config("app.name");
$product = "Compra de cursos";
$invoice = $this->invoice;
$owner = $this->user;
$pdf = \PDF::loadview('vendor.cashier.receipt', compact('invoice', 'product', 'vendor', 'owner'));
return $this
->attachData($pdf->output(), $this->invoice->id . '-' . date('d-m-Y') . '.pdf', ['mime' => 'application/pdf'])
->subject("Gracias por tu pedido - " . config("app.name"))
->markdown('emails.students.new_order');
}
}
A este mailable simplemente le pasamos el cliente y el pedido. La factura que nos retorna Stripe a través de los WebHooks la podemos obtener con el método findInvoice de Cashier, tal y como lo hacemos aquí.
Gracias al método attachData seremos capaces de adjuntar en este caso un archivo PDF en este correo.
@component('mail::message')
# Hola {{ $user->name }},
<br>
Muchas gracias por haber realizado tu pedido en {{ config('app.name') }}.
<br>
Aquí tienes todos los datos de tu pedido:
<ul>
@foreach($order->order_lines as $order_line)
<li>
Curso: {{ $order_line->course->title }} - Precio: {{ \App\Helpers\Currency::formatCurrency($order_line->price) }}
</li>
@endforeach
</ul>
@component('mail::button', [
'url' => url('/')
])
Volver a la plataforma
@endcomponent
Atentamente,<br>
{{ config('app.name') }}
@endcomponent
Para finalizar el ejemplo sólo nos falta utilizar el método send de la clase Mail para enviar el email al cliente:
<?php
$invoice_id = $payload['data']['object']["invoice"];
$order->update([
'invoice_id' => $invoice_id,
'status' => Order::SUCCESS
]);
Mail::to($user->email)->send(
new StudentNewOrder($user, $order)
);
Curso Laravel 12
Completo 2026
El único curso 100% actualizado que incluye Laravel 12, Livewire 3, Vue 3, React 19 e Inertia 2. Aprende con proyectos reales y las últimas funcionalidades.
star Incluido en cualquier suscripción