Reference guide for understanding the InboxMate ecosystem - architecture, repos, pipeline, CRM states, metrics, and how to query each system. Use when starting any InboxMate-related work.
Use this skill to understand the InboxMate product, its architecture, outreach pipeline, and how to query data across systems.
InboxMate is a module (chatwidget) within the AgentHub platform — a full-stack Nuxt 3 + Supabase + Socket.IO SaaS.
| Repo | Purpose | Key Files |
|---|---|---|
| agenthub | Full-stack app (InboxMate + AgentHub) | server/api/mcp.post.ts (demo MCP), app/pages/demo.vue (demo page), server/utils/scraping.ts (Tavily/Firecrawl), server/utils/subscriptionUtils.ts (tiers), app/components/InboxMatePricingModal.vue |
| notification-service | Email drafts, templates, funnel analytics | src/routes/drafts.ts (draft CRUD), + (funnel) |
src/routes/stats.tsfrontend/pages/funnel.vue| psquared-websites | Marketing sites | apps/inboxmate/ (inboxmate.psquared.dev), apps/psquared/ (psquared.dev) |
| psquared-skills | Pipeline skills | skills/ directory |
| Service | URL |
|---|---|
| InboxMate app | app.psquared.dev (chatwidget module) |
| Demo pages | demo.inboxmate.psquared.dev/?id=<demoId> |
| Marketing site | inboxmate.psquared.dev |
| Company site | psquared.dev |
| Notification admin | notifications.psquared.dev/drafts |
| CRM | crm.psquared.dev |
| Analytics | ackee.psquared.dev |
/find-leads [N] → CRM companies + people (German B2B, UWG-compliant)
↓
/inboxmate-batch-demo → Demos created, opportunities at SCREENING/PENDING_REVIEW
↓
/review-demos → demoStatus: OK_TO_SEND or NEEDS_FIX
↓
/fix-demos → Fixes applied, reset to PENDING_REVIEW
↓
/plan-campaign → CRM campaign created, opportunities linked with shared deadline
↓
/setup-email-drafts → Email drafts at notifications.psquared.dev/drafts
↓
Human review + send → demoStatus: SENT, outreachSentAt timestamped
↓
/check-outreach-status → Follow-up drafts created (5+ days after send)
↓
/check-demo-analytics → Pipeline health report (Ackee + CRM)
↓
/refurbish-demos → Upgrade knowledge for campaign demos (clear + re-scrape via MCP)
| Status | Meaning |
|---|---|
PENDING_REVIEW | Demo built, awaiting QA |
OK_TO_SEND | QA passed, ready for outreach |
NEEDS_FIX | QA failed, needs corrections |
SENT | Initial outreach email sent |
FOLLOW_UP_SENT | Follow-up email sent |
SKIP_FAULTY_WEBSITE | Website unreachable/broken |
SKIP_IRRELEVANT | Company not a fit |
SKIPPED | Generic skip |
DISQUALIFIED | Permanently excluded |
| Stage | Meaning |
|---|---|
NEW | Fresh lead, no outreach |
SCREENING | Outreach phase |
MEETING | Responded / call scheduled |
PROPOSAL | Quoted or decision-maker demo |
CUSTOMER | Paying customer |
Campaigns group opportunities into sendable batches with shared offerExpiresAt and offerText. Created by /plan-campaign, consumed by /setup-email-drafts.
https://crm.psquared.dev/graphqlAuthorization: Bearer $PSQUARED_CRM_TOKENcompanies, people, opportunities, campaigns, tasks, notesExample — list opportunities in a campaign:
query {
opportunities(filter: { campaignId: { eq: "CAMPAIGN_ID" } }) {
edges { node { id name stage demoStatus demoUrl } }
}
}
fevtfywriufbqnvbgyrmmcp__plugin_supabase_supabase__execute_sqldemo_pages, agents, knowledge, knowledge_bucket_items, knowledge_bucket_chunks, chats, messages, accountsExample — find chats on demo agents:
SELECT dp.company_name, c.id as chat_id, c.created_at,
(SELECT count(*) FROM messages m WHERE m.chat_id = c.id) as msg_count
FROM demo_pages dp
JOIN chats c ON c.agent_id = dp.agent_id
ORDER BY c.created_at DESC
https://ackee.psquared.dev/apiAuthorization: Bearer $ACKEE_TOKEN4bdddc8c-11d9-4d7e-ab94-aeb7866f0bb20f037f1c-c2c0-4205-b90d-3cb9bf66f9c2Example — get demo page views:
query {
domain(id: "4bdddc8c-11d9-4d7e-ab94-aeb7866f0bb2") {
statistics { views(interval: MONTHLY, type: UNIQUE) { count } }
facts { viewsMonth viewsToday activeVisitors }
}
}
https://notifications.psquared.devAuthorization: Bearer $BEARER_TOKENAuthorization: Bearer $EMAIL_DRAFT_ONLY_BEARERKey endpoints:
GET /drafts?status=SENT&pageSize=50 — list sent emailsGET /drafts/:id — read full email (html_body, variables, subject)POST /drafts/create — create draft from templatePOST /drafts/send — send drafts { draftIds: [...] }GET /stats/funnel — full conversion funnel dataGET /drafts/campaigns — list CRM campaigns with draft countshttps://app.psquared.dev/api/mcpAuthorization: Bearer $NUXT_MCP_DEMO_TOKENKey tools:
clear_bucket — remove all items from a knowledge bucketscrape_and_build_knowledge — scrape URLs via Tavily, create knowledge items with real sourceUrlscreate_agent, update_prompt, update_widget_style, publish_agentcreate_knowledge_bucket, add_to_bucket, set_knowledgecreate_demo_page, update_demo_page, list_demos, get_demolist_bucket_items, list_knowledge, get_knowledge| Metric | Source | How to check |
|---|---|---|
| Demo page views | Ackee | Query demo domain statistics |
| CTA clicks | Ackee | Query CTA event |
| Emails sent | Notification service | GET /drafts?status=SENT |
| Chat interactions | Supabase | chats JOIN demo_pages on agent_id |
| Pipeline funnel | Notification service | GET /stats/funnel |
| Hot leads | CRM | Opportunities with stage > SCREENING |
| Campaign status | CRM + Notification service | Campaigns + draft counts per campaign |
All in /Users/martinpammesberger/Documents/psquared/claude-overlord-folder/.env:
| Variable | Service |
|---|---|
PSQUARED_CRM_TOKEN | Twenty CRM GraphQL |
NUXT_MCP_DEMO_TOKEN | InboxMate MCP endpoint |
NUXT_TAVILY_SEARCH_API_KEY | Tavily web scraping |
EMAIL_DRAFT_ONLY_BEARER | Notification service (draft creation) |
NOTIFICATIONS_SERVICE_BEARER_TOKEN | Notification service (admin) |
ACKEE_TOKEN | Ackee analytics |
Note: If prices change, this table must be updated. The /price-change skill handles pricing updates across all touchpoints — make sure this file is included in the update list.
| Tier | Monthly | Yearly | Demo Discount (yearly) |
|---|---|---|---|
| Starter | €59 | €49/mo | — |
| Pro | €129 | €107/mo | -33% → €86/mo |
| Business | €399 | €331/mo | -50% → €199/mo |
All plans include 14-day free trial, no credit card required.
Agents use RAG (vector search) over knowledge buckets:
sourceUrl)searchKnowledge tool is called, it returns matching chunks WITH their sourceUrlTo upgrade knowledge quality: clear_bucket → scrape_and_build_knowledge with real page URLs → publish_agent