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

Laravel Mobile Pass Laravel Package

spatie/laravel-mobile-pass

Generate Apple Wallet and Google Wallet passes for boarding passes, event tickets, coupons, store cards, membership cards, and gift cards—with push updates to keep issued passes current on users' devices.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

Architecture fit. The package is a first-party-style Spatie Laravel package: a service provider, publishable config (mobile-pass.php), a MobilePass Eloquent model with its own migration, and builder classes for Apple PassKit (.pkpass) and Google Wallet (class + object). It slots cleanly into a Laravel monolith or a Laravel API service that already owns ticketing, membership, loyalty, or coupon domain data. The model-centric design means wallet passes become another persisted aggregate rather than a stateless export, which is the right shape for a TPM: it gives you an auditable record of what was issued, to whom, and when it was last updated. The PushPassUpdateJob queue opt-in and the platform-aware MobilePass::boot() hook mean pass updates are event-driven rather than a bespoke sync script — a meaningful architectural win over hand-rolling PassKit signing and Google Wallet REST calls.

Integration feasibility. Composer install plus vendor:publish (config + migrations) gets you to a working local demo quickly; Spatie ships a live demo app at mobile-pass-demo.spatie.be with source, which de-risks the first spike. The real effort is credential provisioning, not code: an Apple Developer Program membership, a Pass Type ID certificate plus WWDR intermediate, and a Google Wallet issuer account with service-account credentials and business verification. Both are external lead-time items, and Apple's webServiceURL must be HTTPS (the package now throws InvalidConfig::webserviceHostMustBeHttps rather than emitting a pass Wallet will reject — a good failure mode). Feasible for a small team in a few sprints per pass type, but the Google issuer approval is the schedule risk, not the Laravel work.

Technical risk. Three buckets. (1) Platform dependency: the package is a thin wrapper over two proprietary, evolving ecosystems; Apple certificate expiry and Google Wallet API/schema changes are ongoing operational obligations. (2) Adoption signal: 339 stars but 0 dependents is a weak production-validation signal — you would be an early production adopter, and the opportunity score (33.75) suggests the ecosystem around it is thin. (3) Deliberate gaps: Google local-path image hosting is deferred (object-level only, Image::fromUrl() required), Smart Tap NFC is deferred, and automatic JWKS fetch for callback signing-key verification is deferred — so callback signature verification is manual. The changelog shows healthy minor-version velocity (1.0.0 through 1.8.1, with i18n, iBeacon, remote images, and module support landing over time), but also a required schema migration at 1.0.5 and a few serialization/i18n bugfixes (falsy "0" values, timeStyle re-hydration) that indicate the edge cases are still being shaken out.

Key questions. Do we hold (or can we obtain) an Apple Developer Program membership and a Pass Type ID certificate, and who owns annual rotation? Has our Google Wallet issuer account passed business verification, and do we have service-account credentials for the target environment? Which pass types are in scope (event ticket, boarding pass, loyalty, offer, generic), and does the Apple/Google feature matrix cover each — particularly background images, locations, iBeacon, and localization? What is the acceptable latency for a pass update to appear on a device, and do we have queue workers sized for PushPassUpdateJob? Will we use the default MobilePass model/table or override mobile-pass.models.mobile_pass (a 1.2.1 fix shows override paths regress)? Do we need a custom table for multi-tenancy or existing ticketing schema? What PII lands in a signed pass payload, and what is our retention/revocation policy? Do we need callback signature verification now, given JWKS is manual?

Integration Approach

Stack fit. Standard Laravel (PHP 8.x, Composer, Eloquent, queue). It expects a queue connection for update pushes (MOBILE_PASS_QUEUE_CONNECTION), outbound HTTPS to Apple/Google, and a publicly reachable HTTPS host for the Apple web service and Google callback route (/mobile-pass/google/callbacks). No new infrastructure category — it reuses the queue, storage, and HTTP stack we already run. If we are on Laravel with MySQL/Postgres and Redis queues, fit is high; if we run serverless or queue-less, the synchronous fallback for updates becomes a latency and reliability concern.

Migration path. Greenfield is easiest: install, publish, model, first pass type. For an existing ticketing or CRM system, the work is mapping domain entities (ticket, member, coupon) onto builders and deciding whether MobilePass rows are derived from or authoritative over the source record. Because the package owns its migration, plan for coexistence with existing tables and avoid coupling business logic to the package's schema beyond the documented model. The 1.0.5 upgrade note (paste-in migration routing Apple lookups by pass_serial) is a reminder to treat minor upgrades as potentially schema-touching.

