Cruxdata

cruxdata.

Admin Portal

Incorrect password

Select a client

or add a new one to get started

Tasks

No tasks match this filter.

Status

Visibility

Organizer

Recurring

Created

Last updated

Google Meet

Calendar

In Google Calendar, go to Settings → your calendar → Integrate calendar → copy the Embed code src URL.

Connected

Recommended. Connects your Google Calendar via OAuth so the Meetings column can show full event titles even on Workspace accounts. No need to make your calendar public.

Used for the Meetings column on the Tasks page. In Google Calendar, go to Settings → your calendar → Integrate calendar → copy Secret address in iCal format. Treat this URL as a password.

Paste your Google Calendar embed URL above to display your calendar here.

Referrals

Track client referrals and credit amounts.

Log a referral

Loading…
No referrals logged yet.

Email Sequences

Multi-step drips. Worker runs every 15 min and sends any due step.

Sequences

Active enrollments

No active enrollments.

Audit Log

Recent write actions across the dashboard.

When Actor Action Entity Details
No entries yet.

Portfolio

Agency-wide rollup across all clients — last 30 days vs prior 30 days.

Aggregating across clients…

MRR

ARR

Potential MRR

Active clients

Client Performance

Sorted by total ad spend, last 30 days

Client Google Ads Meta Ads Conv. Sessions

Anomalies

Cross-client scan for metric moves > 30% between the two most recent data points. Ranked by severity.

Running cross-client scan…

All clear

No metric anomalies detected across your client roster in the most recent comparison window.

What's New

Everything the tool does today, and what shipped recently.

Recent releases

Everything the tool does

Report Due

— sorted by next due date

Loading…
Client Last Report Next Due Days Until Calls Active
No clients found.

Next report preview

Recent calls

Last report sent

Optimizations to include

All optimizations for this client (any status): (total: )

Nothing will be included

Either there are no approved/applied optimizations for this client, or every one of them was already sent in a prior report. Approve some in the Optimizations tab, then re-run this preview.

Included in next report

Loading…

Website approvals

Changes clients make in their portal wait here. Nothing reaches a live site until you approve it. Approving publishes exactly the version shown.

Hook library

Hook types for Meta and short-form ads. A web scan on the 1st of each month updates each hook's trend and evidence and adds new types; our own top ads are tagged by hook with their hook rates. Each client's recommendations (Campaigns, Hooks) refresh after the scan.

Compliance

What Cruxdata covers automatically vs. what you still need to handle. This is not legal advice — a startup lawyer should review before scaling.

Covered by Cruxdata

  • Privacy policy at /legal/privacy — discloses all data collected, all third-party subprocessors (Anthropic, Google, Meta, GHL, HubSpot, Resend, Stripe, Railway, Slack), and explicit AI-use disclosure.
  • Terms of service at /legal/terms — liability limit, arbitration clause, acceptable-use rules, warranty disclaimer.
  • Refund policy at /legal/refund — one-click cancellation guarantee, free-trial reminder promise.
  • Data-request page at /legal/data-request — CCPA/GDPR access, delete, correct, export.
  • Cookie-consent banner on all public pages (personal-brand site, client portal, onboarding form).
  • CAN-SPAM: every marketing email includes an unsubscribe link, physical address, and RFC 8058 one-click List-Unsubscribe header. Global suppression list checked before every send.
  • AI safety filter — self-harm / crisis content routed to a crisis-resources response before Claude sees it (client-portal "Ask Claude to edit" input).
  • Onboarding form requires explicit consent for data processing + AI use before submit.
  • Rate limiting on public POST endpoints (onboarding, data-request, admin AI-cost endpoints).
  • HTTPS everywhere (Railway edge).
  • No fake testimonials on the marketing site.

Needs your action before scaling

  • • LLC / entity formation. Personal liability shield. Cheapest and highest-leverage item. Set up an Oregon LLC (~$100) or use Stripe Atlas / Firstbase (~$500 for Delaware C-corp) — whichever fits your growth plan.
  • • Set env vars for postal address + agency name. Set AGENCY_NAME and AGENCY_POSTAL_ADDRESS in Railway so email compliance footers show your real business address. CAN-SPAM requires a valid physical address in every marketing email.
  • • DPA (Data Processing Agreements) with subprocessors. Sign Anthropic's DPA (in their console), Google's, Meta's, HubSpot's, Resend's, Stripe's. Free; takes 15 minutes each. Required by GDPR if you have any EU users.
  • • Business insurance. General liability + cyber/E&O once you have paying clients. ~$50-100/mo for a small agency. Hiscox, Next, or a local broker.
  • • DMCA agent registration. $6 with the Copyright Office. Gives you safe-harbor from copyright claims over user uploads (photos on campaigns, HTML files).
  • • Startup lawyer review. One-hour paid consult ($200-500) to review the pages above for your specific state + business setup. Worth much more than a checklist.
  • • Sales tax / VAT. If you sell into California, EU, UK, or other tax jurisdictions above their thresholds. Stripe Tax handles this — ~0.5% of revenue.
  • • Trademark search + registration for "Cruxdata". ~$275/class filing fee with the USPTO. Do it now if you plan to grow the brand.
  • • Real testimonials. Case-studies section on the marketing site is intentionally empty. When you have signed permission from a real client with real metrics, add them back.
  • • ADA/WCAG audit of the admin app. The generated Website Builder output is WCAG 2.1 AA — the admin app itself hasn't been audited. Not critical while it's an internal tool but worth knowing.
  • • Localize crisis resources. The AI safety filter returns U.S. hotlines (988, 741741). If you onboard EU or other-region clients whose users touch the "Ask Claude to edit" box, localize.

