Ranqly features
Ranqly is marketing software for local home-service businesses — HVAC, plumbing, electrical, and similar trades — that automates Google Business Profile content, local SEO websites, ZIP-level rank tracking, and lead attribution. Teams use it instead of a large agency retainer to stay visible on Google and, increasingly, in AI assistants such as ChatGPT and Perplexity.
Platform capabilities
-
AI marketing agent
Generates and schedules social posts, GBP updates, and trade-specific content with GEO-optimized structure (quotable facts, FAQs, local entity signals).
-
Ranqly Comms — team communication for field crews
Walkie-talkie push-to-talk voice with AI transcription, offline messaging that survives attics and dead zones, ServiceTitan job channels with per-customer history, and an AI assistant that answers from live job data, coaches from the company's own playbooks, and watches closed jobs for missed invoices and open estimates. Learn about Ranqly Comms.
-
Google Business Profile workflows
Profile optimization, posting, and multi-location support; free GBP audit tool for readiness scoring.
-
Autopublished local SEO websites
Service-area pages, blog, sitemap, schema markup, and
llms.txtfor AI crawlers on customer domains. -
Local rank tracking
ZIP-level visibility measurement and expansion-advisor recommendations.
-
Sales agent & lead attribution
Aggregator and ServiceTitan lead handling, SMS conversations, and source clarity for marketing ROI.
-
AI visibility measurement
Optional weekly probes across ChatGPT-style, Gemini, and Perplexity engines to track brand mentions and citations.
Recent releases
-
Print-verified direct mail
Ranqly's permit-triggered postcards are proofed against real print output, so every mailed piece lands with a scannable QR code and correct contact details.
-
Know which mailbox produced the call
Direct mail now carries a code unique to each household, so a campaign can report which addresses responded rather than only how many pieces went out.
-
Know which ads actually produce customers
Leads now carry the campaign that produced them, and conversions report back to the ad platform from the server as well as the browser, so spend can be judged on customers rather than clicks.
-
Billing moves to Ranqly AI LLC
Subscription billing now runs through the Ranqly AI LLC account, with sales tax handled automatically at checkout once registration is complete.
-
Only claim what you actually offer
Businesses now tick the amenities they genuinely have — live music, dog friendly, catering, dietary options — and the AI mentions only those, so a post never promises something a customer will not find when they turn up.
-
Content that fits the tenant
Posts now match the business they are written for — a nationwide software company no longer gets copy promising to visit the reader's neighbourhood, and each industry is described in the words its own buyers use rather than in generic sales language.
-
Campaign tagging on mailed pieces
Every postcard now carries the campaign that paid for it on the mail provider's own record, so a print-and-postage invoice or a delivery report can be read per campaign instead of reconciled by hand.
-
Per-campaign tracking numbers
A mail campaign can now carry its own phone number, so the calls it produces are counted against that drop rather than pooled with every other one — which is what makes a small test drop readable before a larger one is paid for.
-
ZIP campaigns
A direct-mail drop can now be paired with the local content a recipient finds when they look the company up — the mailed ZIP is favoured in the marketing agent's rotation, capped at a human cadence, so the profile looks active and relevant at exactly the moment someone decides whether to call.
-
Structured-data accuracy pass
Ranqly's own site now declares only capabilities it actually has and keeps internal operations views out of search results, and direct-mail postcards render the contractor's state licence number exactly once however it is stored.
-
Personalised permit-lead direct mail
Ranqly can now print and mail a postcard to every home whose permit record shows aging HVAC, with that household's own install year printed on the card — targeting no purchased mailing list can reproduce, sent without leaving the platform.
-
Mail-ready lead export
The replacement-opportunity export now produces a complete mailing list — proper name, street, city, state and ZIP — so a comfort advisor can hand it straight to a print vendor or a direct-mail platform instead of rebuilding addresses by hand.
-
ServiceTitan customer creation
Leads and permit-lead mail batches now create their ServiceTitan customer in a single write, with the service location and campaign tag attached — so a comfort advisor's mailing list and the CRM stay in step without anyone re-keying an address.
-
Release #1931: ServiceTitan customer creation fix
Leads and permit-lead mail batches now create their ServiceTitan customer in a single write, with the service location and campaign tag attached — so a comfort advisor's mailing list and the CRM stay in step without anyone re-keying an address.
-
Release #1929: ServiceTitan hand-off for permit-lead mail
A comfort advisor mails 10 permit-lead homes a day, and those 10 now appear in ServiceTitan as tagged customers the moment they go out — so the CRM records real outreach instead of absorbing a 15,000-row prospect dump it cannot bulk-delete. Owner names arrive from the county appraisal roll surname-first and all-caps, with co-owners and trustees appended; they are rewritten into how a person is actually addressed before anything is printed.
-
Release #1927: permit-lead mail attribution + LOB_API_KEY manifest pin
Shipped: feat(sales): campaign attribution for permit-lead mail (#1926); fix(deploy): pin LOB_API_KEY in the manifest; explain a zero verify result.
-
Release #1924: 10-at-a-time paging with page-scoped verification
200 strong leads in a ZIP isn't a day's work for a comfort advisor — 10 is. The card now pages at 10 and verification is scoped to the page in front of you, so cost tracks usage: 10/day ≈ 300 lookups/month, exactly the free tier.
-
Release #1922: controlled, cost-guarded address verification
Closes a live cost risk and makes verification an explicit, scoped action.
-
Release #1920: address verification cast fix and USPS vacancy signal
Adding a real LOB API KEY exposed a bug that had been dormant behind the no-key guard.
-
Release #1918: customer-match audience hashing script
Adds scripts/hash-audience.js — turns a customer export into a SHA-256 audience file for OpenAI Ads, Google Customer Match, or Meta.
-
Release #1916: strong-opportunity markers and honest sync notice
Two UI fixes on the Replacement opportunities card.
-
Release #1914: permit sync watermark, suppression, Start outreach, UI fixes
Five defects found by putting the feature in front of a real user. The sync itself worked — 14,995 opportunities, 9,579 owner-enriched — these are the things around it.
-
Release #1912: fix permit-opportunities auth (all routes were 401ing)
Fixes a live defect: every route on /permit-opportunities has been returning 401 since it shipped.
-
Release #1910: TCAD join for replacement opportunities
Wires the imported tcad properties data into the Replacement opportunities card. It was loaded last release but nothing read it.
-
Release #1908: permit address verification, ZIP routing, TCAD enrichment
Ships the enrichment and routing layer for Replacement opportunities, plus the tcad properties table that a pending Cloud SQL import needs to land in.
-
Release #1906: Sync now for replacement opportunities
Adds the manual sync trigger, which is what currently blocks enabling the feature for a tenant — the monthly cron was the only path to populate the table, so turning it on meant waiting until the 1st.
-
Release #1904: permit sync truncation fix
Follow-up to 1902. Fixes a truncation bug found while preparing to enable the feature for tenant 2 with their real 44-ZIP footprint.
-
Release #1902: permit-record replacement opportunities (tenant side)
Production release of the Replacement opportunities feature. develop is 5 commits ahead of main .
-
Release #1898: Ranqly AI LLC entity disclosure, Organization schema, founder photo
Production release of the Google for Startups Cloud unblock. develop is 4 commits ahead of main , all scoped to the marketing site.
-
Release #1893: stop generating unpublishable posts + canonical host/protocol
Marketing content is no longer generated for accounts that have nowhere to publish it: the daily auto-schedule fallback now skips internal and test tenants along with any account that has no connected profile, and claims each day exactly once so a scaled-out deploy cannot produce duplicate posts. An approval queue whose posts all sit below the quality threshold can now release its best pending post instead of going silent indefinitely. Site-wide, every page resolves to a single canonical host and protocol.
-
Release #1877: Pulse day-scoped ServiceTitan reporting
Pulse can now answer "How much revenue did we make today / this week?" and "How many jobs did we complete?" from a company-wide, timezone-aware ServiceTitan sweep (the st_period metrics block: today plus the trailing 7 days), alongside the existing linked-job sample. Bounded pagination with truncation flagging.
-
Release #1875: Business Pulse entry-point render fix
1874 — fix(comms): render the Business Pulse entry point. The backend for Business Pulse (per-tenant flag, /pulse/open find-or-create, private per-admin membership) worked, but the comms frontend never rendered the entry element — enabling the feature had no visible effect for any tenant. The channel list now shows…
-
Release #1872: vertical-agnostic blog pipeline + latency advisory
1869 — Vertical-agnostic blog autopilot. Blog topic selection, composer prompts, quality-gate citation rules, and several agent/reviewer fallbacks now resolve from the tenant's category pack instead of assuming HVAC. HVAC tenants keep byte-identical service/angle catalogues; non-trades tenants (edtech, restaurant, …)…
-
Release #1863: Business Pulse + p99 advisory
Promotes develop to main: Ranqly Pulse (admin-only private analytics assistant, per-tenant flag, default off) and the p99-advisory gate calibration. Self-reviewed.
-
Release #1860: staging perf mutex
Promotes develop to main: cross-pipeline concurrency mutex on the staging-ingress perf window — closes the k6 50%-404 collision class. Self-reviewed.
-
Release #1858: digest degraded fixes
Promotes develop to main: 10s pool connect timeout (shared-core stall headroom), signup-probe posts excluded from the publish pipeline, probe tenants excluded from auto-publish and rank-tracking health checks. Self-reviewed.
-
Release #1838: mention picker + replies
Promotes develop to main: @-mention picker (AI + teammates with non-member warning), tolerant @ai detection, reply/quote with AI context threading. Self-reviewed.
-
Release #1834: trusted-domain manual fetch
Promotes develop to main: @ai fetches manufacturer-manual PDFs from allowlisted domains (16 platform defaults + per-tenant additions in Comms settings), with SSRF-guarded fetching and PDF magic-byte validation. Self-reviewed.
-
Release #1832: ai doc context + whisper guards
Promotes develop to main: @ai reads PDF attachments shared in the channel (cited by filename; honest fallback when the provider can't take documents) and voice transcription no longer captions silent clips with Whisper hallucinations. Self-reviewed.
-
Release #1829: about founder linkedin
Promotes develop to main: founder LinkedIn byline + Person structured data on /about (Google for Startups application prerequisite). Self-reviewed.
-
Release #1816: probe-tenant metrics fix + reaper armed on app tier
Ships PR 1721 (sole change since last release):
-
Release #1793: probe cleanup + comms 429 fixes
Promotes develop to main: signup-probe reaper armed + eligibility guard (ends the daily cron db unavailable alerts and 98% waste in marketing LLM spend), comms per-user limiter fixes (stream exempt, 480 cap, client backoff hardening), digest long-tail rollup. Self-reviewed.
-
Release #1746: comms device continuity
Promotes develop to main: phone-only re-auth after session expiry (remembered invite token) and the 📱 sign-in-on-another-device handoff. Self-reviewed (Copilot out of credits).
-
Release #1717: fix extensionless audit URLs (campaign blocker)
One-line fix: express.static now resolves /audit/<slug to <slug .html. Without this every link in the re-engage campaign 404s. Verified /audit/zip-air-waco.html serves 200 in prod; this makes the clean URL work too.
-
Release #1716: AI-visibility audit pages for re-engage campaign
Publishes 191 static personalized audit pages under /audit/<slug — the landing payload for the Smartlead re-engage campaign (191 past leads, 94% measured AI-dark by 297 live ChatGPT probes on 2026-07-24). No app code changes; served by existing static middleware. Merging makes the campaign's baked-in links resolve.
-
Release #1710: uploads range support
Promotes develop to main: HTTP Range (206) support on /uploads — fixes voice-clip playback errors on iOS and wrong durations on desktop.
-
Release #1687: SRE dedup fix, orphan job registration, startup stagger
Releases the three fixes from the 2026-07-19 pool-saturation incident review:
-
Release #1671: last_login migration fix
Promotes develop to main: users.last_login migration is now adapter-aware and runs on the Postgres boot path — root fix for the staging login 500s behind the k6 failure rate. Staging was already patched live.
-
Release #1668: housekeeping
Promotes develop to main: recalibrated k6 perf gate (staging-noise-aware thresholds + live p99 check), SendGrid removed from deploy manifests (Gmail SMTP is the provider), SQLite migration noise fixes, and local-schema cleanup. Cloud SQL max connections=100 and live SendGrid removal were applied directly and verified.
-
Release #1663: daily business pulse digest
Promotes develop to main: end-of-day platform-admin pulse email (posts per tenant, Comms top tenants/people, leads, signups) at 9 PM Central, plus the an index on chat_messages.created_at.
-
Release #1661: team adds born verified + list fix
Promotes develop to main: admin-added teammates are born verified with a welcome email (fixes the unloginable-teammate loop), and the Users list/bulk dedupe ignore removed (deactivated) accounts — Remove now visibly removes.
-
Release #1647: admin removal guard
Follow-up to 1646: DELETE /tenants/:id/users/:userId refuses role='admin' targets — closes the privilege-escalation Copilot flagged (company admin deactivating a platform admin that shares their tenant id).
-
Release #1646: multi-tenant accounts + user removal
Promotes develop to main: single-login multi-tenant support (company picker at login, in-header tenant switcher, clean degradation when access to one tenant is lost) and user removal in the Users card — unblocks Bryan and cleans up duplicate signups.
-
Release #1641: oversight probe fix
Follow-up to 1640: role/token validation runs before the per-tenant oversight flag check, so non-admin users can't probe whether owner view is enabled.
-
Release #1640: opt-in owner view
Promotes develop to main: Comms owner view (company-chat oversight) is now off by default for every tenant, enabled per tenant by the platform admin from the Companies row menu. All oversight endpoints and the owner-view ST-sync fallback enforce the flag server-side.
-
Release #1617: category AI personas
Promotes develop to main: platform-admin default @ai personas per tenant category (admin UI card + /admin/comms-personas), tenant persona still overrides; comms settings shows the inherited default.
-
Release #1615: comms persona, announcements, bulk import
Promotes develop to main: per-tenant AI persona for @ai, announcement/broadcast channels (office-posted, everyone auto-joins, read-only for techs), and CSV bulk member import — the non-profit onboarding feature set.
-
Release #1611: non-profit tenant category
Promotes develop to main: non-profit tenant classification (admin pill + toggle, POST /admin/tenants/:id/category, CHECK-constrained tenants.category column) and Comms join copy that no longer assumes ServiceTitan — ahead of the incoming non-profit Comms customer.
-
Release #1569: comms documents + owner-view ST sync
Comms gains document sharing — techs and office can attach PDFs, Word/Excel files, and CSVs in job channels, with filenames carried through to ServiceTitan — and owners can push any message to ServiceTitan straight from the read-only owner view.
-
Release #1565: comms summary entity fix
Follow up to 1561 addressing Copilot review: HTML entities in ST job summaries decode before tag stripping (entity escaped markup can no longer resurface as literal tags), and the media signing bucket test is time frozen for determinism.
-
Release #1561: restore comms media (signed URLs)
Hotfix release: signs comms media url on every API response so photos/voice/video render again under the fail closed /uploads gate from 1540. No stored data changed — all existing media reappears on deploy. Also strips raw HTML from ST job summaries in channel system messages.
-
Release #1540: security hardening + prod webhook secret pins
Security hardening: locked-down registration, Bearer/JSON OAuth start flow, fail-closed ServiceTitan and leads-ingest webhooks, signed upload URLs, and webhook secrets pinned in the production deploy manifest.
-
Release #1527: release
Comms: walkie talkie reliability (tap to resume for blocked audio, poll driven catch up, screen wake lock), Company/Archived entries admin only, admin deep links open via owner view; OHA llms.txt additions
-
Release #1523: release
Comms: archive/restore groups; app name shows as Ranqly Comms on phones
-
Release #1521: release
Comms: walkie talkie mode, channel sections w/ jobs by appointment day, group rename, PIN gated owner oversight (Company chats)
-
Release #1520: release
Comms: walkie talkie mode (auto play incoming voice, offline catch up), channel list sections with jobs grouped by appointment day, group rename
-
Release #1507: release
Fix duplicate social post generation when Cloud Run scales out (once per day claim; 2026 07 08 incident: 6 duplicate review digests) Storage cleanup moved to wall clock daily cron (stops false SRE staleness alerts)
-
Release #1489: release
Send to ServiceTitan: media attachments now post to the correct Forms API endpoint (was 404ing); permission specific error messages
-
Release #1486: release
Send to ServiceTitan: size rejections now surface a clear 'file too large' message; ST error details logged for diagnosis
-
Release #1478: release
Inbound integrations webhook: external tools (FieldOps) can deliver post job findings into the job's comms channel by ServiceTitan job id (per tenant token in Settings)
-
Release #1469: release
Comms app now detects deploys and shows a one tap Refresh banner in open tabs (on reconnect, foreground, and every 10 min)
-
Release #1467: release
AI copilot team coaching in group channels (per group on/off switch for admins; 15 min cooldown; DMs stay @ai only)
-
Release #1463: release
AI copilot wiring answers now include a rendered schematic image (pinch zoomable PNG) alongside the text map; diagrams attach to ServiceTitan jobs via the existing push to ST flow
-
Release #1461: release
Comms AI copilot upgraded to Claude Opus 4.8 with adaptive thinking — expert level, measurement led troubleshooting for senior techs; automatic OpenAI fallback; unified usage/budget logging
-
Release #1459: release
AI copilot: wiring diagrams & tables now answered inline (no more refusals); direct asks get up to 300 words / 700 tokens AI copilot: knowledge gap self reporting — unanswerable questions notify admins automatically (no more copy pasting chats)
-
Ranqly Comms — playbook citations and team adoption insights
The Comms AI now cites coaching sources by name and company (per the 10 Commandments from One Hour), and admins get a team-activity view showing who is actively using Comms versus who needs a nudge — installed, quiet, or active at a glance.
-
Ranqly Comms AI — live job answers, playbook coaching, privacy guardrails
The Ranqly Comms AI assistant now answers technicians' job questions from live ServiceTitan data (status, invoices, estimates), coaches crews from the company's own uploaded playbooks citing documents by name, and enforces privacy guardrails — politely refusing requests for customer information beyond the job's needs a
-
Ranqly Comms — the AI now hears voice messages and watches the money
Ranqly Comms' AI assistant now transcribes walkie-talkie voice messages so it can help with what technicians actually said, answers every direct @ai question, and watches completed jobs — flagging missing invoices and nudging technicians to follow up on open estimates. Group chats gained member removal, and technician
-
Ranqly Comms — smarter job channels and group management
Ranqly Comms channels now follow the dispatch board more intelligently: job channels sort by appointment time, finished jobs clear out of the list automatically, admins choose which office staff join job channels, and existing group chats can add teammates any time.
-
Release #1420: vapid manifest
Pins the comms VAPID push secrets in the production set secrets manifest (+ APP REQUIRED SECRETS) so deploys stop stripping them. Secrets already created and attached to the live service.
-
Release #1413: comms (test fix)
Re runs the comms production release. Unblocks the unit test gate: website tenant chatbot test updated for the schedulerScript embed (eabc1cf) that sits between chatbotScript and </body .
-
Ranqly Comms — team communication for trades crews
Launches Ranqly Comms at /comms: an installable team chat app for field crews with walkie-talkie push-to-talk voice, offline messaging that survives dead zones, ServiceTitan-linked job channels with per-customer history, an AI assistant that helps technicians troubleshoot on site, and passwordless invite-link onboardin
-
Release #1306: Starter removal from marketing, founding customer onboarding waiver
Promotes two develop commits to production: public marketing now shows Pro/Growth only (Starter removed from pricing, FAQ, and related pages), and a founding customer offer waives onboarding for the first 50 signups who agree to a testimonial or case study—with signup checkbox, /public/founding offer API, and admin not
-
Release #1305: newsroom index, footer links, homepage trust bar
Ships the marketing newsroom hub at /newsroom, Newsroom links in public footers, and a homepage trust bar with the NVIDIA Inception badge and One Hour case study link. Staging deploy for develop passed before merge.
-
Release #1289: trust-mode emails, signup pricing, ST ROI phone calls
Ships develop to production: trust mode marketing generate digests and FB/IG GBP preview links ( 1287), ServiceTitan inbound call counts on the ROI dashboard ( 1288), signup Pro/Growth pricing with /signup redirect and the plain language One Hour case study ( 1285), plus k6 login assertion fix and warm GTM docs.
-
Release #1282: develop → main (SEO thin-content fixes, blog autopilot, image optimization)
29 commits since the last release. Headline changes:
-
Release #1271: develop → main (NVIDIA press, ops-copilot SMTP, security fixes)
Promotes develop to main since release 1240.
-
Release #1240: develop → main (Plan A additive hub, trade-aware FAQs, baseline)
Promotes the Plan A batch + carry forward to main.
-
Release #1235: develop → main (AEO quick wins, admin UX, a11y)
Promotes the latest develop work to main.
-
Release #1227: develop → main (per-tenant Hearth financing)
Promotes the per tenant Hearth financing feature ( 1226) to main.
-
Release #1224: develop → main (Hearth financing + per-tenant gbp_place_id)
Shipped: review: address Copilot feedback on PR #1223; feat(website): wire Places review snippets into per-tenant reviewSummary; chore(scripts): add GBP review-ingest diagnostic (+ location discover/sync); feat(website): per-tenant gbp_place_id -> live Google rating/count via Places API; feat(website): add Hearth 0%...
-
Release #1168: sharper local signals on auto-posts
Auto-posts can now carry each business's city and state, strengthening the local entity signals that help AI search engines recognize and cite your business.
-
Release #1166: mobile homepage sign-in layout
Ships the mobile homepage fix so sign in appears under the hero (above the case study card) on narrow screens, avoiding portrait scroll/landscape only login. Single UI change in app/public/index.html.
-
Release #1157: deployment reliability improvements
Behind-the-scenes infrastructure and deployment hardening to keep Ranqly fast and reliable. No changes to your published content.
-
Release #1151: GEO entity signature + dynamic GEO research
Ships PR 1150: GEO entity signature and dynamic GEO research. Staging deploy on develop succeeded after merge.
-
Release #1141: Ranqly brand GEO (llms.txt, /features, auto-bump)
Production release of marketing site GEO from develop ( 1140): curated llms.txt for generative engines, /features page with quotable product copy and schema, expanded robots Allow for AI crawlers, sitemap entries for /features and /leakage audit, and an automated workflow that bumps marketing GEO on develop→main releas
-
Customer lead acknowledgment
Templated "we got your request" SMS via send.dm when AI auto-outreach is off — feature-flagged for safe rollout.
-
Technician notifications (sent.dm)
Multi-channel template notifications for job dispatch and schedule changes; per-tenant opt-in.
-
Market leakage audit
Estimates trade market size by ZIP and share vs competitors using Census and Places data. Public tool at ranqly.ai/leakage-audit.
Frequently asked
What is Ranqly?
Ranqly is software for local contractors who need consistent marketing execution: content, GBP, websites, and measurement — without hiring a full agency team.
Who is Ranqly for?
HVAC, plumbing, electrical, and other home-service businesses that serve customers in defined ZIP codes and want sustainable local visibility.
Does Ranqly help with ChatGPT visibility?
Yes. Published customer sites include GEO-structured content and llms.txt. Ranqly can also run AI visibility probes to measure whether generative engines mention your brand.
See plans and onboarding details on the pricing page, or review product videos first.
View pricing Watch videos