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.
Search opportunities
GSCImpressions · last 28 days
Queries already earning visibility, ready for a closer look.
Site health
CRAWL78out 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.
| Query | Clicks | Impressions | CTR | Avg pos | Δ clicks |
|---|---|---|---|---|---|
| composite decking installer/services/composite-decking/ | 34 | 6.2 | |||
| deck builder near me/ | 27 | 7.4 | |||
| composite deck builder/services/composite-decking/ | 19 | 7.8 | |||
| trex deck installation/services/composite-decking/ | 12 | 9.4 | |||
| screened porch contractor/services/screened-porches/ | 8 | 11.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.
GSCFilters 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.
GSCAnalytics 4 overview
Sessions, users and key events by day, with traffic sources, landing pages, and a separate breakdown of referrals arriving from AI assistants.
GA4Sitemaps 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.
GSCChange 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.
78/100
0
3
7
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
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.
CRAWLA 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.
CRAWLAffected 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.
CRAWLJavaScript 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.
CRAWLScheduled 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.
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
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.
GSCKeyword 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.
GSCHonest 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.
CRAWLIntent 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.
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
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 queueLocal 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.
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.
IMPORTGaps 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.
PLACESLocations 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.
AITwo 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.
AIManual, 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.
CRAWLAction 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.
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.
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?
What Google access does Localense ask for?
Is Google Business Profile connected directly?
Do I need my own AI provider key for AI visibility?
Can an agent do what the dashboard does?
What happens when a data source has nothing to say?
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