Compatibility. Pin a minor version range and read UPGRADING.md before each bump. Confirm the package's Laravel/PHP constraints against our runtime before committing. The Apple side demands HTTPS for webServiceURL — no local HTTP-only staging shortcuts; use a tunneling host or a staging domain with a real certificate. Google requires issuer ID, service account JSON, and object/class IDs scoped per environment. Verify our CI can run the package's signing path (certificate files as secrets, not committed).

Sequencing. (1) Credential workstream in parallel with engineering: Apple cert + WWDR, Google issuer verification + service account. (2) Spike: install and reproduce the demo pass types locally; validate on a physical iPhone and Android device. (3) Pick one pass type with the clearest business case (usually event ticket or loyalty) and ship it end-to-end in staging. (4) Wire pass-update pushes through the queue and measure device latency. (5) Add Google save/remove callbacks and consume the GoogleMobilePassSaved / GoogleMobilePassRemoved events. (6) Harden: certificate rotation runbook, callback verification, image hosting. (7) Expand to remaining pass types and locales. Do not attempt dual-platform parity for all pass types in the first release.

Operational Impact

Maintenance. Two clocks run: our dependency-upgrade clock and the platforms'. Apple Pass Type certificates expire (typically annually) and an expired certificate silently breaks issuance and updates — this must be a calendar-owned runbook with an owner and an alert. The package itself ships frequent minor releases; budget a recurring maintenance slot and a version-pinning policy. Expect occasional required migrations and watch UPGRADING.md.

Support. MIT, Spatie-maintained, community PRs, no SLA. Contributors are active (recent PRs from multiple community members), but with 0 dependents we cannot assume a large troubleshooting corpus. Plan for internal ownership of wallet-domain expertise and consider commercial Spatie support or a consulting retainer if wallet passes become business-critical. Do not treat GitHub issues as a support channel for production incidents.

Scaling. Pass generation is CPU-bound (image handling, bundling @1x/@2x/@3x, signing, zipping) — fine at low volume, but batch issuance (e.g., a 50k-ticket event) should be chunked through queues and load-tested, not run in a request. Pass updates traverse APNs (Apple) and Google Wallet PATCH calls, both rate-limited and outside our control; the queue is the pressure valve, and backlog directly becomes stale passes on devices. Remote image URLs introduce a third-party availability dependency for pass rendering. Storage growth is modest (one row per issued pass plus images), but plan for archival/retention of expired passes.

Failure modes. (a) Expired or misconfigured Apple certificate → passes fail to install or update, often with poor error surface. (b) Non-HTTPS webServiceURL → hard exception at build (good) but a deploy-time trap if config drifts. (c) APNs push failures and Google PATCH failures → silently stale passes; needs delivery observability, not just job success. (d) Callback verification failures → missed save/remove events and skewed engagement metrics; JWKS is manual, so this needs explicit implementation. (e) Unreachable remote image URLs → blank or rejected passes. (f) Serialization/i18n edge cases (falsy "0", timezone/timeStyle, per-locale fields) → incorrect data on device; Apple and Google i18n landed only in 1.7.x, so test localized passes explicitly. (g) Queue backlog → delayed updates during peak events. (h) Model override regressions if we customize mobile-pass.models.mobile_pass.

Ramp-up. Laravel developers ramp quickly on the package API; the specialized knowledge is the wallet domain — PassKit field semantics, Google Wallet class/object lifecycle, certificate handling, and APNs behavior. The README, docs site, changelog, and demo app give a solid path; estimate one to two sprints to a production-quality single pass type including credential setup and device testing, and additional sprints per pass type and platform for parity, localization, callbacks, and observability. Budget explicit time for the Apple/Google account provisioning lead times, which are the most likely source of schedule slip.

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.
adachsoft/changelog-linter
adachsoft/collection
payerurl/telegrambot-crypto-payment-instant-payout
dskripchenko/laravel-hybrid-search
riorizkyrainey/lara-ced
mehedimi/static-vel
zharp/zharp
nonsapiens/bigquery-model-sync
lgu-bayambang-ict-office/lgu-laravel-development-standards
andydefer/laravel-support
se7enxweb/flysystem
lampwick/laravel
jeslage/statamic-emojis
micahdshackelford/rmap-laravel
draftsmaninc/draftsman
square-bit/laravel-volition
himito/laravel-mailman
htinlynn/genius-helper
maco-studios/hephaestus
adachsoft/php-code-style