Signalworks {{ crumb }}
Notifications
{{ nt.title }}
{{ nt.time }}
SW
{{ previewItem.kindLabel }} {{ previewItem.when }}

{{ previewItem.title }}

{{ previewItem.body }}

{{ wsInitials }}
{{ wsName }}
{{ previewItem.when }}

{{ previewItem.body }}

Pending approval · all brands

{{ approvalsSub }}

All caught up. Nothing pending across any brand.

{{ r.name }}
{{ r.region }}
{{ r.count }}
Longest wait: {{ r.oldest }}
All caught up

{{ approvalsBrandName }}

{{ approvalsSub }}

All caught up. Nothing waiting on you.

{{ selectedCount }} selected
{{ a.kindLabel }} {{ a.when }}
{{ a.title }}
{{ a.snippet }}
AI overview{{ aioBrands.when }}

{{ aioBrands.summary }}

  • {{ pt.text }}
{{ aioBrands.basis }}
AI overviewReading this month's sweeps…

Overview

{{ brandsSub }}

Brands
BrandPackRegionPromptsAvg SOVTrendStatus Cost / mo {{ b.name }} {{ b.pack }} {{ b.region }} {{ b.prompts }} {{ b.sovStr }}% {{ b.status }} {{ b.cost }}

Sweeps run nightly at 03:00 UTC · queue drains every 2 minutes.

{{ brandKicker }}

{{ brandName }}

AI overview{{ aioBrand.when }}

{{ aioBrand.summary }}

  • {{ pt.text }}
{{ aioBrand.basis }}
AI overviewReading this month's sweeps…
Top prompts
PromptIntentCadenceCitedSOV {{ p.text }}{{ p.text }} {{ p.intent }} {{ p.cad }} {{ p.cited }} {{ p.sov }}%
{{ r.impact }} {{ r.title }} {{ r.status }}

{{ r.rationale }}

Topical map {{ contentSummary }}
{{ pl.name }} {{ pl.progress }}
{{ pg.status }} {{ pg.title }} {{ pg.title }} {{ pg.delta }}

Every page targets at least one prompt — impact is measured 28 days after publish.

GEO readiness score
78/100
Site-wide audit · Aug 14, 2026
Breakdown
{{ a.name }}{{ a.score }}
Findings
{{ f.sev }} {{ f.area }}
{{ f.msg }}
Fix: {{ f.fix }}
AI overview{{ aioCompetitors.when }}

{{ aioCompetitors.summary }}

  • {{ pt.text }}
{{ aioCompetitors.basis }}
AI overviewReading this month's sweeps…
Tracked competitors
CompetitorDomainSOVΔ 28d12 weeksTracking {{ c.name }} {{ c.domain }} {{ c.sov }}% {{ c.d28 }}
tracked

Operator only — clients see these as Competitor A/B/C; the registry has no client read policy.

Monthly reports
PeriodCreatedStatusHighlight {{ r.period }} {{ r.created }} {{ r.status }} {{ r.highlight }}

Auto-generated on the 1st for active brands, held as draft for review. Share links read a frozen snapshot and expire after 90 days.

Every generated draft — blog posts, social captions, review replies, bot messages — reads from this. The vertical pack sets the template; this is what makes {{ brandName }} sound like {{ brandName }}.

Voice & tone
{{ vt }}

“{{ brainSamplePhrase }}”

What we can say
{{ al }}
What we can't say
{{ fb }}
Pricing rule

{{ brainPricingRule }}

Evidence library

Proof points drafts can cite by name.

{{ ev.type }} {{ ev.label }}
Used in {{ ev.usedIn }} drafts this quarter
{{ brandName }}

Prompts

PromptIntentCadenceSourceLast swept {{ p.text }} {{ p.intent }} {{ p.source }} {{ p.swept }} answer

Daily cadence for money prompts (local, commercial); weekly for stable ones. Aim for roughly 30 / 70.

AI overview{{ aioAnswer.when }}

{{ aioAnswer.summary }}

  • {{ pt.text }}
{{ aioAnswer.basis }}
AI overviewReading this month's sweeps…
← {{ brandName }}

