revolution/laravel-google-searchconsole
Laravel wrapper for the Google Search Console API. Query search analytics data, inspect sites and sitemaps, and manage properties from your app with a clean, expressive PHP interface built on Google's official client library.
Architecture fit. The package is a thin Laravel service-provider wrapper around Google's official google/apiclient PHP SDK, exposing the Search Console API through a config file and a facade-style accessor. That is idiomatic Laravel — provider + config + facade — but it is a convenience layer, not an abstraction layer. There is no repository interface, no DTOs, no domain model, and no adapter seam. Everything downstream binds directly to Google's client objects, which means swapping providers or mocking responses in tests requires you to introduce your own interface anyway. Architecturally it saves boilerplate (credential wiring, client construction, config publishing) rather than earning its place as a dependency.
Integration feasibility. Low-friction for the happy path: composer require, publish config, drop in a service-account JSON key, share the property with the service-account email in Search Console, call the exposed methods. A competent Laravel engineer is productive in an afternoon. The friction appears the moment requirements move past "one property, one credential": multi-tenant or per-customer properties usually require reconfiguring the container binding at runtime, which the package's singleton-oriented config does not naturally support. User-delegated OAuth (refresh tokens) is typically not the primary path here — service-account auth is — so any product needing end-user consent flows will need custom work.
Technical risk. This is the dominant concern. 19 stars, zero dependents, a single maintainer, and a low opportunity score indicate a package with essentially no production validation and no community buffer. The two real risks are (a) abandonment — no releases tracking Laravel 11/12 or google/apiclient v2 major bumps, leaving you pinned to an ageing dependency tree, and (b) transitive coupling — your composer.json now constrains the Google SDK version for the whole application, which bites when another package needs a different Guzzle or google/apiclient constraint. The underlying API itself is stable; the packaging is not. Blast radius is contained because the surface area is small — worst case you inline ~100 lines and drop the dependency.
Key questions.
sites.list, searchanalytics.query, sitemaps, URL Inspection — or only search analytics?https://example.com/ and sc-domain:example.com?rows/startRow pagination and the 25,000-row-per-request ceiling, or is that on the caller?Stack fit. Appropriate for a Laravel monolith or modular monolith where Search Console data feeds an internal reporting dashboard, an SEO content-prioritisation feature, or a scheduled ingestion job. It is a poor fit for anything multi-tenant SaaS without an internal abstraction layer, and a poor fit for event-driven or high-throughput pipelines, because the Search Console API is request/response and quota-bound.
Migration path. Treat the package as scaffolding, not as a foundation. Recommended path: build a SearchConsoleClient interface in your domain layer with one or two concrete methods you actually need (querySearchAnalytics, listSites), implement it against this package, and keep the implementation behind a container binding. That costs an extra half-day and converts the abandonment risk from "rewrite the feature" to "swap one class." If the spike reveals missing endpoints or auth modes, skip the package entirely and use google/apiclient directly — the wrapper is small enough that the package's value is genuinely marginal.
Compatibility. Audit before committing: Composer constraints on php, illuminate/*, and google/apiclient; whether it works on your Laravel version (L11/L12 support is doubtful at this age); whether it conflicts with any existing Google SDK usage (common if you already use Google Analytics, Sheets, or Cloud Storage). Run composer why-not in the target app, not in a scratch project — SDK version conflicts are the single most likely integration blocker.
Sequencing.
searchanalytics.query, confirm data freshness and row limits against real expectations.Maintenance. Assume you own it. Pin the version exactly, add it to a dependency-watch list, and budget for the likelihood that you fork or replace it within 12–18 months. The maintenance load of the package itself is near zero (it's glue code), but the maintenance load of the pinned Google SDK and its Guzzle/PSR transitive tree is real and will surface during Laravel upgrades.
Support. No SLA, no vendor, no meaningful issue history. Internal documentation and a named owner are mandatory. The mitigating factor is that Google's own Search Console API docs are excellent and the wrapper adds little undocumented behaviour — debugging means reading Google's docs anyway.
Scaling. The constraints are Google's, not the package's: per-user quota limits, 25,000 rows per request, a rolling ~16-month data retention window, and 2–3 day data latency. Design for incremental pulls (date-ranged, daily), not full-window re-fetches. Cache aggressively in your own database — Search Console data is immutable once settled, so re-querying is pure waste and quota burn. Never call the API synchronously in a web request; queue it. Row-level pagination must be explicit; naive implementations silently truncate at 25k rows and produce understated metrics that are hard to detect.
Failure modes.
siteUrl string mismatch (sc-domain: vs URL-prefix form) → 403 that looks like an auth problem.Ramp-up. Low for a mid-level Laravel developer: a day to integrate, two to three days to build a production-grade ingestion path with retries, tenancy, and observability. The learning curve is almost entirely Google-side (auth model, property identifiers, quota semantics, data latency) rather than package-side — which is itself the argument for keeping the dependency thin and reversible.
How can I help you explore Laravel packages today?