bold-commerce/bold-shopify-toolkit
A Laravel toolkit from Bold Commerce for building Shopify integrations. It wraps Shopify's Admin API in a fluent PHP client, with support for GraphQL and REST queries, OAuth token handling, webhook verification, and common store operations so you can ship custom apps faster.
Verdict: Adopt conditionally. This is a maintenance release wearing a major-version label, but one of the four changes can break existing installs and two are unverifiable from the release notes alone.
Package shape (inferred): A Laravel-integrated Shopify Admin API client — Client for transport/auth, Cart/Asset as domain resources, Base providing a hand-rolled model hydration layer (unserializeModel()). Distributed as a Composer library with a Laravel service provider and an illuminate/support dependency. Treat the identity assumption as an open item to confirm before sign-off.
Architecture fit. Low-coupling, outbound-only adapter — no queue, scheduler, or persistence assumptions, so it slots alongside existing Eloquent models without dictating schema. The main architectural concern predates this release: Base::unserializeModel() is a bespoke serialization path that runs parallel to Eloquent/JsonSerializable and is not covered by Laravel's own upgrade guarantees. Every PHP-version-driven change in this release lands in exactly that code path. Budget review time for it disproportionate to its size.
Integration feasibility. High, with one caveat. The tag is byte-identical to 8.0.0-beta.6, which is genuinely useful: the artifact you can regression-test in staging is the artifact that ships, with no last-minute delta between validation and release. The caveat is that "byte-identical to a beta" also means production-hardening is unproven beyond the vendor's own testing against Shopify Admin API 2026-07 (SHOP-12163). Plan for your own canary rather than inheriting the vendor's confidence.
Technical risk — ranked.
illuminate/support widened to ^12 || ^13 (highest). A widened constraint is additive, but the release notes do not state the prior constraint. If the previous floor was ^10.48 || ^11, this release silently drops Laravel 10 and 11 — a hard Composer resolution failure at deploy, not a runtime deprecation. This is almost certainly the actual reason for the major version bump, and it is the item to confirm before doing anything else.null are unaffected. It is a signature-level break for anyone subclassing Asset, Base, Cart, or Client and overriding those methods — LSP violations become fatal errors rather than notices. It also invalidates any reflection- or static-analysis-based snapshots in your test suite.ReflectionProperty::setAccessible() removal (lowest). Genuinely a no-op on PHP 8.1+, where reflection ignores accessibility by default. Behaviorally inert; no action needed beyond confirming your minimum PHP is ≥8.1.Key questions for the vendor (or for a spike):
illuminate/support constraint in 7.x, and is Laravel 10/11 support permanently dropped or returning in a patch?composer.json for 8.0.0, and is 8.5 the minimum or just the tested maximum?beta.6 in production anywhere, and for how long? "Regression-tested against 2026-07" describes an integration suite, not production exposure.Stack fit. Target state is PHP 8.4/8.5 on Laravel 12 or 13. Verify against a real composer.json, not the notes: run composer why-not <vendor>/<package> 8.0.0 in each application you intend to upgrade, and inspect the resolved transitive graph (Guzzle, psr/*, and any ramsey/* UUID dependency are the usual suspects for secondary conflicts). The ^12 || ^13 widening is only good news if you are already on 12+.
Migration path. Do not treat this as a patch upgrade despite the small diff.
8.0.0 explicitly (not ^8.0 with a beta floating nearby) and commit the lockfile.extends Asset|Base|Cart|Client and for any method that overrides a public signature on those classes — that is your nullable-type blast radius.beta.6 in CI as a one-time check — if it is byte-identical as claimed, this should be an empty diff and takes minutes to prove.Compatibility matrix. PHP 8.3 / 8.4 / 8.5 × Laravel 12 / 13 × Shopify API 2026-07. Explicitly mark PHP ≤8.2 and Laravel ≤11 as unsupported rather than "untested" — the Composer constraint will enforce it anyway, and teams will hit the wall at deploy time if you don't say so first.
Sequencing. Decouple the two upgrades. Land the Laravel 13 move first (or defer it), then take 8.0.0 on a runtime you have already validated. If you can only do one this quarter, and you are on Laravel 11 or older, this release is not available to you at all — the constraint is the gate, not the PHP changes. Staging against a real Shopify development store, one week of canary traffic, then production, is proportionate for a release whose only behavioral claims are PHP-version compatibility.
Maintenance. The dominant ongoing cost is not this release — it is Shopify's quarterly Admin API cadence (2026-01 / -04 / -07 / -10), each with roughly a twelve-month support window. Expect to take a package release at least annually just to stay inside the window, whether or not you want the feature delta. Track the API-version pin as a first-class operational metric with a sunset date attached, alongside the PHP minor version — the two deprecation clocks in this package run on different schedules and will not conveniently coincide.
Support. 8.0.0 being byte-identical to beta.6 cuts both ways: any known issues filed against the beta carry over unchanged, so search the beta issue history before you file anything new. Vendor responsiveness on a major version is the thing to probe early — if the illuminate/support narrowing is a mistake rather than intentional, you want that clarified while you still have upgrade options.
Scaling. The library is stateless and adds no infrastructure footprint; scale is bounded entirely by Shopify's throttling, not by the package. Confirm whether rate-limit handling is provided or deferred. If deferred, every caller needs its own backoff, and a burst of catalog or order syncs will surface as 429s under load rather than as a clean error. This is the single most likely production incident vector and it is unchanged by this release.
Failure modes to instrument.
illuminate/support narrowing. Detect in CI, not at 2 a.m.unserializeModel() failing on unfamiliar payload shapes after a Shopify schema change. Log and sample hydration failures; do not let them become silent nulls.Ramp-up. One to two days for a Laravel developer to be productive with Client, Cart, and Asset. The Base hydration layer is the real onboarding cost — half a day to a day to understand how payloads become models, and it is the layer most likely to be touched during any PHP upgrade, so the person who owns it should be the person who runs this migration. Budget one engineer for a week end-to-end, including staging validation and canary review.
How can I help you explore Laravel packages today?