Data requests received

This is not legal advice.

Client Onboarding

Send a signed onboarding link to a new prospect. When they submit, a client record is created automatically and linked back here.

Label this link (optional)

Just for you — helps you tell links apart before the prospect submits. The prospect never sees it.

New link ready to send

Copy the URL below into an email, text, or DM to the prospect. It's unique to them and only works once.

Preview ↗

All invites

No onboarding links yet. Create one to get started.

CRM

MRR

ARR

Potential MRR

Potential ARR

+ Add column
No columns yet. Click + Add column to start.

Attribute Stripe Subscription

Pick a subscription — MRR will auto-populate from the plan price.

Loading Stripe subscriptions…
No matching subscriptions.

pending GoHighLevel installs

Each of these completed the OAuth flow but wasn't attached to a Cruxdata client. Click one to attach.

Attach GoHighLevel install

A GoHighLevel location just connected via the Marketplace. Pick which Cruxdata client it belongs to.

Location ID:

Service Catalog

Services you can offer. Add them to cards to track MRR.

No services yet. Add one below.

Add Service

$

Health

No red flags — healthy client.

Diagnose

Why is [metric] down? Cross-channel root-cause answer with specific dates and events.

Clarity

Session recordings, heatmaps, and rage-click tracking for this site.

Open in Clarity →

CRO Analyzer

Feed a landing page URL. Get a ranked list of fixes with expected lift.

QBR

Quarterly Business Review — 90-day narrative with wins, learnings, and next-quarter bets.

Citations

Local directory audit — ranked list of where to claim listings for this business.

Quarterly Business Review

Verdict

Wins

Learnings

Next quarter — strategic bets

Local Citations Audit

Priority directories

Industry-specific directories

NAP consistency rules

Next actions

Diagnose a metric drop

Verdict

Headline

Magnitude

Primary cause

Contributing factors

Recommended actions

CRO analyzer

Summary

Ranked fixes

Onboarding Status

Everything we need to run this client end-to-end

Latest Ad Spend

Latest Sessions

Unread Messages

Sync All Sources

Pull GA4, Search Console, and Google Ads — syncs current + comparison period automatically

to
Comparison period (auto):

GA4 GA4 failed — GA4

Search Console Search Console failed — Search Console

Google Ads Google Ads failed — Google Ads

Generated Reports

No reports yet. Use "Automate Report" from the Report Due dashboard.

SEO Audit Report

Audit in progress — this takes 5–10 minutes. Save the report when complete, then upload it above.

No SEO audit uploaded yet. Upload a saved SEO audit HTML file or run a new audit using the tool above.
· ·

Site Health

AI Health

Errors

Warnings

Thematic Reports

+ more — see SEO tab for full list

Sync from Google Ads

Set your Ads Customer ID in first.

to

Google Ads Metrics

New Ads Entry

No ads data yet.
Period Spend Impressions Clicks Conversions CTR CPC

Sync from Google Analytics 4

Grant agency-dashboard-sync@cruxdata-335822.iam.gserviceaccount.com Viewer access in GA4 before syncing.

Set your GA4 Property ID in first.

to

Website Traffic (GA4)

New Traffic Entry

No traffic data yet.
Period Sessions Users New Users Pageviews Organic Bounce

Click any meter to enter the exact number from your external audit — it saves immediately and shows on the client dashboard.

SEO Audit Report

Audit configuration

Hide

These get asked verbatim to Claude / Perplexity / OpenAI / Gemini. We measure how often this client shows up in the answers.

No SEO audit uploaded yet. Upload a saved SEO audit HTML file to see the full report.

Site Health

AI Health

Errors

Warnings

Severity:

Issue ⇅ Type Why It Matters How to Fix URLs ⇅ Severity ⇅ Health Impact

Pages with Issues

Sync from Google Search Console

Set your Search Console URL in first.

to

PageSpeed Insights

Click "Run Now" to fetch live PageSpeed scores.
Fetching scores (this takes ~10–20 seconds)...

Mobile Score

Desktop Score

LCP (mobile)

CLS (mobile)

AI SEO Analyzer

Paste Google Search Console data or notes. Claude will generate action items.

Search Console Metrics

Period Impressions Clicks CTR Avg Pos Desktop Mobile
No SEO metrics yet.

Action Items ()

No action items yet. Use the AI analyzer or add manually.

AI SEO — Visibility Across LLM Answer Engines

Runs your seed prompts across Claude, Perplexity, OpenAI, and Gemini. Measures whether the client is mentioned, at what rank, and whether their site is cited.

No AI visibility data yet. to populate this.

SERP + AI Overview snapshots

Keyword Your rank AI Overview Cites you Captured

Backlink profile

Source: DataForSEO. Rank is a 0-1000 domain-authority proxy — the higher the more competitive terms this site can rank for.

Domain rank

Referring domains

Total backlinks

Broken inbound

New (recent)

Lost (recent)

Dofollow ratio

Competitor comparison

Domain Rank Referring domains Backlinks

