ghijk/donation-checkout
ghijk/donation-checkout is a Laravel package for adding donation checkout flows to your application, helping you collect one-time or recurring contributions with configurable amounts and a streamlined checkout experience.
Architecture fit. donation-checkout is a small, single-purpose Laravel package that bolts a public donation endpoint onto a Statamic-backed site and delegates payment processing to Stripe. Architecturally it is a peripheral component: it does not own domain data beyond Stripe customer references and optional Statamic user records, and it sits behind the host application's routing, middleware, and cache layers. That is a good fit for a TPM's preferred risk posture — a narrow blast radius, replaceable in a quarter if the maintainer relationship sours. It is a poor fit if the organisation expects the package to own reconciliation, receipts, refunds, or financial reporting; v2.1.7 does not move it in that direction.
Integration feasibility. Integration is a composer require plus configuration, not a service build. The work is concentrated in configuration and policy decisions rather than code: Stripe keys and webhook secrets, rate-limit thresholds, the create_users flag, and the email normalisation behaviour that now silently rewrites donor input. The new create_users option (default true) is the most consequential integration detail in this release — it means a default install will create Statamic user records for every donor, which is a data-protection and list-hygiene decision that should be made explicitly rather than inherited from a default.
Technical risk. Three items dominate:
Secondary risks: single-maintainer project, two PRs of change surface, and a test suite of 45 tests / 130 assertions — thin but proportionate for the package's size, and notable that it includes a clean composer audit.
Key questions.
create_users on or off by default for our deployment, and who signs off on the privacy impact?Stack fit. Requires PHP and Laravel 12.69.3+, CommonMark 2.10.3+, Flysystem 3.36.0+, plus Statamic for the user-creation path. The dependency set is mainstream and well-vetted; nothing exotic is introduced. Applications already on Laravel 12 with Statamic are a direct fit and should see a low-effort adoption. Applications on Laravel 10/11 are a framework-upgrade project with this package as the trigger, not the cause.
Migration path. The composer constraints are the good news: affected dependency versions cannot be installed, so the resolver fails loudly rather than silently shipping a vulnerable graph. Migration is therefore self-verifying at install time. The behavioural changes to plan for are (a) donor input is now bounded and emails normalised, so stored records may differ from historical records and any downstream matching on raw email will need review; (b) Stripe customers are reused rather than recreated, which will reduce customer-object sprawl but changes what a "new donor" looks like in Stripe; (c) Stripe API failures return generic responses, so any client-side or test-side assertion on error text must be updated.
Compatibility. Two compatibility surfaces to check explicitly: Statamic version alignment (the create_users path touches Statamic's user repository) and cache driver support for the rate limiter. Rate limiting on a per-process or file cache will not behave correctly across multiple application servers; a shared Redis or database cache is required for the stated limits to be accurate in a load-balanced deployment.
Sequencing. Recommended order:
composer audit, run the package test suite, and verify the rate limiter against the production cache driver.create_users and rate-limit values per property before promotion — do not ship defaults to production by inaction.Maintenance. Low steady-state cost, but the maintenance surface is the dependency graph, not the package code. Because fixes arrive as version floors, every security release becomes a compatibility gate — we should expect to be pushed forward on Laravel, CommonMark, and Flysystem on the maintainer's cadence, not ours. Budget a recurring dependency-review slot rather than a one-off install.
Support. The generic Stripe responses shift diagnostic burden onto our own logging and onto the maintainer's issue tracker. First-line support will not be able to distinguish a declined card from a misconfigured key from an outage without server-side logs. Conversely, the create_users flag and rate-limit configuration are the two settings most likely to generate tickets, and both should be documented in our runbook rather than left to the README.
Scaling. The package is stateless apart from Stripe customer objects and Statamic users, so it scales with the host application. The real scaling constraint is the per-IP rate limiter: behind a load balancer it requires a shared cache, and behind NAT it will throttle aggregates of legitimate users. Expect to raise the daily limit materially for any event-driven or institutional traffic and to monitor 429 counts as a conversion metric, not just an abuse metric.
Failure modes. Distinct failure classes and their observability:
create_users true by default, a spike in traffic creates Statamic users, which may trigger downstream email or CRM automations nobody intended.Ramp-up. Engineering effort is measured in hours for a Laravel 12 + Statamic property: install, configure, staging verification, log instrumentation, production promotion. Product and legal effort is the longer pole — deciding create_users, reviewing the privacy impact of donor user records, and setting rate limits against expected traffic. For properties below Laravel 12.69.3, ramp-up is a multi-week framework upgrade owned by platform engineering, and this package should be listed as the business driver for prioritising it.
How can I help you explore Laravel packages today?