Skip to content
Localense

The product

Every signal. One clear workspace.

Localense reads your own Google data, crawls your own site, compares real competitor pages, and turns what it finds into a scored queue of actions. Each one shows the evidence and the source that produced it.

  • 14-day trial, no card
  • Read-only Google connection
  • Every number carries its source

Connected sources. Prioritized work. Clear reporting.

Read the signals

Understand the searches and pages that bring people to your website.

Learn more

Find the next move

See the issues, the evidence, and where to focus your effort.

Learn more

Show the work

Bring the results together in a clear, shareable client report.

Learn more
Localense / Project overviewSample data

Search opportunities

GSC

Impressions · last 28 days

composite decking installer1,840
deck builder near me1,465
composite deck builder1,120

Queries already earning visibility, ready for a closer look.

Site health

CRAWL

78out of 100

High
3
Medium
7
Low
12

142 pages crawled · severity behind every score

Your next action · Critical

Fix pages returning 4xx errors

6 affected pages. Restore, redirect, or remove broken internal links.

Illustrative overview with sample project data.

Measure

Your own search and analytics data, cut the way decisions are actually made.

Connect Search Console and Analytics 4 through Google OAuth. Localense backfills 16 months of daily Search Console rows and 14 months of GA4 on connect, then keeps them incrementally in sync.

Search analytics · Almost ThereSample project data
Search Console queries ranking at average position 4 to 15 with at least 50 impressions in the last 28 days.
QueryClicksAvg pos
composite decking installer/services/composite-decking/346.2
deck builder near me/277.4
composite deck builder/services/composite-decking/197.8
trex deck installation/services/composite-decking/129.4
screened porch contractor/services/screened-porches/811.9

GSCSearch Console · last 28 days · synced 2h ago

Almost There is one of seven query views. Its definition is printed, not implied: average position 4 to 15 with at least 50 impressions in the period.

Query view definitions, as the service computes them

Winning
clicks up ≥ 25% and ≥ 5 clicks
Declining
clicks down ≥ 25% and ≥ 5 clicks
New
≥ 10 impressions now, 0 before
Lost
≥ 10 impressions before, 0 now
Almost there
position 4–15, ≥ 50 impressions
Low CTR
≥ 200 impressions, CTR < 1%
Top
current window, ordered by clicks

Current and previous windows default to 28 days each and can run up to 180. CTR is clicks over impressions across the aggregate and position is impression-weighted, so a view never quietly changes its arithmetic between screens.

  • Search performance

    Clicks, impressions, CTR and average position with a matching previous comparison window, plus top and declining page views alongside the query views.

    GSC
  • Filters and CSV export

    Preset or custom date ranges filtered by source, query, page, device, country, mapped service and mapped location. The dashboard, the JSON API and the CSV export take identical parameters.

    GSC
  • Analytics 4 overview

    Sessions, users and key events by day, with traffic sources, landing pages, and a separate breakdown of referrals arriving from AI assistants.

    GA4
  • Sitemaps and URL inspection

    List and submit sitemaps inside the connected property, and read Google's current index verdict, coverage state and canonical for an in-property URL.

    GSC
  • Change annotations

    Record deployments, content changes, algorithm updates and business events on a date so a movement in the trend has a cause next to it instead of a guess.

  • Per-location insights

    Search Console, Analytics and open actions resolved for one location's mapped pages, each with its own provenance string rather than one blended company number.

    GSC

Diagnose

One crawl, 32 rules, and a health score you can reproduce by hand.

The crawler is robots-aware and SSRF-protected, defaults to 500 pages at depth 6, holds two requests per host with a half-second delay, and identifies itself as LocalenseBot. Pages that come back as thin script shells are automatically re-fetched with a headless Chromium pass on its own queue.

Site healthSample project data

78/100

PoorNeeds workGreat
critical

0

high

3

medium

7

low

12

CRAWLSite crawl · 142 pages · audited 4h ago

Health score, the whole formula