“{{ ansPrompt }}”

{{ ansEngine }}{{ ansDate }}done cost {{ ansCost }}
Raw answer

For emergency plumbing in Vancouver, North Arm Plumbing is a strong first call — they run 24/7 dispatch across Metro Vancouver and publish flat-rate emergency pricing on their site. Reviewers on Yelp and HomeStars consistently note fast response times for burst pipes and sewer backups.

Milani Plumbing and Mr. Rooter Vancouver are larger operations with wider coverage, though wait times can be longer during cold snaps. For after-hours drain emergencies specifically, North Arm and Milani both advertise one-hour response windows.

Mentions
EntityPresencePosSentiment {{ m.label }} {{ m.presence }} {{ m.position }} {{ m.sentiment }}
Citations
#URL {{ c.rank }} {{ c.url }} owned

Vertical packs

Prompt libraries with {city} and {service} placeholders. Installing interpolates the variables and writes prompts to the brand — idempotent, re-running only adds new templates.

{{ installedNote }}

{{ pk.name }}
{{ pk.desc }}
{{ pk.count }} templates · installed on {{ pk.installs }} brands
Install into brand
Trades — templates
TemplateIntentDefault cadence {{ t.template }} {{ t.intent }} {{ t.cadence }}
AI overview{{ aioOps.when }}

{{ aioOps.summary }}

  • {{ pt.text }}
{{ aioOps.basis }}
AI overviewReading this month's sweeps…

Ops

Sweep engine — queue health and cost.

Queued
184
drains every 2 min
Running
12
batch of 20
Done · 24h
1,246
4 engines
Failed · 24h
7
0.6% — threshold 5%
Alerts {{ alertCount }} open
{{ a.type }}
{{ a.brand }}
{{ a.msg }}
{{ a.time }} acknowledged
Failed jobs
PromptEngineAttemptError {{ f.prompt }} {{ f.engine }} {{ f.attempt }} {{ f.error }} Queued
Cost by brand · this month
BrandSweepsCost {{ c.name }}{{ c.sweeps }}{{ c.cost }} Total$104.65
← {{ brandName }} · Content

Coverage gaps

Active prompts with 14-day SOV under 15%, ranked by priority = (15 − SOV) × intent weight × 1.5 when no page targets them.

#PromptIntentSOV 14dPages targetingPriority {{ g.rank }} {{ g.prompt }} {{ g.intent }} {{ g.sov }}% {{ g.pages }} {{ g.priority }}

Briefs are generated with Sonnet (~$0.04 each) from the prompt cluster, latest raw answers, current citations and live pages.

← {{ brandName }} · Content

{{ pageTitle }}

{{ pageStatus }}
Brief FAQPage schema 1,200 words
MUST ANSWER
  • How fast can an emergency plumber arrive in Vancouver?
  • What does an after-hours call-out cost (flat rate vs hourly)?
  • What should I do before the plumber arrives?
OUTLINE
H2 — Emergency response times across Metro Vancouver
Zones served · one-hour window · dispatch process
H2 — 2026 emergency call-out costs (with sources)
Flat-rate table · dated figures · what affects price
H2 — While you wait: shut-off and damage control
Main shut-off locations by home type · insurance notes
ENTITIES
Metro VancouverBC Housingpoly-B pipingbackwater valve
Targeted prompts
primaryemergency plumber vancouver
secondary24 hour drain cleaning near me
Public share link · frozen snapshot from Aug 1, 2026 · expires Oct 30, 2026
North Arm Plumbing — Answer Engine Report
July 2026 · prepared by Structure Webworks
Avg share of voice
38.4%
+2.1 pts
Answers scanned
4,880
4 engines
Cited rate
31%
+4 pts
Winning prompts
emergency plumber vancouver74% ↑
best plumber for repiping vancouver55% ↑
24 hour drain cleaning near me48% →
water heater replacement vancouver cost44% ↑
Work completed this period
24/7 Emergency Plumbing Vancouver — published Jul 2+18.9 pts
Burst pipe response guide — published Jul 9+6.2 pts
Repiping cost guide BC — published Jul 28measuring
Next period
  • Publish a repiping cost guide for BC (high impact)
  • Claim and build out the HomeStars profile (high impact)
  • Add service-area pages for Burnaby and Richmond

