Weave Code
Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Statamic Resend Form Submissions Laravel Package

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.

View on GitHub
Deep Wiki
Context7

Getting Started

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

  1. src/ServiceProvider.php — what actually gets registered (routes, CP scripts, actions).
  2. routes/cp.php (or routes/web.php) — the endpoint the button hits; confirms the middleware/permission model.
  3. 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).
  4. 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.

Implementation Patterns

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.

Gotchas and Tips

  • Archived. This repo is archived and has no dependents. Treat it as a code sample you're vendoring, not a maintained dependency: pin the exact version in 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 version drift. The CP button relies on JS registration that changed between v3, v4, and v5 (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."
  • Recipient comes from the form config, not the submission. Resending replays 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.
  • Attachments are the classic failure. Uploaded files aren't always persisted in a re-usable way (asset container paths, temp cleanup). A resent email may arrive without the attachment the original had. Test with a submission that had a file.
  • Queued notifications lie. If the form's notification is queued (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."
  • Double-clicks and provider rate limits. Nothing here guarantees idempotency. On a 0-star addon, assume no debounce; editors will double-click. Resend.com, SES, and Postmark all have per-second limits that a bored editor can hit.
  • Authorization is on you to verify. Check the CP route's middleware and whether it respects Statamic's form/submission permissions. If it only checks "logged into CP," a low-privilege user can trigger mail to arbitrary configured recipients.
  • Local debugging. 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.
  • Extension points, if you fork. The obvious upgrades are: bulk action on the listing, a modal to override the recipient address (useful for "send it to my colleague instead"), and a resend counter column on the submission. All three live in the same Vue component + controller pair you found in resources/js and routes/cp.php.
  • Don't build a workflow on it. With no release cadence and no dependents, keep the integration shallow — a button editors can click. Put anything business-critical (audit trail, retry logic, deliverability monitoring) in your own application code.
Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
htinlynn/genius-helper
maco-studios/hephaestus
elmogy/larafast
xeviant/laravel-paystack
gorilladash/laravel-website-sdk
martialbe/flysystem-oss
chondal/3312client
jeroen-g/flickr
opscale-co/nova-genbi
itsjustvita/laravel-retention
tequilarapido/trackit
gregsphotography/site-builder-filament
cabaoctavio/laravel-query-log
gregsphotography/site-builder-components
io-digital/clickatell
snowsoft/laravel-admin
oxygen/auth
relicsoftware/barakah-payment-gateway
tobya/work-with-composer
equipc/laravel-email-validator