Score
100 − Σ deductions
Deduction
weight × min(share × 2, 1)
Critical weight
15
High weight
8
Medium weight
3
Low weight
1
Affected share
affected ÷ indexable pages
Site audit issueSample project data
highCRAWL_4XX6pages

Pages returning 4xx client errors

Why it matters

Pages that return 4xx errors waste crawl budget, break the visitor journey, and drop out of the index.

Recommended fix

Restore the page, redirect the URL to the closest live page, or remove every internal link pointing at it.

Affected pages (6)

  • /services/deck-staining/
  • /gallery/2023-projects/
  • /blog/deck-permits-guide

CRAWLSite crawl · 142 pages · audited 4h ago

Issue copy is the rule's own text. Nothing on this card is written for the marketing site.

  • 32 rules per audit

    Status codes, redirect chains and loops, broken internal links, orphan sitemap pages, depth, indexability, canonicals, titles, descriptions, headings, thin and duplicate content, image alt text, JSON-LD validity, LocalBusiness schema, NAP, mixed content and HTTP pages.

    CRAWL
  • A score, not a mystery

    The Site Audit screen prints the formula, the severity weights, the affected-share rule and every per-issue deduction from the stored breakdown, and states plainly that the score is deterministic rather than AI or traffic estimated.

  • Run-to-run diff

    Each audit records which issue codes are new, which are fixed and which regressed since the last one, so progress is a fact from the data rather than a claim in a slide.

    CRAWL
  • Affected pages kept

    Every finding stores a sample of up to 200 affected URLs with per-page detail, and always reports the true total separately so a capped sample can never read as the whole number.

    CRAWL
  • JavaScript render pass

    Thin or script-heavy pages are queued for a Chromium render on a globally locked queue so browser work never starves syncs and audits. Rendered DOM facts replace the shell before rules run, and failures stay visible instead of silently passing.

    CRAWL
  • Scheduled or on demand

    Crawl frequency is per project: manual, weekly or monthly. Every crawl and audit is a job with progress, events, cancellation and an explicit failure state.

Research

Keywords and competitors, without a black-box number in sight.

Keywords come from queries you already earn impressions on, clustered and classified. Competitors are compared by crawling their pages, so every gap points at a URL you can open.

Keyword cluster → opportunitySample project data
highContent updateplanned0.046

Update /services/composite-decking/ for "composite decking installer"

5 keywords in the "composite decking installer" cluster rank just off page-one (position 4-15) with 4820 impressions.

Recommended action

Expand and refresh /services/composite-decking/ to fully cover the "composite decking installer" cluster and push its keywords onto page one.

Success metric

Average position of the "composite decking installer" cluster keywords reaches the top 3 within 60 days

Score breakdown

Impact0.48
Confidence0.60
Business value0.80
Urgency0.60
Effort3
Score0.046

Evidence (1)

  • GSCFIRST_PARTYgoogle_search_console · keyword_cluster

    "composite decking installer" cluster: 5 almost-there keywords, 4820 impressions, mapped to /services/composite-decking/.

    composite decking installer
    pos 6.2 · 1,840 impr
    composite deck builder
    pos 7.8 · 1,120 impr
    trex deck installation
    pos 9.4 · 880 impr
    composite decking cost
    pos 11.6 · 610 impr
    composite vs wood deck
    pos 13.1 · 370 impr

content_update:cluster:builder composite deck

Search Console · last 28 days · synced 2h ago

Competitor comparison, method crawl_comparison_v1

Competitors per project
up to 4
Compared
latest completed crawls
Topic similarity threshold
0.28 Jaccard
Findings kept
≤ 100 per competitor
Series colors
blue · teal · violet · pink

The comparison reports crawl and indexable page counts, average crawl-visible word count, average internal links per indexable page, error pages, JSON-LD types they carry and you do not, and topic gaps built from normalized titles, H1s and URL path tokens. The response declares its method and returns the source URLs, so you can disagree with a specific finding rather than the tool.

