Troubleshooting.
Test the Google Wallet flow, fix a button that does not appear, and understand the local-development limits.
On this page
Testing
Test mode checklist
- Make sure a plan includes Google Wallet (Gold and Platinum by default), or grant it to the partner on the Permissions tab
- Configure your issuer ID and credentials (in Settings → Integrations or in
.env) - Create a test card and enable Google Wallet
- Enroll a test member
- Verify the "Add to Google Wallet" button appears
- Save the pass and check it in Google Wallet
- Earn points or stamps and verify the pass updates
Common issues
| Problem | Solution |
|---|---|
| Button doesn't appear | Check platform credentials, plan entitlement (or per-partner grant), and the item toggle. A voucher must be redeemable; a prepaid pass must belong to the member and not be dismissed |
| "Google Wallet credentials not configured" | Verify the issuer ID and credential path/JSON in Settings → Integrations, or GOOGLE_WALLET_ISSUER_ID and the credential path/JSON in .env |
| "not a valid id" when clicking button | The pass was never created on Google's servers. Check the logs for provisioning errors. Most common cause: image URLs are not publicly accessible (see local development note below). Also verify your GOOGLE_WALLET_ISSUER_ID matches the Issuer ID in the Google Pay & Wallet Console. |
| "Image cannot be loaded" in logs | Google needs to fetch card images from a public URL. Local development URLs like http://localhost or http://app.test will fail. Use a tunnel (ngrok, Expose) or test on a publicly accessible staging server. |
| Pass doesn't update after earning points/stamps | If you use the sync queue driver (default), updates happen inline. If you use database or redis, make sure your queue worker processes the google-wallet queue: php artisan queue:work --queue=default,google-wallet |
| Pass shows wrong data | Check application logs and the queue worker first. Turning Google Wallet off revokes all issued passes for the item; do not use this as a routine refresh |
Local development
Google Wallet provisioning requires a publicly accessible server. Google's API fetches card images (logo, background) from your server. On local development, this fails because URLs like http://app.test are not reachable by Google.
What works locally:
- Configuring credentials and issuer ID
- Seeing the "Add to Google Wallet" button on the page
- Verifying the button generates a valid JWT
What requires a public URL:
- Saving a pass to Google Wallet (Google needs to fetch images)
- Pass provisioning (class and object creation)
To test the full flow, either deploy to a staging server or use a tunnel tool like ngrok to expose your local server.
Feedback and bug reports
If you encounter issues with Google Wallet passes:
- Note the specific card, stamp card, voucher, or prepaid pass and member involved
- Check the application logs for
Google Walletentries - Report the issue through your usual support channel, including:
- What you expected to happen
- What happened
- The card type (loyalty, stamp, voucher, or prepaid)
- Whether the pass ever reached Google Wallet
Technical details
| Detail | Value |
|---|---|
| Queue | google-wallet (optional, only relevant if you run a dedicated queue worker with database or redis driver) |
| Retry policy | Up to 3 attempts; the first two retry delays are 10s and 30s |
| Save flow | Synchronous provisioning with async fallback. If Google's servers respond within the timeout, the system redirects the member to Google Wallet. If provisioning times out, the system queues the job in the background and shows a retry message |
| Pass types | LoyaltyObject (loyalty cards), GenericObject (stamp cards and prepaid passes), OfferObject (vouchers) |
| QR codes | Each pass contains a staff-facing URL (earn points, add stamps, use a pass, or redeem a voucher) |
| Image source | Google fetches the logo and background images from your server, so they must be publicly accessible |