Top anchor text

AI Crawler Policy

Which AI bots can currently reach the site based on robots.txt, and whether llms.txt is published.

llms.txt

robots.txt

Ask AI about

Claude Opus 5, scoped to this client only. Pulls their metrics, optimizations, notes, campaigns, SEO items, GBP reviews, blog posts, CRM cards, and to-dos. No other client's data is loaded.

Ask anything about this client.

Thinking…

Messages with

No messages yet.

Client Settings

Industry

Drives the hook recommender (Campaigns, Hooks) and its monthly refresh.

Industries you added

GitHub token (agency-wide, all repos)

Used to push and edit every git-backed site that has no token of its own: Promote, the git editor, the client portal and the CloudCannon snippet install. Create it once at GitHub (Settings, Developer settings, Personal access tokens): a fine-grained token for preston-bot with Repository access "All repositories" and Contents read and write, or a classic token with the "repo" scope.

DataForSEO credentials (agency-wide)

Powers SERP + AI Overview capture, keyword volumes, and backlink data for the SEO audit. Get creds at dataforseo.com. Shared across all clients.

Basic Info

Monthly reports will be emailed here automatically.

All reports and admin emails go to the primary address plus everyone listed here. Invalid entries are ignored on send.

Business details for search

Address, hours, map coordinates, service area and services. They go into the site's structured data and llms.txt so Google and AI assistants can state them accurately. Website builds fill these in from Google Business Profile and from the site itself. Anything typed here always wins.

Not known yet: .

Working…

To put changes on a site that is already built: Website tab, Refresh SEO data on the saved build, then Promote.

Google API Identifiers

These IDs tell the dashboard which Google accounts to pull data from. See the README for setup instructions.

Grant agency-dashboard-sync@cruxdata-335822.iam.gserviceaccount.com Viewer access in GA4 before syncing.

Found in Google Analytics → Admin → Property → Property details.

Must exactly match the property URL shown in Google Search Console.

Found at the top of your Google Ads account (the 10-digit number).

Authorization: none. Set GOOGLE_ADS_REFRESH_TOKEN or authorize this client.

Free at clarity.microsoft.com. Session recordings + heatmaps + rage-click tracking. Once set, a "View recordings" link appears on the client's Overview.

Connect a Meta business account, then pick an ad account to sync.

Connected— days left Expires in days — reconnect soon Expires in days — reconnect now Token expired — reconnect required

Meta long-lived tokens are 60-day. Reconnecting takes ~10 seconds and rolls the expiry forward another 60 days.

Click the dropdown to load accounts.

Required for publishing Meta ads — every ad must specify which Page runs it. Find it under your FB Page → About → Page ID.

Extracted once from the client's website. Injected into every Claude call (proposals, reports, "Ask Claude to edit", email drafts) so every piece of copy reads like the same brand.

Last extracted Add a website URL above first.

Saved — new Claude calls will use this voice.

In HubSpot: Settings → Integrations → Private Apps → Create private app. Scopes: crm.objects.contacts.read + crm.objects.deals.read. Paste the token here — Cruxdata mirrors contacts and deals for reporting.

Last sync:

Paste a Slack incoming-webhook URL and Cruxdata posts a Claude-written weekly update every Monday at 8am. Data from ads, SEO, opportunities, and optimizer actions in the last 7 days.

Paste a Drive folder URL or ID. The Files tab mirrors this folder and generated docs (Ad Strategy, Case Study, Landing Analysis) are created here as editable Google Docs.

Connected Google account: — the folder must be visible to that account (share it if it lives on a different Google account).

Google isn't connected yet.

Linked — open folder in Drive ↗

Format: accounts/123456789/locations/987654321 — find this in your GBP dashboard URL.

Connected

Repaired to:

Current:

Other locations available:

Google Preferred Sources — "Add to Preferred" badge

Adds a Google-styled button to this client's website so their audience can pick them as a preferred source in Google Search. Boosts their odds of showing up in Top Stories + AI Overviews with a "preferred" pill.

Installed— via Not detected
Open Google's chooser →

                

WordPress: paste into Insert Headers and Footers / WPCode / your theme header. Squarespace / Wix / Webflow: paste into Site Header custom code. Once it's live, click Re-scan homepage above to flip the status to Installed.

GoHighLevel — Lead Attribution

Pull form submissions from this client's GHL location and push them into Google Ads as offline conversions attributed to the ad-click that generated them.

Connected Not connected

Requires the client to authorize their GHL sub-account (opens in a new tab).

Location:

Form → conversion action mapping

Check any form that should count as a conversion. Pick which Google Ads conversion action fires when a submission with a valid gclid lands.

Form name Google Ads conversion action Default value

Landing-page snippet

Paste this on every landing page that Google Ads points to. It captures ?gclid from the URL, stashes it, and drops it into any hidden field named gclid on the page's forms.

Recent submissions

When Contact Form gclid Ads sync

Conversion Tracking Status

Auto-detected from this client's Google Ads account. Determines whether conversion columns and metrics appear in the client dashboard and reports.

Conversion actions counted in reports

Google Ads adds every conversion action into one number. Untick any action that should not count. Report totals, conversion rate, cost per conversion, the AI summary, the emailed report, and the client dashboard all follow this list. New actions are counted until you untick them.

Optimizer targets