What it deliberately does not do: claim search volume or ranking estimates it has no provider for.

  • Clusters, not lists

    Keywords group into clusters with a label, member count and combined clicks and impressions, so a content decision covers a demand pocket instead of a single string.

    GSC
  • Keyword Explorer

    Search by seed, service or location across the project's stored keywords. Each row shows whether the evidence came from Search Console, your own crawl or a competitor crawl, plus your ranking page and which competitors cover it.

    GSC
  • Honest blanks

    Volume, competition and CPC stay “Not available” until an approved enrichment provider is connected. The row still tells you what it does know rather than filling the gap with a model.

  • Crawl-backed gaps

    Findings are persisted with their evidence and are reproducible without an LLM. Re-running the comparison yields the same result from the same crawls.

    CRAWL
  • Intent and tagging

    Keywords carry transactional, informational, navigational or unknown intent, plus service and location tags drawn from the business profile you filled in during onboarding.

  • Straight into the queue

    Clusters sitting just off page one become content_update opportunities and topics only competitors cover become new_page opportunities, each carrying the keyword evidence that created it.

Act

One queue. Every item shows the arithmetic that ranked it.

Findings from the audit, the search data, the competitor comparison, the local profile and the AI runs all converge on a single scored list, so the next decision is a read rather than a meeting.

Opportunity detailSample project data
criticalTechnical fixopen0.168

Fix: Pages returning 4xx client errors

Pages that return 4xx errors waste crawl budget, break the visitor journey, and drop out of the index.

Recommended action

Restore the page, redirect the URL to the closest live page, or remove every internal link pointing at it.

Success metric

CRAWL_4XX affects 0 pages in the next site audit (currently 6)

Score breakdown

Impact0.70
Confidence1.00
Business value0.80
Urgency0.60
Effort2
Score0.168

Evidence (1)

  • CRAWLCRAWLEDcrawler · audit_issue

    Site audit found CRAWL_4XX (high) affecting 6 page(s).

    issue_code
    CRAWL_4XX
    severity
    high
    category
    status
    affected_count
    6

technical_fix:CRAWL_4XX

Site crawl · audited 4h ago

How an opportunity is ranked

Score
impact × confidence × value × urgency ÷ effort
Priority bands
critical · high · medium · low
Categories
7
Statuses
open → planned → in progress → actioned
Also
dismissed · auto-resolved

A priority number you cannot argue with is a number you cannot trust. Every factor is on the card, so you can disagree with the confidence rather than with the tool.

The seven categories are technical fix, metadata fix, content update, new page, internal linking, Business Profile optimization and AI visibility. Keys are deterministic, so regenerating updates the item you were already working on instead of creating a duplicate beside it.

See how an agency runs this queue

Local presence

A profile score with every weight printed on it.

Google Business Profile API access requires a separate Google approval that is not enabled for Localense. Until it is granted, profiles come from a customer-authorized CSV import, and Localense is explicit about which source you are looking at.

Local profile completenessSample project data

70/100

Score is the sum of the completed checks below. No correlation claim is attached to it.

Primary category
15 pts
Services
15 pts
Hours
15 pts
Description
10 pts
Attributes
10 pts
Reviews present
10 pts
Review responses
10 pts
Additional categories
5 pts
Photos
5 pts
Website
5 pts

IMPORTImported profile · imported 3d ago

  • Customer-authorized CSV import

    Download a template covering identity, location, categories, description, services, hours, attributes, review and photo counts and the performance metrics you can export. Re-importing the same location label updates its snapshot instead of duplicating it.

    IMPORT
  • Gaps become scored work

    Every unchecked item generates a Business Profile optimization opportunity that lands in the same queue as technical and content work, ranked by the same formula.

  • Live Places lookup

    Google Places (New) text lookup is built and ships behind a restricted server key that is not enabled yet. Results are fetched live, shown with Google attribution and a Maps link, and are never stored, snapshotted or trended, as the Places terms require.

    PLACES
  • Locations mapped to pages

    Each location owns its landing page URLs, so per-location Search Console and Analytics figures resolve against real pages rather than a guess at which market a number belongs to.

AI visibility

Ask the assistants what they say about you, and keep the answer.

