skills/check-demo-analytics/SKILL.md
Report on InboxMate demo page visits, email engagement, and pipeline health. Queries Ackee analytics and CRM to show which demos are getting traffic, which leads are converting, and which need attention.
npx skillsauth add psquared-development/psquared-skills check-demo-analyticsInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Announce:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Demo Analytics Report Checking environment... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Read .env in the current directory and source it.
Required tokens:
PSQUARED_CRM_TOKENACKEE_TOKEN, and ACKEE_DOMAIN (base URL, e.g. https://ackee.psquared.dev)Stop if missing.
Ackee config:
$ACKEE_DOMAIN/api (GraphQL)4bdddc8c-11d9-4d7e-ab94-aeb7866f0bb2Authorization: Bearer $ACKEE_TOKENOnce verified:
Environment OK. Pulling analytics...
Query Ackee for page-level statistics on the demo domain:
curl -s -X POST "$ACKEE_DOMAIN/api" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $ACKEE_TOKEN" \
-d '{"query":"{ domain(id: \"4bdddc8c-11d9-4d7e-ab94-aeb7866f0bb2\") { statistics { pages(sorting: TOP, range: LAST_30_DAYS) { id value count } views(interval: DAILY, type: UNIQUE, limit: 30) { id count } } } }"}'
From the pages results, extract views per demo page. The value field contains the URL path (e.g., /?id=abc123). Map each id parameter to a demo.
Also get total unique views over the last 30 days from the views array.
Query CRM for all active opportunities at SCREENING stage:
curl -s -X POST https://crm.psquared.dev/graphql \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $PSQUARED_CRM_TOKEN" \
-d '{"query":"{ opportunities(filter: { stage: { eq: SCREENING } }, first: 100) { edges { node { id name demoStatus demoUrl { primaryLinkUrl } company { name } createdAt } } } }"}'
Also get recently converted (PROPOSAL stage):
curl -s -X POST https://crm.psquared.dev/graphql \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $PSQUARED_CRM_TOKEN" \
-d '{"query":"{ opportunities(filter: { stage: { eq: PROPOSAL } }, first: 20) { edges { node { id name company { name } createdAt } } } }"}'
Also get paying customers (CUSTOMER stage):
curl -s -X POST https://crm.psquared.dev/graphql \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $PSQUARED_CRM_TOKEN" \
-d '{"query":"{ opportunities(filter: { stage: { eq: CUSTOMER } }, first: 20) { edges { node { id name company { name } createdAt } } } }"}'
For each SCREENING opportunity with a demoUrl:
?id=xxx)/?id=xxx path)Categorize each opportunity:
| Category | Criteria | Action needed | |----------|----------|--------------| | Hot | Views > 0 + demoStatus = SENT/FOLLOW_UP_SENT | Prospect is engaging — consider direct outreach | | Warm | Views > 0 + not yet sent | Demo is getting organic traffic — prioritize sending | | Cold | Views = 0 + SENT > 7 days ago | No engagement — follow-up or deprioritize | | Fresh | SENT < 5 days ago | Too early to judge | | Pending | PENDING_REVIEW or OK_TO_SEND | Still in pipeline — not yet sent | | Converted | Stage = PROPOSAL | Already signed up |
To get event counts, query each event:
curl -s -X POST "$ACKEE_DOMAIN/api" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $ACKEE_TOKEN" \
-d '{"query":"{ event(id: \"[eventId]\") { statistics { chart(interval: DAILY, type: TOTAL) { id count } list(sorting: TOP, type: TOTAL) { id value count } } } }"}'
Event IDs:
0f037f1c-c2c0-4205-b90d-3cb9bf66f9c21911cb2c-96a9-478e-8a45-82ae8fa71bc8df5c0d51-1e96-43a9-8d73-13e0e82e99b38693d36c-09a1-4b86-bf29-763e612f4843The list query with sorting: TOP shows which demo pages / plans got the most actions. The key field contains the demoId or planId.
Email sent/failed counts: Use GET /stats/funnel from the notification service instead of manually counting drafts. This endpoint returns accurate sent/failed totals per campaign.
Announce:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Demo Analytics Report — [date] CONVERSION FUNNEL ───────────────── Leads in CRM: [N] Demos built: [N] ([%] of leads) Emails sent: [N] ([%] of demos) Demo page viewed: [N] ([%] of sent — email→click rate) CTA clicked: [N] ([%] of viewed — interest rate) Signed up (PROPOSAL): [N] ([%] of CTA — conversion rate) Paying (CUSTOMER): [N] ([%] of signups — close rate) Overall: [N] leads → [N] customers = [%] conversion At current rate: need ~[X] leads to get 1 paying customer ACKEE EVENTS (last 30 days) ─────────────────────────── Demo page views: [N] unique visitors Widget opened: [N] ([%] of views — engagement) Plan selected: [N] (Starter: [N], Pro: [N], Business: [N]) Activate CTA clicked: [N] Discover platform: [N] PIPELINE STATUS ─────────────── Pending review: [N] Ready to send: [N] Sent: [N] Follow-up sent: [N] Converted: [N] HOT LEADS (views + email sent) - [Company A] — [N] views, sent [N] days ago - [Company B] — [N] views, sent [N] days ago COLD LEADS (no views, 7+ days) - [Company C] — 0 views, sent [N] days ago RECOMMENDATIONS [Based on funnel bottleneck:] - If email→view rate is low: "Subject lines may need work, or emails landing in spam" - If view→CTA rate is low: "Demo pages aren't converting — check offer text, countdown, widget" - If CTA→signup rate is low: "Signup friction too high — check onboarding flow" - If signup→paid rate is low: "Trial experience or pricing needs adjustment" - Plus specific company-level recommendations ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
tools
Set up a personalized InboxMate INBOX demo (Demo-Postfach) for a sales prospect: a public, read-only seeded inbox showing 5-7 pre-triaged emails in their industry's language, with categories, routing and ready AI drafts. Use for email-automation outreach (the €49-349 product), NOT for chatbot outreach. No agent is created.
development
Build InboxMate demos AND write personalised outreach drafts in a single pass per company — eliminating the double-research that happens when /inboxmate-batch-demo and /setup-email-drafts run separately. Use when kicking off a new campaign where the campaign already exists (plan via /plan-campaign first). For each target company, dispatches ONE subagent that researches the site, builds the demo, creates the CRM opportunity, and drafts the outreach email — reusing the same research across all three. After all subagents return, runs a single batch call to auto-generate follow-ups.
testing
Autonomous pilot for the InboxMate EMAIL outreach (Demo-Postfach/INBOX track). Assesses where the inbox pipeline stands (leads → demos → review → campaign → drafts) and executes the next sensible step end-to-end, always finishing with the inbox sanity check and a summary of what the user should do next (ideally: just schedule the mails). Runs in save mode by default: orchestration + all quality gates on the top model, data collection on haiku subagents, content generation on sonnet subagents (pass 'full' to disable). Use when asked to 'advance the email outreach', 'run the inbox pipeline', or 'what's next for the Demo-Postfach motion'.
tools
Generate a polished psquared client offer as a multi-page PDF (title, project description, screenshots, Angebot/pricing, AGB). Walks the user through gathering inputs (or accepts a JSON config), renders branded HTML templates with Playwright in two passes (title page edge-to-edge + body pages with margins and pagination), then merges with pdf-lib.