The ads optimizer judges every campaign against these. Leave blank to judge against the account average. Notes are passed to the analysis as constraints, for example "seasonal, quiet in winter" or "never pause the brand campaign".

Weekly routine and auto-apply

Every Monday at 6am the optimizer runs for this client and the results wait for review. With auto-apply on, items that are high priority and high confidence, of the types ticked below, are applied without review: at most 5 per run, and always inside the guardrails (40% budget cap, 30% bid cap, 20% target cap, 7-day cooldown, 15 changes per day). Everything else still waits.

No conversion actions recorded yet. Click Refresh from Google Ads, or generate a report; both pull the last 30 days.

CountConversion actionLast 30 daysValue

Changes apply to the next report you generate and to the client dashboard on its next load. Already-sent reports are not changed.

Performance Scores

Manually set scores (0–100) shown as meters at the top of the client overview and report.

Client Portal Link

The client's private link. Opening it signs that device in; keep it private, since anyone with it can see the dashboard. The short /c/name address only works on devices already signed in, and otherwise lets the client email this link to the address on file.

People with dashboard access

These people can get the private link emailed to them from the dashboard's sign-in page, or you can send it now. They do not receive reports. The client's main email and report cc addresses can always get the link too.

Nobody added yet.

Client Files

Mirrored from Google Drive folder open ↗

Local uploads only — link a Drive folder in Settings to mirror a shared folder here.

Loading Drive folder…

Google isn't connected.

Name Type Modified Owner
Folder is empty. Generated docs will appear here once you create one from Ad Strategy or Case Study.

Local uploads

No local uploads. Link a Drive folder in Settings to mirror shared docs here, or click "Upload File".
File Name Size Uploaded

No email address on file for this client.

Gmail not connected

The Inbox view needs Gmail scopes on your Google OAuth. Reconnect from Calendar settings — the connect flow now requests Gmail access alongside Calendar.

Threads with

Loading…
No email history with this address.
Select a thread to view messages

Replies thread on top of this conversation.

Composing to via Gmail. Need to reach every client at once?

Report Ready

This is the styled report with the dashboard cards. Send from here. The plain composer cannot hold the card layout.

To:

Opportunities from this report

Not part of the email. Add as task files it under , assigned to Preston, due .

Edit with Claude

Rewrites the subject, the styled report below and the plain body. Keeps the formal register and never invents numbers; anything it can't source is left as a marked placeholder.

This is exactly what the client will see: Editing — click text to change it. Formatting is preserved.

· Subject line lives in the composer below — edit it there. Click any text to edit. Tables and formatting are preserved — hit </> HTML if you need raw access. Editing raw HTML — hit Visual to return to the text editor.

Sending to:

The styled report above is what the client receives; Edit with Claude and the opportunities are inside that panel.

Click to insert at cursor:

Click a block to append it to your email. Mix and match as needed.

Analytics & Tracking

Advertising

Business Profile

Website Access

Service Plans & Offers

Campaign Proposal

Closing

Edit with Claude

Rewrites the subject and the plain body (and the styled report above, when one is loaded). Keeps the formal register and never invents numbers; anything it can't source is left as a marked placeholder.

Variable values for this client

[client name] → [business name] → [agency name] → Cruxdata [website] →

Sent Email History

No emails sent yet.

Notes Admin only — never visible to clients

No notes yet.
Click "+ New Note" to start.
Save the note first to enable file attachments.
No attachments yet.

Select a note or create a new one.

Active Search Campaigns (last 30 days)

Campaign check-in

Analyzing campaigns launched in the last days · generated

Total Spend

Clicks

Impressions

Conversions

Loading campaigns...
No search campaigns found. Make sure a Google Ads customer ID is set in Settings.
Campaign Status Spend Clicks Impr. Conv. CTR CPC

Meta Campaigns (Facebook and Instagram, last 30 days)

Total Spend

Link Clicks

Impressions

Results at $ each

Loading Meta campaigns...
No Meta campaigns with activity in the last 30 days.
Campaign Status Budget Spend Link clicks Impr. Results Cost / result Link CTR CPM

Create Search Campaign

Campaign is created as Paused in Google Ads — enable it when ready.

Campaign Settings

100% = flat. 130 = +30% higher bids on that device. 0 = exclude the device.

Location Targeting

Presence shows to people in that area. Presence or interest also shows to people searching about it from elsewhere.

No locations added — ads will run everywhere unless you add at least one.

Photos

Each photo is cropped on publish into the two sizes Google Search ads accept (landscape 1.91:1 and square 1:1), converted to JPEG, and attached to the campaign as image assets. Pick one as the logo and it is also attached as the business logo (square). The business name comes from Settings.

Upload from your computer or paste URLs. Any size works; images under 600x314 only get the square version and under 300x300 are skipped. Up to 10 photos, 5 MB each.

Drop images here or click to browse

JPEG, PNG, GIF, or WebP. Multiple files OK.

No photos yet.

Extensions

Sitelinks (up to 8) and callouts appear beneath your ad. Big lever for CTR.

Sitelinks

Callouts (one per line, ≤25 chars)

Negative keywords (one per line — added at campaign level)

Broad match needs a strong negative list. Aim for 50 or more; Generate with Claude adds junk terms and local competitor names.

Ad groups

