fourlabs/xero-bundle
A PHP package that bundles Xero accounting integration for your application, offering configuration and service wiring to connect to the Xero API and work with invoices, contacts, and other accounting data with less boilerplate.
Architecture fit. Unchanged and now confirmed as a non-starter. This is a Symfony bundle, not a Laravel package: a Bundle subclass, a DI extension, a configuration tree, and service definitions wiring an SDK into Symfony's container. Laravel does not implement bundle registration, kernel bootstrapping, or compiler passes, so none of that glue executes in a Laravel app. Release 1.2.0 does nothing to alter this — it contains no Laravel service provider, facade, or publishable config. The residual value remains zero; everything usable reduces to the underlying calcinai/xero-php SDK, which you would install directly.
Integration feasibility. Low, and the release narrows the remaining uncertainty rather than resolving it. The 1.2.0 changelog is a single line: "Bump calcinai/xero-php to 1.8." That answers our first key question — the bundle constrains the 1.x line of the SDK, not the 2.x line that introduced the OAuth 2.0 client. Xero decommissioned OAuth 1.0a in December 2019, so a 1.x-era SDK is a probable hard blocker for authenticating against the modern API, not a fixable one. This was previously a "likely" blocker pending inspection; it is now close to confirmed. Verify whether 1.8 backported any OAuth 2.0 support before closing the question entirely, but assume it did not.
Technical risk. High and essentially unchanged, with one signal worth noting:
Key questions.
calcinai/xero-php 1.8 contain any OAuth 2.0 authorization-code flow support, or does 2.x remain the only viable path? (Now the gating question.)Stack fit. Do not install this package. Adopt calcinai/xero-php (2.x, or a maintained equivalent) directly and build a thin Laravel-native adapter — a XeroServiceProvider, config/xero.php, a XeroClientFactory, and a XeroTokenRepository backed by the database for OAuth 2.0 refresh tokens per tenant. Roughly 150–250 lines, fully owned, with constraints we control. Release 1.2.0 does not change this recommendation by a single line of Laravel glue.
Migration path. Treat the bundle as reference architecture, not a dependency. Read its service definitions and config schema to shortcut design decisions, then discard the code — noting that the config schema in 1.2.0 reflects 1.x SDK semantics and should not be copied forward uncritically into a 2.x client. Hide the SDK behind a XeroGateway interface in our domain layer so the client is swappable if we later move to Xero's own OpenAPI-generated client.
Compatibility. The 1.8 bump does not bring the package into compatibility with modern Laravel; it moves the pin within a range that still predates Symfony 6/7 components. Even a forced install leaves bundle classes autoloadable but unused — dead weight in the dependency graph and a false signal in code review.
Sequencing.
Maintenance. We own it outright — adapter plus a pinned SDK. Upstream will not ship fixes; the 1.2.0 release demonstrates the failure mode directly: seven years of silence followed by a single dependency bump. Treat that as the ceiling of upstream responsiveness and budget a recurring line item (est. 2–4 days/quarter) for Xero API drift, SDK security patches, and OAuth flow changes.
Support. Effectively self-support. Two stars and zero dependents means no community to escalate to and no third party who has validated this 1.8 combination. Primary references become Xero's developer documentation and the SDK's own issue tracker.
Scaling. Xero's constraints dominate: ~60 calls/minute and ~5,000/day per tenant, low concurrency. Every outbound call routes through a queued job with a shared rate limiter and exponential backoff on 429. Token refresh must be centralised and locked — concurrent refresh attempts across workers invalidate tokens and cause cascading auth failures, the most common failure mode in Xero integrations.
Failure modes to design for explicitly:
Ramp-up. Low technical learning curve (1–2 days for a Laravel developer to wire the SDK), but the real cost is Xero domain fluency — accounting semantics, tax types, tracking categories, tenant scoping. Budget 1–2 weeks before the first integration is genuinely trustworthy. The 1.2.0 release does not reduce that ramp-up at all; it confirms the bundle's wiring is a historical reference, not a starting point.
How can I help you explore Laravel packages today?