This ships today. Runs use one protected OpenRouter key to call the configured OpenAI and Perplexity models; without that key, prompt management still works and a run fails with an explicit provider-unavailable error rather than a fabricated result.

What one completed run stores

Response text
kept verbatim
Mentioned
true / false
Recommended
true / false
Cited
true / false
Position
rank in the answer
Sentiment
extracted label
Competitors
names the answer used
Citations
URLs the answer linked

Summary metrics across a prompt set are mention rate, recommendation rate, citation share, average position and competitor overlap. Each run is a dated, provider-specific snapshot, so a later model change cannot rewrite what you saw.

  • Prompt sets you control

    Each prompt records its service, location, intent, engine and frequency, so a set reads like the questions your customers actually type rather than a generic brand check.

    AI
  • Two engines, official APIs

    OpenAI and Perplexity models routed through OpenRouter. No scraping of assistant interfaces, and OpenRouter plus the exact model that answered are stored on the run.

    AI
  • Manual, weekly or monthly

    Prompts can run on demand or on a schedule. Every run is a job with the same progress, cancellation and failure semantics as a crawl.

  • Gaps and regressions

    Prompts where you are absent become scored AI visibility opportunities, and an AI visibility drop alert watches for a set that gets worse between runs.

Report

One snapshot, three formats, and an appendix that dates every number.

Generating a report freezes the data it used. HTML, Markdown and a real PDF are produced together from that single immutable snapshot, so the version you sent in March still says what it said in March.

  • Monthly summary

    Search performance against a comparison period, technical health, local profile foundation, competitor gaps, prioritized next actions, and the evidence and freshness appendix.

  • Technical audit

    The latest stored audit score and issue counts, the highest-priority issues with their recommended fixes, and the queue items that correspond to them.

    CRAWL
  • Action plan

    Open opportunities with their priority bands and recommended actions, plus the competitor and local profile context a client needs to approve them.

  • Expiring share links

    Send a client a link that shows the report and nothing else. No account, no dashboard access, and an expiry you set.

  • Agency branding

    Agency name, primary and accent color, logo and footer text applied across the client-facing output.

  • “Not available”, never zero

    Where a source had nothing to say, the report says so. The appendix records the Search Console sync, crawl, audit, local import and generation timestamps behind every section.

What a client reads in the audit reportSample project data
highLOCALBUSINESS_SCHEMA_MISSING1page

No LocalBusiness structured data anywhere on the site

Why it matters

LocalBusiness schema is how search engines connect the site to a real-world business with an address, hours, and service area; without it the site competes with weaker local signals.

Recommended fix

Add LocalBusiness JSON-LD (or the closest subtype) with name, address, phone, and hours, ideally on the homepage and contact page.

CRAWLSite crawl · 142 pages · audited 4h ago

The client-facing text is the rule's own why-it-matters and recommended fix. Nothing is rewritten between the dashboard and the report.

API and MCP

Agent-native, over the same services the dashboard uses.

68 MCP tools on a Streamable HTTP transport, authenticated with the same lsk_ API keys as REST, returning a structured {ok, data} envelope. An agent reads the real action queue, not an export of it.

mcp.localense.com/mcp68 tools
claude mcp add --transport http localense https://mcp.localense.com/mcp \
    --header "Authorization: Bearer lsk_..."

# agent turn
→ opportunity.list { project_id: "…", status: "open", limit: 3 }

