Skip to main content
OnPageIQ Documentation

Listing Alignment

New · Aug 4, 2026 Needs testing

Confirm a location’s business identity on Project Settings → Local SEO, then audit name/address/phone/website alignment across website, schema, Google, directories, and Apple/Azure — with honest Not tested when a source is unavailable, plus findings and tasks when sources disagree.

Still to be tested

This guide and the Listing Alignment feature shipped recently and still need QA walkthrough sign-off. Use the QA focus checklist below; remove the needs_testing flag in config/platform-docs/pages/addons.php after the team signs off.

User goal

Confirm the canonical NAP for a location on Local SEO settings, raise source coverage with honest statuses, and remediate Fix now / Fix soon findings — without ranking guarantees or vanity citation scores.

Tier
Pro and up (Local listings) + Pennant listing-alignment
Nav label
Alignment
Route
/projects/{project}/local-listings/alignment
Gates
listing-alignment directory-listings-addon

Prerequisites

  • directory-listings-addon active for the org (Pro and up)
  • Pennant listing-alignment activated for the org (default off — Filament org Viewer → Feature Flags, or ops grant)
  • Owner/Admin confirms NAP on Project Settings → Local SEO (Listing Alignment identity); Members+ can run audits
  • Local SEO tab: GeoGrid entitlement + manage_geogrid, or Alignment-only Owner/Admin when GeoGrid is off
  • Ready site architecture crawl for Website / Schema NAP (otherwise those rows stay Not tested)
  • Optional: confirm the Google listing on the hub (Local SEO match or paste a Google Maps link) when Places search is ambiguous
  • Optional: link GBP / Yelp / BBB on the Listings tab, or paste public URLs under Confirm listing URLs
  • Optional: AZURE_MAPS_SUBSCRIPTION_KEY + Filament acquisition gate Proven for live Azure POI
  • GCP_API_KEY (or GOOGLE_ADDRESS_VALIDATION_API_KEY) for Places / Address Validation when those paths run

QA focus

  • Profiles, runs, findings, and tasks are org+project scoped; never accept organization_id from the client
  • Confirm UX is Project Settings → Local SEO (not a standalone profile editor); hub Confirm/Edit (primary) deep-links there
  • Owner/Admin Save confirms primary local_business_profiles; Manager Save updates GeoGrid only
  • Viewers can open Hub / runs / findings / tasks but cannot confirm profile, map sources, run audits, or mark resolved
  • Website/Schema Not tested with no_ready_site_crawl until a Ready site architecture has homepage HTML
  • Places Not tested when GCP key missing; No result / awaiting_picker until listing confirmed — not Provider failure
  • GBP Not tested / No result until Directory GBP link (or OAuth + mapped location) — deep-link to Listings
  • Apple and Azure stay not_tested until acquisition_gate allows URL/CSV or Proven API
  • At most five additional industry/manual mappings count toward the five-slot cap (Angi/Trustpilot/G2 linked set does not)
  • Linking a listing after a run shows the stale-audit notice; a run newer than every link does not (org-scoped — another org’s link must not trigger it)
  • Yelp/BBB rows that are not settled offer a Listings next step; the column is no longer GBP-only
  • Core and Full audits reserve quota per mode; overlapping queued/running runs are blocked
  • After a run, open findings create tasks; Mark resolved closes the finding and its open task
  • Aggregator only runs when Filament/runtime aggregator_enabled is on (default off)

Overview

Listing Alignment compares a user-confirmed business identity (name, phone, website, address or service-area status) against website/schema NAP, Google (GBP + Places), Local listings directories (Yelp/BBB and Full-mode Angi/Trustpilot/G2), plus Apple Business / Maps and Azure Maps under explicit acquisition gates.

What you get

  • Listings | Alignment tabs on Local listings when the Pennant flag is on
  • Confirmed local_business_profiles that never auto-overwrite confirmed fields
  • Profile confirm on Project Settings → Local SEO (Places pin + NAP on one Save; prefills from Places details, linked GBP, or AI Business Profile)
  • Core and Full audits from a single Run audit slide-over (shows remaining monthly quota + 1-unit cost)
  • Sources table with status, listing URL, and next-step deep-links (e.g. GBP → Listings)
  • Confirm Google listing (Local SEO name/address card, paste a Google Maps link, or pick a candidate — Place IDs stay out of the UI)
  • Confirm listing URLs for Yelp/BBB/Apple/Azure/industry (up to five capped industry slots)
  • A notice when a listing was linked or re-mapped after the last audit, so a stale Not tested is explained rather than mysterious
  • Coverage % = applicable sources tested (not a 0–100 “health score”)
  • Findings + tasks after each audit — Fix now / Fix soon drive hub Health; run / finding / tasks routes
  • Honest Not tested when Apple/Microsoft lack access, crawl HTML is missing, or a directory is unlinked