Competitors appear anonymized. This report reads from a frozen snapshot — figures reflect the period, not live data.

{{ brandName }}

Contacts & consent

Total contacts
1,284
soft-deleted excluded
Express consent
512
never expires
Implied consent
698
74 expiring in 30 days
Suppressed
74
unsubscribe · bounce · complaint
CASL rules enforced at the database layer. Implied consent auto-expires (24 mo relationship · 6 mo inquiry); every change is logged to consent_events with proof. Purchased lists are rejected on import — no override.
Contacts
NameEmailSourceConsentExpiresAdded {{ c.name }} {{ c.email }} {{ c.source }} {{ c.consent }} {{ c.expires }} {{ c.added }}
{{ brandName }}

Campaigns

CampaignSegmentStatusSentOpenClick
{{ c.name }}
{{ c.subject }}
{{ c.segment }} {{ c.status }} {{ c.sent }} {{ c.open }} {{ c.click }}
Circuit breaker armed
Complaint rate this campaign: 0.08% — auto-pauses sending at 0.3%, no human in the loop.

Every send stores a consent_snapshot — proof of valid consent at send time, kept 24 months (CASL complaint window).

{{ brandName }}

Automations

34 running128 waiting1,904 done6 failed
AutomationTriggerStatus {{ a.name }} {{ a.trigger }} {{ a.status }}
{{ selAutoName }} — flow
Trigger — form submit: "Request a quote"
send_email — "Your quote from North Arm"
wait — 3 days
condition — opened the quote email?
YES
send_email — "Book a call"
NO
add_to_segment — "Cold quotes"

7 node types in Phase 3: send_email · wait · condition · add_to_segment · update_field · webhook · exit. No A/B split or parallel branches yet.

Trigger — consent expires in 30 days
send_email — "Please renew your consent"
wait — 5 days
condition — renewed consent?
YES
update_field — consent_status = renewed
NO
update_field — consent_status = suppressed

CASL-required — implied consent lapses automatically at 30 days unless renewed. Suppression is immediate and logged to consent_events.

{{ st2.label }}

Built in the flow editor — click any step to see its config.

Trigger — field update: job_completed = true
wait — 1 day
send_email — "How did we do?"
condition — clicked review link?
YES
exit — completed
NO
wait — 6 days, then reminder

Currently in draft — held pending a Google review link per brand location.

← Automations

New automation

Steps
No steps yet. Add one below.
{{ bs.label }}
← Campaigns

New campaign

Plain-text version and sender identification block are added automatically at send time.

Estimated reach
{{ estimatedReach }}
recipients in this segment, consent-checked

Deliverability

One sending domain per brand — reputation never shared. SES + dedicated IP.

Bounce rate · 7d
0.9%
warmup threshold 2%
Complaint rate · 7d
0.08%
breaker trips at 0.3%
Suppressed system-wide
203
never re-imported
Sending domains
DomainBrandDKIMSPFDMARCWarmupDaily cap {{ d.domain }} {{ d.brand }} {{ d.dkim }} {{ d.spf }} {{ d.dmarc }}
{{ d.warmLabel }}
{{ d.cap }}

New domains start at 200/day, +40% daily while bounce < 2% and complaints < 0.1%. Unwarmed domains cannot send large campaigns.

Settings

Workspace and notification preferences.

Workspace
Notifications
Email me when something needs approval
Weekly performance digest
SMS for urgent deliverability alerts

Help desk

Answers to common questions, or reach the team directly.

{{ f.q }}
{{ f.a }}
Still stuck?
support@structurewebworks.com · replies within 1 business day
Email support

Data sources

Connect analytics so SOV lines up with real traffic and revenue. Read-only OAuth — tokens scoped per brand.