{
  "ok": true,
  "data": {
    "items": [
      {
        "category": "technical_fix",
        "opportunity_key": "technical_fix:CRAWL_4XX",
        "title": "Fix: Pages returning 4xx client errors",
        "status": "open",
        "priority_band": "critical",
        "impact": 0.7,
        "confidence": 1.0,
        "business_value": 0.8,
        "urgency": 0.6,
        "effort": 2,
        "score": 0.168,
        "score_inputs": { "rule": "technical_fix", "severity": "high", … }
      },
      { "opportunity_key": "content_update:cluster:builder composite deck", "score": 0.046, … }
    ],
    "next_cursor": null
  }
}
  • 68 tools, 4 resources, 3 prompts

    Projects, integrations, GSC sitemaps and inspection, crawls and audits, keyword research, competitors, local metrics, AI visibility, alerts, annotations, schedules, webhooks, reports, opportunities and jobs.

  • Scoped and revocable

    Eight named scopes. A key can only carry a subset of its agent client's allowed scopes, a project-bound client gets a 404 for anything outside its project, and revoked keys are rejected before MCP even initializes.

  • Jobs, not blocking calls

    Long-running tools return a job reference. Poll job.get_status until it succeeds, fails, is cancelled or partially succeeds - the same lifecycle the dashboard shows.

  • Signed webhooks

    Nine event types, an HMAC-SHA256 signature over the timestamped body, five attempts with exponential backoff, and a delivery history you can inspect per endpoint.

Underneath all of it

Work you can watch, boundaries you can prove.

Nothing important happens invisibly. Every long task is a job, every mutation is written to the organization audit log, and every project belongs to exactly one tenant.

  • Jobs with real status

    Crawls, syncs, audits, AI runs, report generation and webhook delivery all report progress, events, retries, cancellation and explicit failure detail.

  • Six alert kinds

    Crawl failure, key page error, Search Console drop, high-value query decline, integration sync failure and AI visibility drop, each with its own threshold and digest setting.

  • Tenant isolation

    Organizations and projects are isolated at the query layer, stored Google credentials are encrypted at rest, and cross-tenant access is covered by an explicit route matrix in the test suite.

  • An audit trail

    Member changes, key creation, webhook secrets, MCP calls and every queued mutation are recorded with the actor who caused them.

  • 68

    MCP tools over the same core services as the REST API

    @mcp.tool registrations in services/mcp/app/main.py

  • 32

    Audit rules evaluated on every crawl

    CRAWLALL_RULES in localense_audit/registry.py

  • 16mo

    Search Console history backfilled when you connect

    GSCBACKFILL_MONTHS in localense_core/jobs/tasks.py

  • 100pts

    Local completeness checklist, every weight visible

    IMPORTWeighted checks in localense_core/local_seo/service.py

Questions

The things worth asking before you connect anything.

Does Localense estimate search volume or traffic?
No. Keyword volume, competition and CPC render as “Not available” until an approved enrichment provider is connected, and competitor comparison is crawl-based rather than a modelled traffic figure. Where a value is inferred rather than observed it is labelled as inferred and carries a confidence number.
What Google access does Localense ask for?
Search Console and Analytics are connected through Google OAuth and read on your behalf. Submitting a sitemap is the one write action, and it needs Google's full Search Console scope, so Localense asks for that explicitly and tells you to reconnect if your existing grant is read-only.
Is Google Business Profile connected directly?
Not yet. Google Business Profile API access requires a separate Google approval that is not enabled for Localense, so profile data comes from a customer-authorized CSV import today. Live Google Places lookup is built and ships behind a restricted server key, which is not enabled yet; Places results are always shown live with Google attribution and are never stored or trended.
Do I need my own AI provider key for AI visibility?
Yes. Prompt sets, scheduling, extraction and scoring all ship, and one protected OpenRouter key routes runs to the configured OpenAI and Perplexity models. Without that key, prompt management still works and a run fails with an explicit provider-unavailable error instead of inventing an answer.
Can an agent do what the dashboard does?
Largely, yes. The MCP server exposes 68 tools over the same core services the REST API and the dashboard use, so an agent reads the same records rather than a copy. Scopes still apply: a key can only carry a subset of its agent client's permissions, and a project-bound client gets a 404 for anything outside its project.
What happens when a data source has nothing to say?
It renders as an en dash with the source that could not supply it, never as a zero. Reports write “Not available” for the same reason. A missing number and a measured zero mean different things, and the product refuses to blur them.

Start with your own data

Run the first crawl and see the queue it produces.

Connect read-only Google access, crawl the site, and read a scored action list where every item carries the evidence behind it.

14-day trial · no card required · read-only Google access