graham-campbell/contact
A Laravel package for adding a contact form and managing submitted enquiries. It provides the model, migrations, validation, and email notifications needed to capture and store contact messages in your application.
A deliberate build-vs-buy call on a commodity feature. A contact form — capture name, email, message; validate; notify a recipient; acknowledge the sender — is table stakes, not differentiation. This package is a candidate only as a short-term accelerator on a legacy stack. Frame the choice honestly as "a few hours adopting something we then own and maintain forever" versus "one to three days building something we already own outright." It is not a vendor evaluation.
Shipping lead capture this quarter. If a landing page, support inbox, or events page must ship and the app is on Laravel 5.x, a drop-in route + controller + validation + Blade view + mail dispatch compresses scoping from days to hours. The gate is binary: on Laravel 6+ the Composer constraints conflict, and forcing them moves runtime breakage into the on-call rotation. Thirty minutes of version verification closes the question.
Sequencing and capacity allocation. Treat contact-form infrastructure as a low-investment, low-risk workstream that should never block a release. Decide in the plan whether it lives in-house (a FormRequest, a queued Mailable, a contact_messages table, a rate limiter) or as an embedded dependency, rather than letting it arrive as an unestimated ticket mid-sprint.
Maintenance-burden forecasting. Zero stars, zero dependents, no evident CI or disclosure channel. Adopting this is functionally vendoring: the team inherits patching, framework compatibility, and security response indefinitely. That can be a legitimate PM decision, but record it as "adopt and maintain forever," never as "buy," so the cost surfaces in future planning instead of as a surprise.
Risk scoping on a customer-facing, PII-bearing surface. Contact forms are an abuse vector and a data-handling surface. The package does not own rate limiting, bot mitigation, header-injection defense, deliverability monitoring, or retention/deletion policy. Naming those as product requirements — not package features — is the genuinely valuable output of this evaluation, more so than the adoption call itself.
Use cases it plausibly serves: conventional marketing and support contact forms, an internal admin inbox for submissions, a basic honeypot bot check, and email notification on submit — the standard 80% case, delivered fast.
Use cases it must not drive: multi-tenant routing rules, CRM or ticketing handoff, SLA tracking, compliance-grade audit trails, or regional data residency. Those are designed product features, and a thin form backend will fight every one of them.
Consider it only when all of the following hold:
ContactSender contract) and add the missing basics — throttling, a honeypot, persistence so failed sends leave a record, queued dispatch, and strict handling of anything user-supplied that reaches a mail header.Look elsewhere — or build natively — when any of the following is true:
FormRequest, a queued Mailable, a migration, and a rate limiter is one to three days and removes a permanent dependency from the critical path.Treat it as a specification, not a dependency. Even if you decline adoption, the read-through has value: document the behavioural contract — fields, validation rules, recipient configuration, copy, success and failure UX — and that document becomes the ticket for the native rebuild, which on a Laravel 5 app is a question of when, not if.
To executives — one paragraph: A contact form is a commodity, not a differentiator, and this package is a modest shortcut available only to applications on an end-of-life framework. On Laravel 5.x it can save roughly one to two engineering days on a form we would otherwise build; on anything newer it does not install. The real decision is not "which package" but "do we own this code." Adopting it means we inherit maintenance, patching, and security response for a component nobody supports, so I recommend we treat the saving as small and one-time, budget the ownership tail explicitly, and make the framework upgrade the decision that retires the dependency. Either way, the abuse protection, deliverability monitoring, and data-retention rules are product requirements we must fund ourselves — they are not included.
To engineering leads — the ask: Confirm the framework line first (composer why-not); if it conflicts, we stop and scope native work at one to three days. If it installs, we timebox adoption to a day, wrap it behind a first-party ContactSender interface so the dependency never leaks into application code, and land four things before it goes near a customer: rate limiting, a honeypot, a contact_messages table so failed transport never silently loses an inquiry, and queued dispatch so request latency is not tied to SMTP. Add the three tests that matter — happy path, validation failure, honeypot — and pin the fork by commit SHA if we modify it.
To the wider business — what this is not: it is not a CRM integration, a ticketing handoff, an SLA tracker, or a compliance-grade audit trail. It is a form that sends an email. Sizing it any larger sets an expectation the code cannot meet, and the first failed delivery will surface as a customer complaint rather than an alert unless we build the observability ourselves.
How can I help you explore Laravel packages today?