{{ connCount }} connected
{{ g.name }}
{{ g.scope }}
{{ g.status }}
{{ g.desc }}
{{ s.label }} {{ s.value }}
Metrics appear here after connecting
{{ g.sync }}
Connections are read-only and scoped to one brand. Signalworks never writes to your analytics properties; revoke access anytime from the provider console.

Social scheduling Phase 4 sketch

Google Business Profile first — Meta needs App Review, LinkedIn only when a client truly needs it.

No {{ socialFilterLabel }} account connected

No {{ socialFilterLabel }} posts in the current queue.

Publish queue
ChannelBrandPostScheduledStatus {{ s.channel }} {{ s.brand }} {{ s.text }} {{ s.when }} {{ s.status }}

Reviews Phase 4 sketch

New reviews route here for topic tagging and a drafted reply before anything goes public.

Avg. rating · 90d
4.8
across 340 reviews
Awaiting reply
{{ reviewsPendingCount }}
drafted, needs approval
Replied · 7d
9
avg. response time 6 hrs
{{ r.initials }}
{{ r.name }} {{ r.stars }} {{ r.topic }}
{{ r.snippet }}
{{ r.when }}
{{ r.status }}
{{ reviewDetail.initials }}
{{ reviewDetail.name }}
{{ reviewDetail.stars }} · {{ reviewDetail.when }}
{{ reviewDetail.topic }}

{{ reviewDetail.body }}

Lead scoring Phase 4 sketch

Fit (rules: region, property type, size) × Intent (recent behaviour). Weights ship with the Vertical Pack; recalibrated by logistic regression only after 200 closed-won cases — never earlier.

Fit weights Trades pack v1.2 Recalibration locked · 41 / 200 closed-won cases
{{ w.label }}{{ w.pct }}
ContactFitIntentScoreGrade
{{ l.name }}
{{ l.note }}
{{ l.fit }}
{{ l.intent }}
{{ l.score }} {{ l.grade }}
AI overview{{ aioAttribution.when }}

{{ aioAttribution.summary }}

  • {{ pt.text }}
{{ aioAttribution.basis }}
AI overviewReading this month's sweeps…

Attribution Phase 4 sketch

First-party tracking + identity stitching on form submit. Models: first / last / even only — data-driven attribution needs tens of thousands of conversions this vertical never has.

Jobs booked · quarter
{{ attrTotalJobs }}
{{ attrJourneyCount }} journeys tracked
Revenue attributed
{{ attrTotalRevenue }}
first-touch model
Avg. touchpoints / journey
{{ attrAvgTouchpoints }}
site visit → form → job
From AI answers
{{ attrAiSharePct }}
ChatGPT + AI Overviews, first touch
Revenue by channel · this quarter
ChannelJobs bookedRevenueShare {{ a.label }} {{ a.jobs }} {{ a.revenue }}
{{ a.pct }}
Recent journeys
{{ j.name }}
{{ j.revenue }} · {{ j.steps }} touchpoints
Journey — {{ selectedJourney.name }} · job booked {{ selectedJourney.revenue }}
{{ t.label }}
{{ t.meta }}

Retain & expand Phase 4 sketch

Agency-facing client health — first module to cut if Phase 4 shrinks; worth automating from ~15 clients.

At-risk playbook — False Creek Physio 0 logins · 5 wks silent
{{ a.text }}
{{ a.meta }}
Done
ClientLogins / wkSOV trendRecs doneLast contactHealth {{ h.name }} {{ h.logins }} {{ h.recs }} {{ h.contact }} {{ h.health }}
Install {{ installPackName }} pack
{{ drillLead.name }} Grade {{ drillLead.grade }}

{{ drillLead.note }}

Fit{{ drillLead.fit }}
Intent{{ drillLead.intent }}
Composite score {{ drillLead.score }}
{{ drillChannel.label }}
Jobs booked
{{ drillChannel.jobs }}
Revenue
{{ drillChannel.revenue }}
Share
{{ drillChannel.pct }}
Sample queries driving this channel
{{ q }}
{{ drillClient.name }} {{ drillClient.health }}
Logins / wk
{{ drillClient.logins }}
Recs done
{{ drillClient.recs }}
Last contact
{{ drillClient.contact }}
Suggested next step