How it works

  1. Owner/Admin opens Settings → Local SEO, fills or accepts Places autofill, and Saves to confirm the primary identity
  2. Run a site architecture crawl so Website / Schema can read homepage NAP
  3. Optionally confirm Places, link GBP on Listings, map manual listing URLs, or import CSV
  4. Open Run audit, choose Core or Full (remaining quota and 1-unit cost are shown), and start — the page updates while the job runs, then shows coverage, next steps, and findings
  5. Open View findings / Tasks to remediate; Mark resolved closes the finding and task
  6. Ops set Apple/Azure gates, quotas, freshness, and the aggregator kill-switch in Filament

Core vs Full

Core Full
Sources Website, schema, GBP, Places, Yelp, BBB, Apple, Azure Core + Angi, Trustpilot, G2 + up to five industry directories
When to use Day-to-day NAP coverage after Local SEO confirm Deeper directory sweep when Core is not enough
Cost 1 Core quota unit per run 1 Full quota unit per run
Monthly defaults Pro 10 / Team 30 / Enterprise 100 Pro 2 / Team 8 / Enterprise 30

Honesty rules

  • No ranking guarantees from fixing mismatches
  • Apple remains URL/CSV or Not tested until partner API is proven
  • Azure Maps POI calls only when Filament gate is Proven and a subscription key is configured
  • Missing GCP_API_KEY → Places Not tested (not Provider failure)

Common issues & false alarms

  • Alignment tab missing → activate Pennant listing-alignment for the org (Filament → Organization → Feature Flags, and ensure Local listings entitlement)
  • 404 on Alignment routes → flag off or wrong org
  • Cannot confirm profile → need Owner/Admin on Settings → Local SEO with Directory + Pennant; Viewers are blocked
  • Manager saved Local SEO but Hub still says incomplete → only Owner/Admin confirm Alignment NAP
  • Cannot run audit → profile not confirmed, Viewer role, overlapping run, or quota exhausted
  • Website/Schema always Not tested → run a site architecture crawl until Ready with homepage HTML
  • Places No result / awaiting picker → Confirm Google listing on the hub (Use this Google listing from Local SEO name/address, or paste a Maps URL), then re-run
  • Places Not tested · gcp_api_key_missing → ops must set GCP_API_KEY (IP-restricted) on the environment
  • Places Provider failure · places_api_forbidden → Google refused the key. In Google Cloud check that Places API (New) is enabled for the project AND that the key’s API restrictions allow it — re-running will not help until then
  • A directory you just linked still says Not tested → the audit ran before the link finished saving. The page shows a “your listings changed since the last audit” notice; re-run the audit
  • GBP Not tested / No result → Connect or link Google Business Profile on the Listings tab (use the Sources next-step link)
  • Yelp/BBB Not tested → paste the public profile URL under Confirm listing URLs, or link from Listings, then re-run
  • Apple/Azure always Not tested → expected until URL mapped or Filament gate Proven (Azure) / partner signup (Apple)
  • Sixth industry directory rejected → five-slot cap; exclude or remove an existing capped mapping

Interactive guide

Step of

