statamic/seo-pro
SEO Pro is a comprehensive SEO addon for Statamic. It adds an intuitive SEO fieldtype for meta titles and descriptions, Open Graph and Twitter Card tags, XML sitemaps, redirects, canonical URLs, and social image support, helping you improve search visibility without leaving the control panel.
Framing the buy decision. statamic/seo-pro is not a general-purpose Laravel package — it's a first-party, license-gated addon for the Statamic CMS. Everything of value (blueprint fieldsets, the control-panel report, the {{ seo_pro }} head tag, sitemap and redirect routes) only exists inside a Statamic runtime. The first TPM question is therefore not "is this good?" but "are we, and will we stay, on Statamic?" If the answer is no or "we're evaluating a move to headless WordPress/Next," this evaluation ends here.
Architecture fit. The addon sits cleanly at the content-model ↔ presentation boundary and is config-declared rather than code-invasive:
seo field.That shape is hub-and-spoke and upgrade-friendly — which is the main architectural argument for buying it over hand-rolling.
Integration feasibility: high, but gated. Install is composer require, an env license key, and a published config — Statamic auto-discovers addons, so there's no service provider to wire. Real effort is concentrated in three places: the version matrix (Statamic major ↔ addon major, the single most common install failure), rendering the head tag centrally without duplicating hand-written <title>/meta, and headless/API consumers where the seo field does not automatically arrive in the shape a front end needs.
Technical risk register.
| Risk | Severity | Notes |
|---|---|---|
| Version lock-in (Statamic majors) | High | Every Statamic upgrade becomes a compatibility review item; addon 7.x line must track it |
| License lapse behavior unknown | High | Establish explicitly whether expiry degrades reporting, blocks CP editing, or only stops updates — model it in the risk register |
| Report generation on save path | Medium | Scales with entries × fields × locales; must move to deferred/background |
| Headless Chrome dependency | Medium | Social preview image generation requires Browsershot/Puppeteer; the worker host must have the binary |
| Static cache vs. redirects | Medium | Cache can serve a 200 for a freshly redirected URL; ordering + cache invalidation |
| Multisite edge cases | Medium | #688 is direct evidence this path has its own bugs; don't infer multi-site correctness from a single-site smoke test |
| Upgrade surprise from #686 | Low/Ops | Errors under deferred/background queues were previously not recorded at all; expect a spike that is a correctness fix, not a regression |
| Fork risk on bespoke scoring | Medium | Custom cascade classes, sitemap URLs, and view overrides cover most needs; bespoke scoring rules push you toward forking, which defeats the buy decision |
Key questions to close before signing:
seo into OG/title/canonical tags?seo or seo_pro? (Collisions manifest as confusing fallback behavior, not errors.)On the signals. 76 stars and 0 public dependents are structurally blind for a privately installed, license-gated first-party addon — they should not drive the decision. The decision-grade inputs are vendor patch cadence and issue-tracker responsiveness, both of which look healthy (five fixes in v7.15.1 spanning UI, queue error recording, multisite, and i18n). Treat the ~48.8 opportunity score as a prompt to validate license economics and version fit, not a verdict.
Stack fit. Laravel host + Statamic + addon 7.x, no service provider registration. Prerequisites in the order they actually break installs: (1) Statamic major ↔ addon major alignment checked against composer.json constraints, (2) PHP version, (3) license key in .env, (4) config:clear — an unlicensed banner in the CP is almost always cached config, not a bad key.
Migration path. Sequence it as a phased rollout with a hard pilot gate; do not sweep every blueprint on day one.
noindex outside production via config or a globals setting before any content migration. Publish and read config/seo-pro.php end to end — sitemap, redirects, reports/queue, social preview, and cascade blocks are the map for everything downstream.{{ seo_pro }} into the layout head and remove existing hand-written <title>/meta to avoid duplicates. Acceptance criteria: publish one entry, set meta title/description, confirm tags in view source (not DevTools); confirm the entry appears in /sitemap.xml and a draft/noindexed entry does not; create one 301 and verify it in a private window. That's the whole loop in fifteen minutes and surfaces version, license, and cache problems immediately.deferred or background), schedule regeneration instead of asking editors to press a button, and keep a worker alive. Brief stakeholders on the post-v7.15.1 error spike before deployment, or someone will roll it back.seo field in API resources/transformers and map it to <title>, description, OG tags, and canonical in the consuming app. This is the most common integration gap and no patch release closes it for you.Compatibility hygiene. After every upgrade, diff CP customizations and overrides under lang/vendor/seo-pro — #690 touched report status colors and dark mode, #682 touched German. Keep a feature test asserting rendered head tags (title, description, canonical, og:*) plus a sitemap snapshot for a known fixture; that harness turns the next patch bump into a diff instead of a leap of faith.
Sequencing constraint. If a localization or multi-brand launch is on the roadmap, this addon's readiness is a dependency line item and must be sequenced before content migration, not after.
Maintenance. Low code maintenance — the vendor owns the hard parts — but the cost is recurring and should be budgeted as such: one compatibility review per Statamic major, a per-upgrade diff of CP/translation overrides, and a license renewal. In practice we're purchasing someone else's edge-case backlog: report row rendering (#684), status/dark-mode alignment (#690), queue-driver error recording (#686), multisite URL-less editing (#688), German translations (#682). None of those are features we couldn't write; all of them are features we'd rather not maintain forever.
Support. First-party vendor plus public issue tracker. Triage is a team responsibility, not a vendor one: someone must own the report, the queue, and the failed_jobs table. A report that never completes is usually a dead job, not a broken addon.
Scaling. Three independent scaling axes:
Failure modes to instrument and rehearse:
<title> alongside the tag is invisible in the CP preview and obvious in the SERP.<title>.noindex control.Ramp-up. Developer ramp is genuinely small: one fieldset import, one tag, one config file. Editor ramp is the real cost and the thing that determines ROI: a walkthrough, character-counter habits, a documented report-triage routine, and a named owner. The payoff is moving quality control upstream to whoever writes the content — fewer marketing-to-editorial round trips — but an unowned report becomes shelfware within a quarter. The product decision this enables is making "SEO-ready" a publish-time property rather than a post-publish audit; that's a workflow and quality-gate change, and it should be staffed as one.
Bottom line for the roadmap. Adopt if we're on Statamic and want editors to own on-page quality, especially with multisite/multilingual and queued report generation in play. Defer if we're headless with a separately owned front end that won't absorb the seo field mapping, if we can't absorb a commercial license inside a core content workflow, or if our needs run to bespoke scoring rules that push us toward a fork.
How can I help you explore Laravel packages today?