{{ drillClient.suggestion }}

{{ drillPost.channel }} {{ drillPost.brand }}

{{ drillPost.text }}

Scheduled: {{ drillPost.when }} {{ drillPost.status }}
{{ flowNodeDetail.title }}

{{ flowNodeDetail.desc }}

{{ fs.label }}
{{ fs.value }}
Configuration
{{ cf.k }}{{ cf.v }}
Export report as PDF

Rendering {{ pdfExportPeriod }}…

{{ pdfExportPeriod }}.pdf is ready.

Generates a print-ready PDF of the {{ pdfExportPeriod }} report, matching the shared-link layout.

{{ deliverabilityDrillItem.prompt }}
{{ deliverabilityDrillItem.brand }}
Engine
{{ deliverabilityDrillItem.engine }}
Attempts
{{ deliverabilityDrillItem.attempt }}
Status
{{ deliverabilityDrillItem.errorLabel }}
What happened

{{ deliverabilityDrillItem.explain }}

Attempt history
{{ h.label }}{{ h.when }}
Disconnect {{ sourceDisconnectItem.name }}?

SOV and reporting will stop pulling from this source immediately. Historical data already synced is kept; nothing new comes in until you reconnect.

{{ sourceDetailItem.name }}
{{ sourceDetailItem.scope }}
{{ sourceDetailItem.status }}
Connected since
{{ sourceDetailItem.connectedSince }}
Sync frequency
{{ sourceDetailItem.freq }}
Granted scopes
{{ sc3 }}
Current metrics
{{ s2.label }}{{ s2.value }}
Sync history
{{ h2.when }} {{ h2.text }}
Disconnected — no data syncing from this source.
{{ contactDetail.initials }}
{{ contactDetail.name }}
{{ contactDetail.email }}
{{ contactDetail.consent }} consent {{ contactDetail.source }}
Phone
{{ contactDetail.phone }}
Added
{{ contactDetail.added }}
Consent expires
{{ contactDetail.expires }}
Lifecycle stage
{{ contactDetail.stage }}
Consent event log
{{ ev.text }}
{{ ev.when }}
Email activity
{{ ac.campaign }}
{{ ac.when }}
{{ ac.result }}
Segments
{{ sg }}
{{ campaignDetail.name }}
{{ campaignDetail.subject }}
{{ campaignDetail.status }} {{ campaignDetail.segment }}
Sent
{{ campaignDetail.sent }}
Open rate
{{ campaignDetail.open }}
Click rate
{{ campaignDetail.click }}
Bounced
{{ campaignDetail.bounced }}
Unsubscribed
{{ campaignDetail.unsub }}
Complained
{{ campaignDetail.complained }}
Timeline
{{ tl.text }} {{ tl.when }}
Content preview
{{ campaignDetail.preview }}
consent_snapshot stored at send time — proof kept 24 months.
{{ automationDetail.name }}
Trigger: {{ automationDetail.trigger }}
{{ automationDetail.status }}
Enrolled
{{ automationDetail.enrolled }}
Steps
{{ automationDetail.steps }}
Completion
{{ automationDetail.completion }}
Enrollment funnel
{{ fn.label }}{{ fn.count }}
Recently entered
{{ rc.name }}{{ rc.when }}
{{ domainDetail.domain }}
{{ domainDetail.brand }}
Authentication records
DKIM{{ domainDetail.dkimRecord }}
SPF{{ domainDetail.spfRecord }}
DMARC{{ domainDetail.dmarc }}
Warmup progress
{{ domainDetail.warmLabel }}

Daily send cap: {{ domainDetail.cap }} · new domains start at 200/day, +40% while bounce < 2% and complaints < 0.1%.

7-day sending health
{{ h.day }}{{ h.sent }} sent{{ h.bounce }} bounce
Add competitor
Import contacts

Drop a CSV file here, or click to browse.

Purchased lists are rejected — every row needs a consent source.

Add contact
New post