All steps (reference)

  1. Step 1. Open Alignment under Local listings

    From a project, open Business → Local listings, then the Alignment tab (or go directly to the Alignment hub). Without the Pennant flag the tab and routes are unavailable (404). Use **Confirm profile** to jump to Local SEO when no identity exists yet.

    What to do: Project sidenav → Business → Local listings → Alignment

    Where: local-listings.alignment.index

    Open Alignment under Local listings

    Expected (pass)

    • Page title Listing Alignment
    • Listings | Alignment tabs visible
    • Empty state prompts confirming a business profile; Confirm profile links to Settings → Local SEO

    Negative cases (must fail safely)

    • Pennant off → 404
    • Local listings addon off → 403
    • Cross-org project → 403/404
  2. Step 2. Confirm the canonical business profile on Local SEO

    Owner or Admin confirms public name, phone (E.164), website, country, and street address or service-area business on **Project Settings → Local SEO** (Listing Alignment identity section). Places search autofills phone/website/structured address when available. Prefill may also come from a linked Directory GBP or AI Business Profile. Confirmed fields are never auto-overwritten by crawls or AI refresh. Managers can save Local SEO defaults but only Owner/Admin confirm Alignment. Multi-location edit is deferred — hub Edit appears for the primary profile only.

    What to do: Settings → Local SEO (or hub Confirm profile) → fill NAP → Save

    Where: projects.settings

    Confirm the canonical business profile on Local SEO

    Expected (pass)

    • Local SEO tab shows Listing Alignment identity fields when Pennant listing-alignment is on
    • Form validates website as a safe public URL
    • After Save, Hub shows the primary profile as Confirmed

    Negative cases (must fail safely)

    • Viewer → cannot open confirm redirect / cannot save Alignment
    • Manager → Local SEO saves without confirming Alignment
    • Missing required NAP fields → validation errors (Owner/Admin)

    Tips

    • Alignment-only orgs (no Local Rankings / GeoGrid) still get Local SEO for Owner/Admin so confirm is not stranded.
    • Legacy /alignment/profile/create bookmarks redirect here with a toast.
  3. Step 3. Raise source coverage (crawl, Places, GBP, URLs)

    Before expecting high coverage: run a site architecture crawl for Website/Schema; confirm the Google listing when search is ambiguous (prefer **Use this Google listing** showing the Local SEO name and address — not a Place ID); connect or link GBP on the Listings tab; paste Yelp/BBB (and optional industry) URLs under Confirm listing URLs. The Sources table shows status and a next-step link for GBP when needed.

    What to do: Crawl site → Confirm Google listing / link Listings / paste URLs as needed

    Where: local-listings.alignment.index

    Expected (pass)

    • Confirm Google listing section when entitled to map sources
    • Sources table lists core directories with status badges
    • GBP next step links to Local listings when not connected or unmapped

    Negative cases (must fail safely)

    • No crawl → Website/Schema Not tested with guidance to run a site scan
    • Viewer → cannot confirm Places or save listing URLs

    Tips

    • When Local SEO already has a Google pin, confirm with “Use this Google listing” (name and address shown — no Place IDs).
    • Otherwise paste a Google Maps link for the business; candidates from an ambiguous search also appear after a Core run.
  4. Step 4. Run a Core or Full audit and read coverage

    Members+ with run permission open **Run audit**, choose Core or Full in the slide-over (remaining monthly quota and 1-unit cost are shown), then start. The hub updates while the job runs. Coverage is tested/applicable sources — not a composite score. Health reflects open Fix now / Fix soon findings when present. Apple/Azure may show Not tested when gates forbid live checks.

    What to do: On a confirmed profile → Run audit → pick Core or Full → Start → wait for the hub to refresh after the job completes

    Where: local-listings.alignment.index

    Run a Core or Full audit and read coverage

    Expected (pass)

    • Run audit opens the mode slide-over with remaining Core/Full quota
    • Latest run status, coverage explanation, and next steps after completion
    • View findings and Tasks actions when a run exists
    • Flash message if profile unconfirmed, overlapping run, or quota exhausted

    Negative cases (must fail safely)

    • Unconfirmed profile → blocked with message
    • Second concurrent run → overlapping-run error
    • Core/Full quota exhausted → Start disabled / quota exception message

    Tips

    • Full adds Angi/Trustpilot/G2 and up to five capped industry/CSV mappings on top of Core.
    • Quota defaults: Pro 10 Core / 2 Full per month (Filament overrides).
  5. Step 5. Re-run after linking a listing

    Linking a directory and checking it are separate steps, and the check can finish seconds before the link finishes saving — so a directory you just linked can still read **Not tested**. When a listing is linked or re-mapped after the most recent audit, the hub says so and points you at running it again. The row keeps the URL you entered either way, including when a lookup ended without success, so there is always something to see and act on.

    What to do: Link a listing on Listings → return to Alignment → read the notice → Run audit again

    Where: local-listings.alignment.index

    Re-run after linking a listing

    Expected (pass)

    • Notice: your listings changed since the last audit
    • Directory row still shows the requested listing URL
    • Yelp / BBB rows that are not settled link to the Listings tab

    Negative cases (must fail safely)

    • Audit newer than every link → no notice
    • Another org linked a listing → no notice on this project

    Tips

    • The notice is about freshness, not failure — the statuses below it were simply recorded before your change.
  6. Step 6. Review findings and close tasks

    Open View findings for the latest run, inspect field mismatches, and Mark resolved when the directory is fixed (or acknowledge). Tasks list open remediation work created automatically for Fix now / Fix soon findings.

    What to do: Latest run → View findings → open a finding → Mark resolved (or open Tasks)

    Where: local-listings.alignment.tasks.index

    Expected (pass)

    • Run detail lists findings ordered by priority
    • Finding detail shows field, source, priority, and recommended action
    • Mark resolved closes the finding and its open task for Members+

    Negative cases (must fail safely)

    • Viewer → can read findings/tasks but cannot Mark resolved
    • Cross-org finding/run URL → 404
  7. Step 7. Admin: quotas, gates, and aggregator kill-switch

    Support/SuperAdmin open Filament → Listing Alignment → Alignment Settings to adjust per-tier quotas, Apple/Azure acquisition gates, aggregator enablement, freshness windows, coordinate bands, and evidence retention.

    What to do: Filament → Listing Alignment → Alignment Settings → Save

    Admin: quotas, gates, and aggregator kill-switch

    Expected (pass)

    • Apple/Azure gate selects: Not tested / URL·CSV only / Proven
    • Citation aggregator toggle defaults off
    • Save shows success notification

    Negative cases (must fail safely)

    • Non-ops role → page inaccessible

    Tips

    • Set Azure gate to Proven only after AZURE_MAPS_SUBSCRIPTION_KEY is configured and POI calls are approved.
    • Leave aggregator off until a vendor endpoint is contracted.

Related guides