taldres/laravel-waitlist
taldres/laravel-waitlist is a lightweight Laravel package for adding a waitlist to your app. Let users join, store signups, verify emails, and manage entries with configurable models, migrations, and routes—ideal for launching products with early-access queues.
TPM recommendation: Treat v0.2.0 as a capability-expanding but integration-breaking release. Suitable for greenfield Laravel 13 waitlist use; for existing v0.1.x integrations, plan a controlled upgrade rather than a routine composer update.
Architecture fit. Laravel-native package covering the waitlist domain: lists/projects, double opt-in, tokenized unsubscribe, policies, events, artisan commands, mail/view scaffolding. v0.2.0 adds public count/position, reconfirmation and lapse retention, CSV import, in-app time-trap spam protection, and a publishable-key resolver. Good fit if the product needs consent-aware waitlist behavior without building the state machine. Coupling to Laravel 13 conventions (attributes, form requests, container bindings) raises the minimum platform floor.
Integration feasibility. Medium. Greenfield: composer install, migrations, config, optional waitlist:install --mail, and JS client. Existing: audit custom code for removed spam methods, renamed link generators, policy method change, enum cases, model factory attribute, and mail route semantics. Import provides a migration path from existing lists, but consent provenance must be validated before importing confirmed addresses without mail.
Technical risk. Medium-high. Breaking changes in a 0.x package mean it is not API-stable. Migration risks: MySQL/MariaDB widen_waitlist_wordings_table shrinks project to 100 characters and fails if longer data exists; publishing all migrations duplicates the first five; route cache must be rebuilt. Runtime risks: exhaustive match over enums breaks on new cases; GET/POST mail link split changes integration semantics; older JS clients do not read count/position/challenge/answer_by, and the release note says to leave reconfirm_after_days unset and not bind TimeTrapSpamProtector on pages using older clients. New public endpoints are opt-in, privacy-conscious (position by token, rounded counts), but still need rate limiting and WAF review. Reconfirmation adds a lapsed state and mail volume; import of confirmed addresses without mail is compliance-sensitive.
Key questions.
ListPolicy, bind a custom LinkGenerator, or use Waitlist::verifySpamUsing() / spamProtector()?waitlist_wordings.project values exceed 100 characters?@taldres/laravel-waitlist JS client version is deployed, and which pages use count/position/challenge/answer_by?route:cache after deploy?GET /waitlist/count and the position endpoint?Stack fit. Good for Laravel 13 apps using Eloquent, policies, queued mail, and artisan commands. Optional browser pages require @taldres/laravel-waitlist 0.2.0+ for new fields. If frontend cannot upgrade immediately, defer public count/position and reconfirmation, or avoid binding TimeTrapSpamProtector on affected pages per release guidance.
Migration path.
waitlist:install --mail, bind SpamProtector explicitly (TimeTrapSpamProtector or ClosureSpamProtector), wire JS client 0.2.0+, enable public endpoints per list.migrate, run route:cache. Replace verifySpamUsing() / spamProtector() with container binding; rename ConfirmationUrlGenerator / DefaultConfirmationUrlGenerator bindings to LinkGenerator / DefaultLinkGenerator; change ListPolicy::doubleOptIn to doubleOptIn(); add factories for extended models; update enum matches; update mail templates/integrations expecting GET-only links to use POST for confirm.store / unsubscribe.store. Audit project name length before the widen migration.Compatibility. JS client 0.2.0+ required for count, position, challenge, and answer_by. Route URLs and answers stay, but HTTP method semantics change: GET reports, POST acts. MySQL/MariaDB project column shrink is a data-compatibility risk. 0.x breaking changes mean downstream customizations are the main compatibility risk. Test mail client prefetch behavior; GET no longer acts, which is intended but may surprise custom integrations. Confirm queue and scheduler compatibility for ReconfirmationRequested.
Sequencing.
TimeTrapSpamProtector if chosen.EntryImported consent timestamps.waitlist:prune --isolated.Maintenance. 0.x package; budget for minor-version breaking changes. Assign ownership for package upgrades, custom bindings, mail templates, and JS client. Keep overrides thin. Track release notes; contribution guide and templates help upstream but do not remove internal maintenance. New surfaces (public endpoints, reconfirmation job, import, spam protector) add test cases.
Support. Docs, skills, Boost guideline, and referrals example improve onboarding. Support must understand new subscription states (lapsed), reconfirmation emails, import consent provenance, and public count/position behavior. Provide runbooks for waitlist:import, waitlist:prune --isolated, waitlist:rekey --isolated, waitlist:wording --isolated, and the mail link GET/POST changes. FAQ for “why is count null below ten” and “why does position require token”.
Scaling. Count is cached for one minute and rounded down to ten; position is by token; both are opt-in per list and off without double opt-in — good privacy and scaling defaults. Public endpoints still need rate limiting/CDN/WAF. Import may be heavy; batch large CSVs and avoid peak. Reconfirmation increases mail volume; ensure queue workers and mail provider capacity. Use --isolated on scheduled prune/rekey/wording to avoid overlapping runs. MySQL/MariaDB widen migration may lock or rebuild the wordings table; schedule appropriately.
Failure modes.
UnhandledMatchError from new enum cases.TimeTrapSpamProtector on those pages may break UX per release note.SpamProtector is not bound; TimeTrapSpamProtector is not default.Ramp-up. Laravel team: 1–3 days for greenfield; 1–2 sprints for an existing customized integration. Frontend: JS client upgrade and page QA. Ops/support: runbooks and monitoring for new commands/states. Legal/compliance: review import consent and reconfirmation policy before enabling. Overall leverage is high for consent-aware waitlist features, but only with deliberate upgrade and feature-flag rollout.
How can I help you explore Laravel packages today?