@apex-inc/mcp-server 0.2.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +13 -119
- package/dist/api-client.d.ts +25 -0
- package/dist/api-client.d.ts.map +1 -1
- package/dist/api-client.js +64 -4
- package/dist/api-client.js.map +1 -1
- package/dist/index.js +15 -4
- package/dist/index.js.map +1 -1
- package/dist/resources.d.ts +26 -0
- package/dist/resources.d.ts.map +1 -1
- package/dist/resources.js +113 -3
- package/dist/resources.js.map +1 -1
- package/dist/tools.d.ts +247 -0
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +309 -33
- package/dist/tools.js.map +1 -1
- package/package.json +3 -7
- package/skills/apex-communications/SKILL.md +87 -0
- package/skills/apex-growth-intelligence/SKILL.md +116 -0
- package/skills/apex-integration-cookbook/SKILL.md +214 -0
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: apex-communications
|
|
3
|
+
description: Help users set up and manage lifecycle communications through Apex MCP tools — recommendations, generation, editing, experiments, and event tracking. Activate when the user mentions emails, notifications, onboarding messages, or communication campaigns.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Apex Communications (MCP)
|
|
7
|
+
|
|
8
|
+
Use these tools to help users build a communication program that sends the right message at the right time — without building email infrastructure from scratch.
|
|
9
|
+
|
|
10
|
+
## When to Activate
|
|
11
|
+
|
|
12
|
+
- User asks about setting up emails, notifications, or onboarding messages
|
|
13
|
+
- User wants to improve engagement or reduce churn with automated messaging
|
|
14
|
+
- User is adding a new user-facing event and should also set up the communication trigger
|
|
15
|
+
- User asks about A/B testing their emails
|
|
16
|
+
|
|
17
|
+
## Tool Invocation Order
|
|
18
|
+
|
|
19
|
+
### First-time setup (user has no communications)
|
|
20
|
+
|
|
21
|
+
1. **`recommend_communications`** — get the recommended communications for the user's vertical. Review the list with the user.
|
|
22
|
+
2. **`generate_communications`** — create the selected communications with pre-written copy.
|
|
23
|
+
3. **`get_event_taxonomy`** — show the user what `apex.track()` calls they need to add to their code.
|
|
24
|
+
4. **`list_communications`** — confirm everything was created.
|
|
25
|
+
|
|
26
|
+
### Editing and testing
|
|
27
|
+
|
|
28
|
+
1. **`list_communications`** — see what exists.
|
|
29
|
+
2. **`edit_communication`** — update subject, body, CTA, channels, or status.
|
|
30
|
+
3. **`preview_communication`** — render the email with the user's brand.
|
|
31
|
+
4. **`send_test_communication`** — send a test to verify it looks right.
|
|
32
|
+
|
|
33
|
+
### Running experiments
|
|
34
|
+
|
|
35
|
+
1. **`list_communications`** — find the communication to test.
|
|
36
|
+
2. **`create_comm_experiment`** — set up the A/B test with variants.
|
|
37
|
+
3. The experiment runs automatically via Thompson Sampling.
|
|
38
|
+
4. Check results via `list_communications` or the dashboard.
|
|
39
|
+
|
|
40
|
+
### Manual sends
|
|
41
|
+
|
|
42
|
+
- **`trigger_communication`** — send to a specific person, useful for one-offs or testing with real addresses.
|
|
43
|
+
|
|
44
|
+
## Proactive Behavior
|
|
45
|
+
|
|
46
|
+
When you see the user adding code that handles user lifecycle events (signup, purchase, onboarding), proactively suggest:
|
|
47
|
+
|
|
48
|
+
> "I notice you're adding a signup handler. Want me to set up a welcome email through Apex? I can recommend communications for your vertical and generate them with one click."
|
|
49
|
+
|
|
50
|
+
When the user is building email functionality from scratch:
|
|
51
|
+
|
|
52
|
+
> "Before building email infrastructure, let me check if Apex already has a template for this. Apex handles delivery, tracking, A/B testing, and unsubscribe management automatically."
|
|
53
|
+
|
|
54
|
+
## Resources
|
|
55
|
+
|
|
56
|
+
These MCP resources provide ambient context:
|
|
57
|
+
|
|
58
|
+
- **`apex://communications`** — current communications with status summary
|
|
59
|
+
- **`apex://communications/events`** — event taxonomy with integration status (which events have been tracked, which are missing)
|
|
60
|
+
|
|
61
|
+
Read these resources before suggesting communications-related actions to understand the current state.
|
|
62
|
+
|
|
63
|
+
## Common Patterns
|
|
64
|
+
|
|
65
|
+
### "I need to send a welcome email"
|
|
66
|
+
```
|
|
67
|
+
1. recommend_communications → look for "welcome" in results
|
|
68
|
+
2. generate_communications with the welcome entry ID
|
|
69
|
+
3. edit_communication to customize copy
|
|
70
|
+
4. send_test_communication to preview
|
|
71
|
+
5. Show user the apex.track("user_signup") call to add
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### "My churn rate is high"
|
|
75
|
+
```
|
|
76
|
+
1. recommend_communications → look for retention/winback entries
|
|
77
|
+
2. generate_communications for churn-related comms
|
|
78
|
+
3. create_comm_experiment to A/B test the messaging
|
|
79
|
+
4. get_event_taxonomy to see what churn signals to track
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
### "How do I A/B test my emails?"
|
|
83
|
+
```
|
|
84
|
+
1. list_communications → find the target
|
|
85
|
+
2. create_comm_experiment with subject or body split
|
|
86
|
+
3. Explain Thompson Sampling: traffic shifts automatically toward the winner
|
|
87
|
+
```
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: apex-growth-intelligence
|
|
3
|
+
description: Apex's scientific growth loop — beliefs, hypotheses, predictions, outcomes, calibration, and organizational learning velocity. Use when the user asks about growth strategy, wants to track what they've learned, needs prediction calibration, or is building a data-driven decision process.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Apex growth intelligence
|
|
7
|
+
|
|
8
|
+
Apex models organizational learning as a scientific loop. Every growth decision produces evidence that updates the company's belief system, improves prediction accuracy, and compounds into a measurable **Growth Intelligence Score**.
|
|
9
|
+
|
|
10
|
+
## The scientific loop
|
|
11
|
+
|
|
12
|
+
```
|
|
13
|
+
Belief → Hypothesis → Prediction → Experiment → Outcome → Updated Belief
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
1. **Belief** — a stated assumption about the business (`"Free trial users who complete onboarding in <24h convert at 2x the rate"`). Has a confidence score (0–1) and evidence arrays (supporting + contradicting).
|
|
17
|
+
2. **Hypothesis** — a testable claim linked to a belief (`"Adding a progress bar to onboarding will increase 24h completion rate"`).
|
|
18
|
+
3. **Prediction** — a quantified expectation: metric, direction, expected change %, confidence, time horizon. Logged *before* the experiment runs.
|
|
19
|
+
4. **Experiment** — runs in snippet or SDK mode. Linked to belief, hypothesis, and prediction.
|
|
20
|
+
5. **Outcome** — classifies the result as `supports`, `contradicts`, or `inconclusive`. Records metric delta and statistical significance.
|
|
21
|
+
6. **Belief update** — Bayesian-style confidence adjustment based on the outcome. Evidence appended. Parent beliefs receive dampened updates (0.3x propagation). A decision ledger entry records the full chain.
|
|
22
|
+
|
|
23
|
+
## MCP tools for the loop
|
|
24
|
+
|
|
25
|
+
| Tool | When to use |
|
|
26
|
+
|------|-------------|
|
|
27
|
+
| `create_belief` | User has a growth assumption worth tracking |
|
|
28
|
+
| `start_reasoning` | Guided flow: creates belief + hypothesis + prediction in one step |
|
|
29
|
+
| `log_prediction` | Record a quantified expectation before running an experiment |
|
|
30
|
+
| `record_outcome` | After experiment completes — updates belief confidence, marks prediction evaluated |
|
|
31
|
+
| `predict_impact` | Before building something — searches past experiments and beliefs for similar changes |
|
|
32
|
+
| `evaluate_feature` | Pre-build decision: should we invest in this? Uses beliefs + experiment history |
|
|
33
|
+
|
|
34
|
+
## MCP resources
|
|
35
|
+
|
|
36
|
+
| Resource | What it returns |
|
|
37
|
+
|----------|----------------|
|
|
38
|
+
| `apex://beliefs` | All beliefs with confidence and evidence |
|
|
39
|
+
| `apex://ledger` | Decision ledger — full audit trail of belief updates |
|
|
40
|
+
| `apex://intelligence` | Growth Intelligence Score + Learning Velocity |
|
|
41
|
+
| `apex://calibration` | Prediction accuracy metrics — Brier score, bias, reliability buckets |
|
|
42
|
+
|
|
43
|
+
## Three scoring systems
|
|
44
|
+
|
|
45
|
+
Apex has three distinct scores. Don't conflate them.
|
|
46
|
+
|
|
47
|
+
| Score | What it measures | API |
|
|
48
|
+
|-------|-----------------|-----|
|
|
49
|
+
| **Lead Score** | Individual contact quality (ICP fit, intent, engagement) | Computed by `scorer.ts` per contact |
|
|
50
|
+
| **Engagement Score** | Product adoption depth (sensors, experiments, data volume, recency) | `GET /api/engagement` |
|
|
51
|
+
| **Growth Intelligence Score** | Organizational learning maturity (validated beliefs, completed experiments, prediction accuracy, revenue attribution) | `GET /api/intelligence` |
|
|
52
|
+
|
|
53
|
+
## Growth Intelligence Score breakdown
|
|
54
|
+
|
|
55
|
+
The score (0–100) weights six dimensions:
|
|
56
|
+
|
|
57
|
+
- **Validated beliefs** — beliefs with outcomes that moved confidence significantly
|
|
58
|
+
- **Completed experiments** — experiments that reached significance and produced outcomes
|
|
59
|
+
- **Model iterations** — scoring model version count (shows refinement)
|
|
60
|
+
- **Timeline depth** — how far back the decision ledger goes
|
|
61
|
+
- **Channel coverage** — breadth of acquisition channels with data
|
|
62
|
+
- **Revenue attribution** — experiments or beliefs linked to revenue impact
|
|
63
|
+
|
|
64
|
+
## Learning Velocity
|
|
65
|
+
|
|
66
|
+
A companion metric measuring *how fast* the org is learning:
|
|
67
|
+
|
|
68
|
+
- Recency of experiment completions
|
|
69
|
+
- Time-to-learning (how quickly experiments reach conclusions)
|
|
70
|
+
- Ratio of conclusive vs inconclusive outcomes
|
|
71
|
+
- Revenue velocity from experiment-linked changes
|
|
72
|
+
|
|
73
|
+
## Prediction calibration
|
|
74
|
+
|
|
75
|
+
After experiments complete, predictions are evaluated:
|
|
76
|
+
|
|
77
|
+
- `accuracyScore` = `max(0, 1 - |error| / maxRange)` — how close the predicted change was to actual
|
|
78
|
+
- `GET /api/calibration` returns: Brier-style aggregate, average accuracy, bias label (`overconfident` / `underconfident` / `well-calibrated`), reliability buckets by confidence band
|
|
79
|
+
|
|
80
|
+
Use calibration to coach the user: "Your predictions at 80%+ confidence are only correct 55% of the time — consider more conservative estimates."
|
|
81
|
+
|
|
82
|
+
## Insights engine
|
|
83
|
+
|
|
84
|
+
`GET /api/insights` computes actionable insights from the full intelligence layer:
|
|
85
|
+
|
|
86
|
+
| Insight type | Trigger |
|
|
87
|
+
|-------------|---------|
|
|
88
|
+
| `experiment_ready` | Experiment has reached statistical significance |
|
|
89
|
+
| `data_gap` | Stale sensor sync or missing data |
|
|
90
|
+
| `drift_alert` | Metric has shifted unexpectedly |
|
|
91
|
+
| `recommendation` | System-generated growth suggestion |
|
|
92
|
+
| `goal_progress` | Goal approaching or exceeding target |
|
|
93
|
+
| `correlation_hint` | Detected relationship between metrics |
|
|
94
|
+
| `metric_shift` | Significant change in a tracked metric |
|
|
95
|
+
|
|
96
|
+
## When to activate this skill
|
|
97
|
+
|
|
98
|
+
- User says "what have we learned?" or "what do we know?" → surface beliefs + ledger
|
|
99
|
+
- User asks "should we build X?" → use `evaluate_feature` or `predict_impact`
|
|
100
|
+
- User wants to review experiment results → connect outcome to belief update
|
|
101
|
+
- User asks about prediction accuracy → surface calibration metrics
|
|
102
|
+
- User is planning strategy → show Growth Intelligence Score and learning velocity
|
|
103
|
+
- User debates a decision → find relevant beliefs and their evidence
|
|
104
|
+
|
|
105
|
+
## Common mistakes
|
|
106
|
+
|
|
107
|
+
- Treating beliefs as static — they should update with every experiment outcome
|
|
108
|
+
- Skipping predictions before experiments — loses calibration signal
|
|
109
|
+
- Looking at individual experiment results without connecting to the belief tree
|
|
110
|
+
- Ignoring calibration bias — overconfident teams run experiments that are too small
|
|
111
|
+
|
|
112
|
+
## Related
|
|
113
|
+
|
|
114
|
+
- Experiment design and instrumentation: see **apex-experimentation** skill
|
|
115
|
+
- Event tracking and identity: see **apex-growth-tracking** skill
|
|
116
|
+
- Communication experiments: see **apex-communications** skill
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: apex-integration-cookbook
|
|
3
|
+
description: Recipes for integrating Apex into products — snippet installation, SDK wiring, form tracking, auth/signup events, Stripe lifecycle, communication triggers, connectors, and actuators. Use when the user is adding Apex to their product, connecting a data source, or wiring events to communications or experiments.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Apex integration cookbook
|
|
7
|
+
|
|
8
|
+
Step-by-step recipes for common Apex integration patterns. Each recipe shows what to instrument, which surface to use (snippet, SDK, or API), and what Apex does with the data.
|
|
9
|
+
|
|
10
|
+
## Surfaces overview
|
|
11
|
+
|
|
12
|
+
| Surface | Best for | Install |
|
|
13
|
+
|---------|----------|---------|
|
|
14
|
+
| **Snippet** (`/api/apex-js`) | Marketing sites, landing pages, lightweight tracking | `<script src="https://your-apex/api/apex-js?key=PROJECT_KEY"></script>` |
|
|
15
|
+
| **SDK** (`@apex-inc/sdk`) | Apps and backends — richer tracking, identity, management | `npm install @apex-inc/sdk` then `init({ projectKey })` |
|
|
16
|
+
| **MCP** (`@apex-inc/mcp-server`) | AI-assisted setup — create experiments, communications, track events from the editor | One-click install from Apex dashboard |
|
|
17
|
+
| **API** (direct HTTP) | Webhooks, server-side events, custom integrations | `POST /api/events` with `x-api-key` header |
|
|
18
|
+
|
|
19
|
+
## Recipe 1: Marketing site (snippet only)
|
|
20
|
+
|
|
21
|
+
**Goal:** Track visits, form submissions, and run copy experiments on a marketing site.
|
|
22
|
+
|
|
23
|
+
```html
|
|
24
|
+
<script src="https://your-apex-url/api/apex-js?key=YOUR_PROJECT_KEY" defer></script>
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
What you get automatically:
|
|
28
|
+
- `pageview` events with URL, referrer, UTM params
|
|
29
|
+
- `heartbeat` events (engagement time)
|
|
30
|
+
- Visitor identity via `apex_vid` cookie
|
|
31
|
+
- Attribution from UTM parameters and click IDs (gclid, fbclid, etc.)
|
|
32
|
+
|
|
33
|
+
Add form tracking:
|
|
34
|
+
```javascript
|
|
35
|
+
apex.track("form_submit", {
|
|
36
|
+
formId: "signup-form",
|
|
37
|
+
email: formData.email
|
|
38
|
+
});
|
|
39
|
+
apex.identify(formData.email, { source: "form", formId: "signup-form" });
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## Recipe 2: App signup and authentication
|
|
43
|
+
|
|
44
|
+
**Goal:** Track signup, login, and connect anonymous browsing to known users.
|
|
45
|
+
|
|
46
|
+
```typescript
|
|
47
|
+
import { init, track, identify } from "@apex-inc/sdk";
|
|
48
|
+
|
|
49
|
+
init({ projectKey: "YOUR_PROJECT_KEY" });
|
|
50
|
+
|
|
51
|
+
// On signup
|
|
52
|
+
track("signup_completed", { method: "email", plan: "free" });
|
|
53
|
+
identify(user.id, {
|
|
54
|
+
email: user.email,
|
|
55
|
+
name: user.name,
|
|
56
|
+
visitorId: getCookie("apex_vid") // stitch to pre-signup browsing
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
// On login
|
|
60
|
+
track("login", { method: "google" });
|
|
61
|
+
identify(user.id, { email: user.email });
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
The `visitorId` trait is critical — it links the anonymous marketing session to the authenticated user. Without it, Apex creates a disconnected identity.
|
|
65
|
+
|
|
66
|
+
## Recipe 3: Onboarding funnel
|
|
67
|
+
|
|
68
|
+
**Goal:** Track onboarding steps to measure activation and trigger communications.
|
|
69
|
+
|
|
70
|
+
```typescript
|
|
71
|
+
// Each onboarding step
|
|
72
|
+
track("onboarding_step_completed", { step: "connect_data_source", stepNumber: 2, totalSteps: 5 });
|
|
73
|
+
|
|
74
|
+
// Onboarding complete — this triggers activation communications
|
|
75
|
+
track("onboarding_completed", { timeToComplete: elapsedMs });
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
Events like `onboarding_completed` automatically match to communications in the Apex catalog when tenant communications are active. The communication trigger system matches `triggerEventId` on active `TenantCommunication` records.
|
|
79
|
+
|
|
80
|
+
## Recipe 4: Stripe subscription lifecycle
|
|
81
|
+
|
|
82
|
+
**Goal:** Track revenue events from Stripe webhooks.
|
|
83
|
+
|
|
84
|
+
Set up the Stripe connector via the dashboard (Settings → Connectors → Stripe), or handle webhooks directly:
|
|
85
|
+
|
|
86
|
+
```typescript
|
|
87
|
+
// In your Stripe webhook handler
|
|
88
|
+
switch (event.type) {
|
|
89
|
+
case "checkout.session.completed":
|
|
90
|
+
track("subscription_created", {
|
|
91
|
+
plan: session.metadata.plan,
|
|
92
|
+
amount: session.amount_total,
|
|
93
|
+
currency: session.currency
|
|
94
|
+
});
|
|
95
|
+
identify(session.client_reference_id, {
|
|
96
|
+
email: session.customer_email,
|
|
97
|
+
plan: session.metadata.plan,
|
|
98
|
+
lifecycleStage: "paying"
|
|
99
|
+
});
|
|
100
|
+
break;
|
|
101
|
+
|
|
102
|
+
case "invoice.paid":
|
|
103
|
+
track("invoice_paid", {
|
|
104
|
+
amount: invoice.amount_paid,
|
|
105
|
+
plan: invoice.lines.data[0]?.price?.lookup_key
|
|
106
|
+
});
|
|
107
|
+
break;
|
|
108
|
+
|
|
109
|
+
case "customer.subscription.deleted":
|
|
110
|
+
track("subscription_cancelled", { reason: subscription.cancellation_details?.reason });
|
|
111
|
+
identify(customerId, { lifecycleStage: "churned" });
|
|
112
|
+
break;
|
|
113
|
+
}
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
## Recipe 5: Feature usage tracking
|
|
117
|
+
|
|
118
|
+
**Goal:** Measure which features drive retention and activation.
|
|
119
|
+
|
|
120
|
+
```typescript
|
|
121
|
+
// Track meaningful feature interactions, not every click
|
|
122
|
+
track("feature_used", { feature: "export_report", format: "csv" });
|
|
123
|
+
track("feature_used", { feature: "invite_teammate" });
|
|
124
|
+
track("feature_used", { feature: "create_experiment" });
|
|
125
|
+
|
|
126
|
+
// Track milestone completions
|
|
127
|
+
track("milestone_reached", { milestone: "first_experiment_completed" });
|
|
128
|
+
track("milestone_reached", { milestone: "10_contacts_scored" });
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
Prefer one event name (`feature_used`) with a `feature` property over dozens of unique event names. This keeps the event taxonomy clean and makes analysis easier.
|
|
132
|
+
|
|
133
|
+
## Recipe 6: Communication triggers
|
|
134
|
+
|
|
135
|
+
**Goal:** Wire custom events to lifecycle communications.
|
|
136
|
+
|
|
137
|
+
Communications trigger automatically when:
|
|
138
|
+
1. A `TenantCommunication` exists with `status: "active"` and a `triggerEventId`
|
|
139
|
+
2. An event matching that `triggerEventId` arrives via `apex.track()`
|
|
140
|
+
3. Multi-channel dispatch sends via the user's preferred channels (email, push, in-app)
|
|
141
|
+
|
|
142
|
+
Common trigger events from the Apex event taxonomy:
|
|
143
|
+
|
|
144
|
+
| Event | Communication |
|
|
145
|
+
|-------|--------------|
|
|
146
|
+
| `signup_completed` | Welcome email |
|
|
147
|
+
| `onboarding_completed` | Activation congratulations |
|
|
148
|
+
| `feature_used` (first time) | Feature discovery nudge |
|
|
149
|
+
| `subscription_created` | Payment confirmation |
|
|
150
|
+
| `trial_expiring` | Upgrade prompt |
|
|
151
|
+
| `user_inactive_7d` | Re-engagement email |
|
|
152
|
+
|
|
153
|
+
Use the MCP tool `get_event_taxonomy` or `GET /api/communications/events?vertical=b2b-saas` to see the full recommended event list for your vertical.
|
|
154
|
+
|
|
155
|
+
## Recipe 7: Outbound webhooks (actuators)
|
|
156
|
+
|
|
157
|
+
**Goal:** Push Apex events to external systems (Slack, CRMs, custom endpoints).
|
|
158
|
+
|
|
159
|
+
Configure actuators in the dashboard (Settings → Actuators) or via API. Apex sends signed payloads:
|
|
160
|
+
|
|
161
|
+
```json
|
|
162
|
+
{
|
|
163
|
+
"type": "experiment.completed",
|
|
164
|
+
"payload": { "experimentId": "...", "winner": "variant_b", "confidence": 0.95 },
|
|
165
|
+
"timestamp": "2026-04-15T..."
|
|
166
|
+
}
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
Verify with `X-Apex-Signature` header (HMAC-SHA256 of the body with your webhook secret).
|
|
170
|
+
|
|
171
|
+
Available trigger events: `experiment.completed`, `experiment.started`, `model.drift`, `sensor.sync_complete`, `sensor.sync_failed`, `budget.threshold`, and more.
|
|
172
|
+
|
|
173
|
+
## Recipe 8: Server-side event ingestion
|
|
174
|
+
|
|
175
|
+
**Goal:** Send events from a backend without the browser SDK.
|
|
176
|
+
|
|
177
|
+
```bash
|
|
178
|
+
curl -X POST https://your-apex-url/api/events \
|
|
179
|
+
-H "Content-Type: application/json" \
|
|
180
|
+
-H "x-api-key: YOUR_API_KEY" \
|
|
181
|
+
-H "x-apex-project: YOUR_PROJECT_KEY" \
|
|
182
|
+
-d '{
|
|
183
|
+
"projectKey": "YOUR_PROJECT_KEY",
|
|
184
|
+
"userId": "user_123",
|
|
185
|
+
"events": [{
|
|
186
|
+
"type": "track",
|
|
187
|
+
"payload": { "event": "invoice_paid", "amount": 9900, "currency": "usd" },
|
|
188
|
+
"timestamp": "2026-04-15T12:00:00Z"
|
|
189
|
+
}]
|
|
190
|
+
}'
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
## Event naming conventions
|
|
194
|
+
|
|
195
|
+
- **snake_case** or **dot-separated**: `signup_completed`, `feature_used`, `invoice.paid`
|
|
196
|
+
- Context in **properties**, not event names: `track("button_clicked", { surface: "pricing", label: "start_trial" })` — not `pricing_start_trial_clicked`
|
|
197
|
+
- For experiments, include `experimentId` and `variant` in properties when the event is relevant to exposure
|
|
198
|
+
- One primary metric per experiment; secondary metrics as properties
|
|
199
|
+
|
|
200
|
+
## Identity stitching checklist
|
|
201
|
+
|
|
202
|
+
When a user transitions from anonymous to known:
|
|
203
|
+
|
|
204
|
+
1. Call `identify(userId, { email, visitorId: apex_vid_cookie_value })`
|
|
205
|
+
2. The `visitorId` trait links anonymous browsing to the authenticated user
|
|
206
|
+
3. Server-side `identify`: pass `traits.visitorId` = browser's `apex_vid` cookie value
|
|
207
|
+
4. Without stitching, Apex creates a disconnected identity — pre-signup attribution is lost
|
|
208
|
+
|
|
209
|
+
## Related
|
|
210
|
+
|
|
211
|
+
- Event naming and tracking fundamentals: see **apex-growth-tracking** skill
|
|
212
|
+
- Experiment design: see **apex-experimentation** skill
|
|
213
|
+
- Intelligence and beliefs: see **apex-growth-intelligence** skill
|
|
214
|
+
- Communication setup: see **apex-communications** skill
|