portside-labs/laravel-shopify
Laravel Shopify by Portside Labs is a lightweight integration for building Shopify apps with Laravel. It streamlines API client setup, OAuth authentication, webhook routing, and configuration so you can connect your app to Shopify stores with less boilerplate and focus on business logic.
composer create-project plus php artisan shopify:install and shopify:dev gets a working development-store app in two commands, so a spike can be scoped in hours rather than days. That shifts the default from "start from the Node/Remix template because it is the path of least resistance" to "start from Laravel if the team already knows PHP."shopify:dev tunnel/config automation directly affect how quickly you can put a reviewable app in front of a stakeholder or design partner. This is a roadmap-sequencing input: it makes a "thin vertical slice in a dev store" milestone realistic in week one.shopify.app.dev.toml git-ignored, SHOPIFY_APP_CONFIG=dev, production left in shopify.app.toml, named configs like staging respected) is the package taking a position on how Shopify app configs should be managed. Adopting it means adopting that convention; the decision to make is whether your team standardizes on it or keeps its own config layering.shopify:deploy with --production, --config=staging, --env=production, and explicit refusals (unlinked config, production URL still a tunnel/localhost/*.test/example.com) is a guardrail, not just a convenience. This supports a decision to let the package own the "deploy the Shopify app config" step rather than scripting it in CI yourself.app/uninstalled, app/scopes_update, and the three compliance topics, plus webhook API-version backfill, turns a recurring source of App Store review failures into a default. This supports roadmap decisions about when to invest in submission work versus feature work.--no-interaction implying --allow-updates, --skip-checks, --message, --app-version, --no-release, --allow-updates, --allow-deletes are the knobs that decide whether Shopify deploys live in the same pipeline as the Laravel app or in a separate, gated job.shopify:doctor now surfaces missing billing settings with links without failing, while still enforcing billing when a route uses the subscribed middleware. That lets you defer billing setup in dev without silently shipping an app that bypasses plan checks.Consider it when:
Look elsewhere when:
shopify.app.toml / shopify.app.dev.toml convention.Note the upgrade implication for existing local setups: dev commands now target shopify.app.dev.toml unless SHOPIFY_APP_CONFIG names another config. Teams that have been developing against shopify.app.toml must copy it to shopify.app.dev.toml or re-run shopify:install. That is a one-time local migration, not a production breaking change, but it should be scheduled.
For executives: This release turns a Laravel-based Shopify app from a multi-day setup into a two-command start, and it makes releasing that app materially safer. Development configuration is now separated from production by default, and the new shopify:deploy command refuses to push a production config that still points at a tunnel, localhost, or a placeholder domain — the most common way a Shopify app breaks for live merchants. Webhook subscriptions required for App Store compliance are re-applied automatically if the Shopify CLI drops them. Net effect: lower time-to-first-demo, fewer production incidents from configuration drift, and less custom glue code to own.
For engineering: The package now owns three things previously left to scripts and discipline: (1) local setup and tunnel wiring via shopify:dev, which also repoints application_url, redirect_urls, and APP_URL at the tunnel and preserves redirect paths; (2) config hygiene via the shopify.app.dev.toml / shopify.app.toml split with SHOPIFY_APP_CONFIG and named configs; (3) release via shopify:deploy, which runs shopify:doctor, always names the configuration so the CLI cannot deploy the wrong one, enforces the environment guardrails, and passes through --message, --app-version, --no-release, --allow-updates, --allow-deletes. For CI, --no-interaction adds --allow-updates, and --skip-checks bypasses the doctor. shopify:doctor now reports missing billing settings as guidance rather than a failure, while billing enforcement via the subscribed middleware is unchanged. One caveat to communicate: locally, the dev commands now operate on shopify.app.dev.toml by default, so anyone who has been developing against shopify.app.toml should copy it across or run php artisan shopify:install once.
How can I help you explore Laravel packages today?