varsuite/statamic-resend-form-submissions
A Statamic addon for resending stored form submissions from the control panel, so you can re-deliver entries to recipients without re-entering data. Handy for follow-ups, failed deliveries, or testing notification templates.
Install
composer require varsuite/statamic-resend-form-submissions
Statamic auto-discovers the addon through the extra.statamic block in its composer.json, so there's normally no manual provider registration. After install:
php artisan vendor:publish --tag=statamic-resend-form-submissions # if a config is shipped
php artisan statamic:stache:clear
php artisan cache:clear
php artisan view:clear
Look here first
src/ServiceProvider.php — what actually gets registered (routes, CP scripts, actions).routes/cp.php (or routes/web.php) — the endpoint the button hits; confirms the middleware/permission model.resources/js/ — the Vue component or inline script that injects the button into the submissions listing. This tells you which Statamic version it targets (Statamic::script vs Statamic::vite).config/ — mailer overrides, if any.First use case
Open the Control Panel → Forms → {your form} → Submissions, and confirm a button appears per row. Before clicking it, make sure the notification is actually configured in resources/forms/{form}.yaml:
email:
-
to: "{{ email }}"
from: [email protected]
subject: 'Thanks for your submission'
html: emales/confirmation
Then set MAIL_MAILER=log locally, click resend, and check storage/logs/laravel.log (or a Mailpit inbox) to confirm the payload renders. If nothing appears, the button is wired but your form has no email block — the addon has nothing to replay.
Support workflow (the 90% case). A customer says the confirmation never arrived. Instead of asking them to re-submit, an editor finds the submission in the CP and clicks resend. This is the whole value proposition: it keeps the original submission data, timestamp, and ID intact while re-triggering the notification.
QA and template iteration. When you're tweaking resources/views/emales/*.blade.php, use a seeded submission as a fixture: edit the template, click resend, inspect the output. Far faster than filling out the front-end form each time.
Staging/mail-catcher loop. Point staging at Mailpit or Mailtrap (MAIL_MAILER=smtp, MAIL_HOST=mailpit), then resend against real production-shaped submissions. This catches issues that only show with real field values — conditional blocks, empty optional fields, multi-select arrays.
Programmatic equivalent, if you outgrow the button. The button is essentially a re-dispatch of the form's email notification. If you need this from a command, an importer, or a custom action, do it in your own code rather than shelling out to the CP route:
use Statamic\Facades\Form;
$submission = Form::find('contact')->submissions()->first();
// Re-fire the notification the way Statamic does on submit
event(new \Statamic\Events\FormSubmitted($submission));
Wrap that in a custom Statamic\Actions\Action if you want bulk resend, or an artisan command for backfills. Extending via your own action class is usually cleaner than depending on a zero-star, archived addon for anything beyond the single-row button.
Bulk and audit needs. If you need "resend to everyone from yesterday" or a log of who resent what, you'll be writing that yourself — see gotchas. A thin custom action plus a resend_log table beats forking this package.
Mailer choice. The name says "Resend" but don't assume it's the Resend.com API driver. Check config/mail.php for a resend mailer entry — that requires resend/resend-laravel and an API key. The addon itself is provider-agnostic; it just triggers Statamic's notification pipeline, so SMTP, Postmark, SES, etc. all work.
composer.json, commit composer.lock, and be ready to fork. If a Statamic major bumps the CP asset API, nothing will fix it for you.Statamic::script() → Statamic::vite(), and listing/action registration moved). Verify the button actually renders before assuming the install worked — a silent JS failure looks identical to "no submissions."resources/forms/{form}.yaml's email.to, so if that's templated ({{ email }}) it resolves against the stored submission data — good. But if someone hardcoded an address in the YAML, you're resending to that address, not the customer. Check before clicking.ShouldQueue, or your listener is), the button returns a success toast instantly while the mail sits in the queue. Check QUEUE_CONNECTION, jobs, and failed_jobs when "it says sent but nothing arrived."MAIL_MAILER=log plus tail -f storage/logs/laravel.log is the fastest loop. If the log is empty, the request never reached the send — check storage/logs for a 500 from the CP route, and php artisan route:list | grep resend to confirm the endpoint registered.resources/js and routes/cp.php.How can I help you explore Laravel packages today?