dcblogdev/laravel-xero
Laravel package for integrating the Xero accounting API into your app. Handles OAuth 2.0 authentication, token refresh, and provides a clean interface for invoices, contacts, payments, and other Xero endpoints, so you can sync accounting data without writing boilerplate API code.
accounting.transactions from default scopes) forces an explicit product decision: which finance capabilities are core to your app versus optional per-tenant. That maps directly onto feature-flag and permission design — a tenant that connects Xero for contacts-only sync should not be asked to grant transaction access.Consider it when:
Look elsewhere when:
On v1.1.18 specifically: the version number says patch, the behavior says breaking. Any existing install that relies on default scopes to create or read invoices and bank transactions will start failing authorization after upgrade. Treat it as a minor-version upgrade with a migration task: audit configured scopes, add accounting.transactions explicitly where transaction features exist, and verify the re-consent path for already-connected tenants. If you don't use transaction endpoints, the change is a net win — smaller blast radius, cleaner consent screen, better security review answers.
For executives: Customers keep their books in Xero. Rather than rebuilding accounting — a multi-year, heavily regulated effort — we integrate with the ledger they already trust. This package gives us that integration on our existing stack, which means finance-adjacent features ship in weeks instead of quarters, with no new headcount and no new platform to operate. The trade-off is dependency on a third-party API and its limits, which we should state plainly rather than discover in production. The latest release narrows the permissions we request by default; that's good for trust and conversion on the connect screen, and it costs us one round of scope auditing before rollout.
For engineering: It's a thin, conventional Laravel wrapper — service provider, config-driven credentials, OAuth2 handling, token storage and refresh. Fit is good if we stay inside Laravel's idioms. Three things to plan for: (1) v1.1.18 removes accounting.transactions from defaults, which is behaviorally breaking despite the patch version — audit our scopes and add it explicitly wherever we touch invoices or bank transactions; (2) we own the re-consent flow for tenants who connected before a scope change; (3) rate limits and webhook latency are product constraints, so data freshness needs to be a designed, visible property, not an implicit promise. Wrap the client behind our own interface so a future swap — or a second provider — isn't a rewrite.
For product and design: Scope requests are UX. Users see them at connect time and hesitate over anything that looks like write access to their books. Narrow defaults plus just-in-time escalation ("connect invoicing to enable this") will outperform a single broad permission grab, and it gives us a clean upsell moment inside the product. Also plan the unhappy paths explicitly: revoked access, expired tokens, an org that disconnects mid-quarter. Those states are where finance integrations earn or lose customer trust.
How can I help you explore Laravel packages today?