Select a client
or add a new one to get started
Tasks
Overdue
No tasks match this filter.
Personal
Overdue
Done
Calendar
In Google Calendar, go to Settings → your calendar → Integrate calendar → copy the Embed code src URL.
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
referred
Email Sequences
Multi-step drips. Worker runs every 15 min and sends any due step.
Sequences
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.
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.
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
| Client | Last Report | Next Due | Days Until | Calls | Active | |
|---|---|---|---|---|---|---|
| — | No Google Ads |
|
||||
| No clients found. | ||||||
Next report preview
Recent calls
Last report sent
Optimizations to include
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
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.
Changed text and photos
Content to publish
The client asks to delete this page. Approving removes it from the site, the menu, the sitemap and llms.txt.
Live now
Open full sizeProposed by the client
Open full sizeHook 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_NAMEandAGENCY_POSTAL_ADDRESSin 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
No data requests yet.
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.
All invites
CRM
MRR
ARR
Potential MRR
Potential ARR
Services
Tasks
Lead Details
No services in the catalog yet. Click Manage Services on the CRM page to create some.
Attribute Stripe Subscription
Pick a subscription — MRR will auto-populate from the plan price.
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.
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
.
Diagnose a metric drop
Verdict
Headline
Magnitude
Primary cause
Contributing factors
Recommended actions
CRO analyzer
Summary
Ranked fixes
.
Where:
Problem:
Fix:
Onboarding Status
Everything we need to run this client end-to-end
(toggle)
Latest Ad Spend
Latest Sessions
Unread Messages
Sync All Sources
Pull GA4, Search Console, and Google Ads — syncs current + comparison period automatically
GA4 GA4 failed — GA4
Search Console Search Console failed — Search Console
Google Ads Google Ads failed — Google Ads
Generated Reports
SEO Audit Report
Audit in progress — this takes 5–10 minutes. Save the report when complete, then upload it 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.
Google Ads Metrics
New Ads Entry
| 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.
Website Traffic (GA4)
New Traffic Entry
| 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
HideThese get asked verbatim to Claude / Perplexity / OpenAI / Gemini. We measure how often this client shows up in the answers.
Sync from Google Search Console
Set your Search Console URL in first.
PageSpeed Insights
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 | |
|---|---|---|---|---|---|---|---|
Action Items ()
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.
Total responses
Client mentioned
Site cited
Engines covered
| Prompt | Engine | Mentioned | Rank | Cited |
|---|---|---|---|---|
| — | — |
SERP + AI Overview snapshots
| Keyword | Your rank | AI Overview | Cites you | Captured |
|---|---|---|---|---|
| — | missed — |
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.
Messages with
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: .
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.
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.
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.
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.
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.
Requires the client to authorize their GHL sub-account (opens in a new tab).
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 | |
|---|---|---|---|
|
$
|
|||
| No forms loaded. Click Refresh forms above. | |||
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 |
|---|---|---|---|---|
| Present— | ||||
| No submissions yet. | ||||
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 tracking configured
Conversion tracking NOT configured
Reports and the client dashboard will hide conversion columns until this is fixed. Set it up in Google Ads → Tools → Conversions, then click Refresh above.
Status unknown
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.
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.
Google isn't connected.
| Name | Type | Modified | Owner | |
|---|---|---|---|---|
|
|
Open ↗ |
Local uploads
| File Name | Size | Uploaded | |
|---|---|---|---|
| Download |
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
Replies thread on top of this conversation.
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.
Sending to: ,
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
Notes Admin only — never visible to clients
Click "+ New Note" to start.
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
How it got here
What's working
What's not
Recommended next optimizations
Watch out for
Total Spend
Clicks
Impressions
Conversions
| Campaign | Status | Spend | Clicks | Impr. | Conv. | CTR | CPC | |
|---|---|---|---|---|---|---|---|---|
|
|
Meta Campaigns (Facebook and Instagram, last 30 days)
Total Spend
Link Clicks
Impressions
Results at $ each
| 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
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.
- from
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:
- Wasted search terms — real queries that spent $20+ with no conversion (or, without tracking, poor CTR) → exact-match campaign negative
- 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
- Bidding strategy — keyword bid changes only on manual-CPC campaigns; smart-bidding campaigns get target-level advice instead
- Impression share — budget-lost versus rank-lost split decides between a budget change and a bid or relevance fix
- 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.
Pending review
Approved
Everything approved so far — reference archive. Approved-not-yet-applied still has an Apply Now button.This change measured worse than the period before it. Consider Rollback.
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.
On screen
Says
Frame zero
Primary text
Test plan
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.
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.
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
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.
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.
Created · Client approved ↩ Client requested changes Published
· ·
Client note:
Budget
Bidding
Keywords
Locations
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.
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
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 JSONEvery route ends in a saved build you can preview, edit with Claude and publish from the same place.
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.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.
Some pages didn't generate cleanly:
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.
Not attached:
Images added to the site:
Not placed on any page, so not kept:
Visual check on :
:
: ·
Saved to the build. Use Click-through preview to check it, then Promote to git-backed to push it live.
Undone.
No file changed.
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.
Empty photo slots
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).
/ · injected:
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
- 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.
- Build settings: SSG "Other", output path ".", no build command. The cloudcannon.config.yml pushed by Promote defines the Visual Editor regions.
- Open the testing domain CloudCannon gives you and click through every page. The home page is index.html.
- 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.
- 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
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.
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
- The site lives in their GitHub repo — . They own it.
- Every save is a git commit — attributed to Cruxdata but pushed to their default branch. Full audit trail lives in the repo.
- 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.
- 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.
- 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).
- 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. - 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.
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.
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.
$ total value
No deals here.
Content Studio
Social and ad content plans, blog posts, competitor ad monitoring, and Google review responses.
Weekly Blog Engine
On OffCron 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.
Keyword:
· words
· updated
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.
""
Draft response
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.
From: · Daily cap:
leads.
No leads imported yet. Paste JSON to get started.
| Name | Company | Title | Status | |
|---|---|---|---|---|
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.
Revenue
deals
Spend
CAC
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.
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.
Strategy and schedule
Organic
Paid
Research findings by agent
Script
Shots
Caption
Videos
Meta ads built from videos