Each theme becomes its own ad group with its own responsive search ad: the theme's headlines first, then the shared headlines below. Remove a keyword or a whole theme here; the shared ad copy still applies to every group.

Keywords

No keywords added yet

Responsive Search Ad

Images and business assets

image assets attached from photos. Business name: . Logo attached. Cropping is unavailable on this server; only exact-ratio images were used.

Google Ads rejected items ·

Fix the flagged ad copy in the proposal or in the fields above, then hit Create Campaign again. Common causes: ALL-CAPS headlines (Google flags as "excessive capitalization"), stacked punctuation (!!, ??), trademarked terms, or superlative claims without proof.

Optimization Suggestions

Claude analyzes 30-day performance and proposes changes. Nothing runs without your approval unless the client's auto-apply policy is on (Settings, Conversions). Applied items are included in the next monthly report.

How the analysis works

Every time you click Run Analysis Now, we pull the last 30 days of campaign-level and keyword-level metrics from Google Ads and hand them to Claude with a strict analysis playbook. Claude only surfaces findings grounded in numbers it can actually see in the data — no speculative rewrites.

What it looks at:

  1. Wasted search terms — real queries that spent $20+ with no conversion (or, without tracking, poor CTR) → exact-match campaign negative
  2. Keywords — only those with 30+ clicks are judged: CPA versus the account and target, CTR versus CPC, Quality Score 1–4 with spend → pause or bid change
  3. Bidding strategy — keyword bid changes only on manual-CPC campaigns; smart-bidding campaigns get target-level advice instead
  4. Impression share — budget-lost versus rank-lost split decides between a budget change and a bid or relevance fix
  5. Budget pacing, day-parting, geography, ad copy diversity, keyword insertion — flagged as changes or advisories

Guardrails the server enforces: budget changes capped at 40% per change, bid changes at 30%, one change per type per campaign or keyword every 7 days, and at most 15 applied changes per client per day. Advisory items are noted, never logged as applied. Failed pushes are marked failed and can be retried.

Each suggestion comes with a priority (high / medium / low), an effort estimate, the exact metric that justifies it, and expected impact. You approve or reject each one individually. Approved items get executed on Google Ads (where applicable via the API) and rolled into the next monthly report's "Optimizations completed this period" section.

Loading…

Pending review

Nothing waiting. Run analysis to generate new suggestions.

Approved

Everything approved so far — reference archive. Approved-not-yet-applied still has an Apply Now button.
Nothing approved yet. Approve pending items above and they'll appear here.

Rejected

Hook recommender

The hook types most likely to win for this client's industry, from the monthly web scan and our own accounts' hook rates, each with ready-to-shoot hooks. A hook is the whole first impression: on-screen text, the spoken line, frame zero and the primary text.

Pick the client's industry to get recommendations. It is also saved in Settings, Basics.
No recommendations yet. They refresh on the 1st of each month after the scan, or now with Recommend hooks.

Generate Ad Strategy

Fill in what you know about the client. Claude produces an ultra-comprehensive campaign plan (10-20 keyword themes with 8-20 keywords each, 15 headlines, 4 descriptions, up to 10 sitelinks from real pages on the site, callouts, extensions, launch checklist) as an editable Google Doc in the linked Drive folder — or as an HTML file if Drive isn't connected yet.

$ /day

Drop images or click to browse

JPEG/PNG/GIF/WebP · Min 300px shorter side · Under 5MB. Landscape = MARKETING_IMAGE, square = SQUARE_MARKETING_IMAGE.

A screenshot of the client's homepage or logo helps Claude match visual tone and appears as the brand mark on the generated doc.

No Drive folder linked. Link one in Settings to have generated docs land as editable Google Docs directly in that folder. Otherwise we save an HTML backup in Files.

Linked to Drive folder open ↗. Generated docs land here as editable Google Docs.

Claude is working — usually ~30-60s.

Meta strategy ready

Proposal saved as a draft. Client can review + comment at their preview URL. When approved, load into the Meta Campaign Builder to publish.

Strategy ready

Editable Google Doc created in the linked Drive folder:

Saved as HTML: (link a Drive folder in Settings to have future docs land there as editable Google Docs).

Needs attention

Open Google Doc ↗ Download HTML backup

Landing page ready

A conversion-focused landing page was built from this proposal and linked to it. Draft — publish from the Landing Pages tab when you're happy with it.

Preview landing page ↗

Landing page didn't generate

The ad strategy proposal still saved — this only affected the landing page. You can retry from the Landing Pages tab.

Campaign Proposals

Every generated Ad Strategy becomes a proposal here. Share the link with the client for review — when they approve, click Approve & load in builder and the entire builder auto-populates for a one-click publish.

Loading…
No proposals yet. Head to to generate one.

Landing Page Analyzer

Paste a URL. We run PageSpeed Insights (mobile + desktop) and Claude's vision on an optional screenshot to produce a prioritized list of conversion-focused changes. Output is a branded HTML report auto-attached to Files.

PSI takes ~15s, Claude ~15-30s.

Analysis ready

Open report

Tracking Tag Validator

Enter a URL. We fetch the rendered HTML and scan for GA4, GTM, Meta Pixel, Google Ads conversion, Hotjar, and LinkedIn Insight tags — so you can confirm tracking is actually firing before you spend on ads.

Rank Tracking

Track keyword positions via Google Search Console. Refresh pulls the last 30 days of query data and updates positions.

Keyword Position Change Target Impressions
No tracked keywords yet.

UTM Builder

Build tagged links per client. Saved presets are one click away.

Preview

Case Study Builder

Claude reads 12 months of this client's performance data and turns it into a shareable case study document.

Case study ready — attached to Files

Open document

Meeting → Tasks

Paste a transcript. Claude extracts action items and creates tasks (attributed to this client if you're viewing one).

Export Client Data

Download a complete JSON snapshot of this client — every metric, report, note, file reference, and audit item.

Includes: metrics (ads / Meta / traffic / SEO), reports, notes, sent emails, action items, freelancer items, optimizations, tracked keywords, UTM presets, file references.

Download JSON

Website

Preview Open live

Every route ends in a saved build you can preview, edit with Claude and publish from the same place.

Pages

No pages yet. Build the site or connect the repo and they appear here.
Page Where Home Menu SEO Last change Actions

Landing Pages

Single-page marketing sites — usually built to match an ad campaign or proposal. For a full multi-page website, start with Upload finished HTML or Generate a new design; a landing page can be added to that site later from the Pages table. Every landing page includes WCAG 2.1 AA accessibility features, an accessibility statement, a privacy policy, and a cookie banner.

No website yet

Generate a fresh marketing site with Claude, or upload an HTML file you already have.

Generating your site with Claude…

This usually takes 15-30 seconds.

Preview of newly generated site

Generate a new design

Three-phase pipeline: extract the client's current style, plan the sitemap, then generate every page. Downloadable as a static site you can push to their GitHub repo.

Start a new website

Point at the client's current site — everything downstream reads from what's there.

Any single .html file — the current homepage export works best. Max 5 MB.

Selected:

Phase I — Style
›
Phase II — Wireframe
›
Phase III — Pages
from upload:

Phase I — style.md

Extract brand voice, colors, typography, imagery style from the current site.

Saved.

Phase II — wireframe.md

Plan the sitemap and section-by-section structure for every page.

Saved.

Phase III — generate site

Produce every HTML page, plus style.css, sitemap.xml, robots.txt, llms.txt. This takes ~1-3 minutes.

Open site ↗ Download .zip
Kicking off Phase III… Generating shared assets (CSS, header, footer, sitemap)… Generating pages — of done Safe to leave this page — it runs on the server.

Some pages didn't generate cleanly:

Files

                  

Upload one or more .html files. We ship them EXACTLY as authored — no restructuring, no re-generating — and layer on the full SEO + AI-SEO kit: meta description, canonical, Open Graph, JSON-LD (LocalBusiness / FAQPage / BreadcrumbList / WebPage), plus site-wide sitemap.xml, robots.txt (AI-crawler allow-list), and llms.txt. Photos: two paths — either your HTML already references them by URL (they just work), or drop them alongside and we deploy them to /images/ and rewrite the paths for you.

Claude plans the change across the whole site, edits each file on its own, then renders the pages and checks the result against your request. Two to five minutes for a big request. Preview, then Promote to push live.

No saved build for this client yet. Build once below and it will appear here (and survive page refreshes). If you clicked Free up storage after your last build, that build was deleted by design; your downloaded zip is still the complete site.

Have the downloaded zip? Restore it as the saved build.

Upload the zip Preston 2 gave you. It is unpacked back into a saved build, so Download / Click-through preview / Promote to git-backed all work again. No need to re-upload pages or re-drop photos.

Last saved build

· · built · · build # · preview token:

Claude edits in this build, not yet promoted or undone

Saved on the server. The zip you downloaded is the complete site — deploy it directly, or promote this build to a git repo so future edits auto-deploy. Re-upload source files here only if you want to change something.

SEO data refreshed on this build

FAQ schema on page(s).

Canonical address corrected on: .

The site was not re-read for facts: .

Google Business Profile could not be read: .

file(s) updated. A version was saved first, so this can be reverted from Versions. Promote to publish it.

Add logo, photos, CSS, or a map to this build (update, then Promote to push)

Updates the saved pages in place. Afterwards click Promote to git-backed to push; the host rebuilds on its own.

styles.css, scripts, fonts, favicon. Placed at the site root by filename; an existing file with the same name is replaced.

Append reads the stylesheet already in this build, or, if there is none, the one in the connected repo. Pasting the same block twice is ignored.

Type the address, or leave blank to use the address written in the map placeholder. No API key needed.

Uploaded to /images/logo.<ext>. Fills the LOGO placeholder in the header partial. SVG passes through unchanged; PNG kept for transparency; JPG auto-converted to optimized PNG.

photo slot detected in your HTML

Drop the right photo into each named slot below — we'll auto-rename each file so Preston 2's placeholder-swap picks them up. No manual renaming needed.

Your pages almost certainly link to a stylesheet (for example <link rel="stylesheet" href="styles.css">). If you don't upload it here the deployed site will be unstyled.

Shared partials (optional — upload once, injected into every page)

If your page files only contain the unique <main> content and share a header/footer, upload the partials here. On build, the header is spliced right after <body> on every page, the footer right before </body>. Pages that already have their own <header> or <footer> tag are left alone (nothing injected there). Accepts a full HTML doc or a raw partial.

Photos are auto-optimized in your browser before upload — downscaled to 2400px max, then re-encoded to AVIF (best), WebP, or JPEG (whichever the browser can produce smallest). Logo preserves format (SVG unchanged; PNG kept for transparency). Alt text auto-populated from each placeholder's caption. Originals on your disk are untouched.

Optimized: ( saved).

Build complete — page(s), image(s).

SEO copy written by Claude: titles and descriptions on page(s), alt text on image(s), generic H1(s) replaced. Keywords: .

SEO copy pass skipped: . Titles and descriptions are the ones from your HTML (synthesized where missing).

Google Preferred Sources badge added to page(s).

Your upload included . The versions generated by the build were used instead, since they carry the AI crawler policy, the page list and the business facts.

Google Business Profile could not be read: .

Also generated: sitemap.xml, robots.txt, llms.txt. Download the zip and drop into CloudCannon / Netlify / your host.

How to add photos

Option A — reference in place. Your HTML already uses <img src="https://cdn.example.com/hero.jpg">. Nothing to do here; the URL is preserved verbatim and the browser fetches from wherever it's hosted. Best when images live on a CDN you already run.

Option B — bundle them. In your HTML, reference photos by bare filename: <img src="hero.jpg"> or <img src="images/hero.jpg">. Drop the same files into the Images uploader above. On build we write them to /images/hero.jpg and rewrite every <img src> + CSS url() reference to that deployed path.

After the build. Every <img> also gets a data-editable-img annotation, so if you push this site through the git-backed editor later, the client can swap photos through a form without touching HTML.

Live site

Client-owned mode. The site lives in a GitHub repo the client owns — Cruxdata just commits on their behalf. If you split, revoke the token and they keep the site, the repo, the hosting. Every edit here becomes a git commit; every commit re-deploys via their Netlify/Vercel.

Publish the saved build

CloudCannon checklist
  1. In CloudCannon, add a Site and connect the GitHub repo , branch . If the repo is missing from the list, open the GitHub App's Configure access and allow all repositories.
  2. Build settings: SSG "Other", output path ".", no build command. The cloudcannon.config.yml pushed by Promote defines the Visual Editor regions.
  3. Open the testing domain CloudCannon gives you and click through every page. The home page is index.html.
  4. Custom domain: add the client's domain in CloudCannon and point its DNS at CloudCannon. Save the live address in Repo settings so Open live works.
  5. Client Sharing: invite the client's email so they can edit text and images in the Visual Editor. Their edits are kept on the next Publish.

Connect this client's GitHub repo

Create a new GitHub repo in the client's own account (or an org they own). Generate a fine-grained Personal Access Token scoped to just that repo with Contents: Read & write, then paste it below. Cruxdata never sees the token again — it lives in the DB and is used only for commits on their behalf.

Pages

· view live

Loading pages…
No pages yet. Click "New page" or import an existing HTML file below.

Upload any complete .html file. Claude adds data-cx-key attributes on ingest so you can edit content immediately — the design is left exactly as-is.

Pick a page on the left to edit.

Every text field on that page becomes an editable input here. Save = git commit. If you have Netlify/Vercel wired to the repo, the site re-deploys automatically within seconds.

This page has no data-cx-key attributes. Nothing here to edit through the form. Either re-import with "Auto-annotate" checked, or edit the raw HTML directly.

Editing raw HTML overrides the field-based updates when you save.

Committed — re-deploying via the client's hosting

How this works

  1. The site lives in their GitHub repo — . They own it.
  2. Every save is a git commit — attributed to Cruxdata but pushed to their default branch. Full audit trail lives in the repo.
  3. New pages — click "New page", describe what you want, Claude generates HTML with editable slots baked in (matching the design of existing pages if you check that box). The file is committed to the repo immediately.
  4. Deploy — if the repo is wired to Netlify or Vercel (client's account), every commit re-deploys the site within seconds. No deploy plumbing on our side.
  5. Client edits — with the checkbox above on, the client's portal has a Website tab listing these pages; each save commits with the same token. They can also build a simple new page (New page) that reuses the home page's header, footer and styles; add it to the site menu here when they ask. Promote merges those live edits back in (a block only they changed keeps their text; a block you both changed keeps yours and is listed).
  6. CloudCannon editing — Promote adds CloudCannon Source regions to every text block and standalone image and writes cloudcannon.config.yml, so a client invited through CloudCannon Client Sharing (Site Settings, Client Sharing, then the site domain plus /update) can edit in the Visual Editor.
  7. If you split — delete the config here → Cruxdata loses write access. The repo, hosting account, and domain stay with the client. Site keeps running unchanged.

New page

Claude generates a page with editable slots pre-annotated. Committed to the repo on create.

Live site history

Loading…

Repo settings

Update the token, branch, or live URL. To disconnect entirely (offboarding), click "Disconnect" — Cruxdata loses write access, the client's site keeps running.

Freelancer Tasks

Create tasks for this client that only your freelancer sees. Attach files, write instructions with formatting. The freelancer marks them approved / completed from their own portal — completed tasks stay visible there. Completely separate from the SEO-audit workflow.

Create new task

PDFs, images, spreadsheets, docs up to 25MB each. Up to 10 files.

Loading tasks…
No tasks yet. Create one above — it will appear in the freelancer portal immediately.

GoHighLevel Pipeline

Opportunities mirrored from GHL every 15 minutes. Kanban view of stages, revenue on the board, close-rate over the last 30 days.

GoHighLevel isn't connected for this client.

Head to Settings → GoHighLevel → Connect to authorize their subaccount. Pipeline data starts flowing within ~15 minutes.

Content Studio

Social and ad content plans, blog posts, competitor ad monitoring, and Google review responses.

Content plan for Meta and Instagram

Four research agents search the web in parallel: top organic formats, top paid video ad formats, posting cadence for leads, and this client's site and local competitors. A synthesis then writes organic and paid ideas with hooks, timed scripts, shot lists, captions and ad copy, and a four-week posting schedule. Takes a few minutes. Uses the client's industry (Settings) and recommended hooks.

No industry set for this client. Pick one in Settings, Basics for sharper research.

No content plan yet for this client.

Weekly Blog Engine

On Off

Cron fires every Monday at 10am. Uses queued topics first, then falls back to seo_target_keywords. Every draft is voice-matched via the client's writing samples.

WordPress

Writing samples

Queued topics

Pending drafts

Add a topic to the queue

Add a writing sample

Paste 300-3000 words of the client's real published copy. Fed to Claude as voice reference on every draft.

Two-stage generation: brief → draft. Every draft is written in the client's brand voice.

No posts yet. Start one with a target keyword.

New blog post

Target: · Status:

Track competitor Facebook Pages. "Check" pulls Meta's Ad Library and Claude summarizes what they're running.

No competitors tracked yet.

Add competitor

New Google Business Profile post

Draft with Claude in the client's voice, then push straight to their GBP. Post type + optional CTA button.

Recent GBP posts

Google Business Profile reviews with Claude-drafted responses in the client's voice. Approve or edit, then paste into GBP.

No reviews in cache yet. Reviews sync via the GBP integration.

Cold Outbound

Import leads, compose a campaign, Cruxdata personalizes every email in the client's voice and sends via Resend on a schedule. Business-hours only, respects daily caps.

leads on file. New campaign uses whichever leads are active and not suppressed.

No campaigns yet.

leads.

No leads imported yet. Paste JSON to get started.

Name Email Company Title Status
Showing first 100 of

Import leads (JSON)

Paste an array of objects. Fields: email (required), first_name, last_name, company, title, website, linkedin_url, city, state, country, notes. Duplicate emails are skipped.

Attribution

Per-channel revenue, spend, ROAS, and CAC. Revenue events pulled from won GHL opportunities (UTM-tagged where available) plus manual entries.

No attribution data yet. Click "Backfill from GHL" if you have won opportunities in your pipeline.

Window: last 90 days. Attribution is best-effort — GHL opportunities with UTM tags are highest confidence; anything else gets classified via source/medium heuristics.

Generate site with Claude

Every generated site meets WCAG 2.1 AA and ships with a privacy policy + accessibility statement.

Upload HTML file

Bring your own hand-written or AI-generated HTML. The file must include <html> and <body>. Privacy + accessibility pages and the cookie banner are still auto-injected.

Warnings:

Regenerate site

Claude will produce a new template using the original settings plus your notes.

Add New Client

/c/

Email all clients

Sends the same message to every client with an email address on file. Suppression list is honored per recipient. Each send is logged to sent_emails.

Just want to email ?

Compliance footer (agency address + unsubscribe link) is auto-appended per recipient. Toggle HTML on the toolbar to edit the raw markup.

Last 30 days

Loading keywords...
No keywords found.
Keyword Match QS Spend Clicks Conv. CPC Status

Something on this page threw an error

Copy this and paste it to Preston's assistant. It was also logged on the server.

Fix it — auto-generate missing assets

Generating with Claude…

History

Saved build versions and commits on the live site, newest first.

Loading

Nothing recorded yet.

Add the landing page to the site

"" is rendered with its current content and saved into the build as a page. The SEO layer is applied and the sitemap and llms.txt are updated. Nothing goes live until you publish.

.html

Meta ad builder

Loading the ad account (pages, Instagram, pixels, audiences, lead forms)

In Meta. Open in Ads Manager

Promote to git-backed mode

Pushes every file in this build into a GitHub repo. From then on, edits made through the Website tab (git-backed source) or the client's own Website tab become commits and the host auto-redeploys on push. No more zip download and re-upload.

Prereq: create an empty GitHub repo first (github.com/new). Then create a fine-grained personal access token at github.com/settings/tokens with Contents read and write on that repo. Paste both here.
Fill in owner and repo name. Token left blank: the agency token saved under Settings will be used. Paste a GitHub token to enable. No token is saved for this client yet. Token left blank: the token saved for this client under Git-backed Site settings will be used.

Promoted to git-backed mode.

Created: · Updated: · Failed:

Converted legacy folder page(s) to flat .html and removed old folder cop from the repo.

Repo: · Branch:

CloudCannon: () · Source regions added to page(s).

Live edits kept: field(s) changed on the live site since the last promote were carried into this push.

Both changed (your build won):

Switch the Website tab source picker to Git-backed Site. Every edit from there is a commit and the host auto-deploys.

Errors:

Versions of the saved build

A version is saved automatically before every change (Claude edits, undo, logo/photo/CSS/map updates, zip restores) and after each promote. Restoring saves the current state first, so it can be undone too. Restored files are not live until you promote.

Loading…

No versions yet. One is saved automatically the next time the build changes, or save one now.