Klaviyo Core Workflow B -- Events, Segments & Campaigns
Overview
Secondary workflow: track customer events, query segments, create/send campaigns, and
trigger metric-based flows via the klaviyo-api SDK. This page summarizes the five steps
and their skeletons; the full copy-ready code lives in
references/implementation.md and worked scenarios in
references/examples.md.
Prerequisites
- Completed
klaviyo-core-workflow-a (profiles/lists set up)
- API key scopes:
events:write, segments:read, campaigns:read, campaigns:write, flows:read
klaviyo-api installed and KLAVIYO_PRIVATE_KEY set in the environment
Instructions
Open one session, then use the API class each step needs. Full parameter shapes for every
step are in references/implementation.md.
import { ApiKeySession, EventsApi } from 'klaviyo-api';
const session = new ApiKeySession(process.env.KLAVIYO_PRIVATE_KEY!);
- Step 1 — Track server-side events.
new EventsApi(session).createEvent(...). Include
metric.data.attributes.name (auto-creates the metric), a profile, a value for revenue
attribution, and a uniqueId for deduplication. Custom metrics trigger listening flows.
- Step 2 — Query events and metrics.
MetricsApi.getMetrics() lists event types;
EventsApi.getEvents({ sort: '-datetime', filter: 'equals(metric_id,"...")' }) reads recent events.
- Step 3 — Work with segments.
SegmentsApi.getSegments() lists them,
getSegmentProfiles() reads members, and getSegment({ additionalFieldsSegment: ['profile_count'] })
returns the size — check it before a send.
- Step 4 — Create an email campaign. Four ordered calls: create a template, create the
campaign (with
audiences.included/excluded), assign the template to the campaign message,
then create the campaign-send-job. Sending before the template is assigned returns a 400.
- Step 5 — Query flows (read-only).
FlowsApi.getFlows() lists flows;
getFlowFlowActions({ id }) returns each flow's steps and their status.
Output
- Event tracking returns an HTTP 202 Accepted acknowledgement (Klaviyo queues events
asynchronously); the event appears in the profile's
activity feed and fires any flow listening on that metric.
- Metric/segment/flow queries return a
body.data array of records with id and
attributes (name, status, profileCount, etc.).
- Campaign creation yields a campaign
id; the send job queues the campaign, and Klaviyo
reports delivery back in the app's campaign analytics.
Common Event Names for Flow Triggers
| Event name |
Typical trigger |
Flow type |
Placed Order |
Purchase completed |
Post-purchase / cross-sell |
Started Checkout |
Cart created |
Abandoned cart |
Viewed Product |
Product page visit |
Browse abandonment |
Ordered Product |
Per-item tracking |
Product review request |
Fulfilled Order |
Shipment sent |
Shipping confirmation |
Cancelled Order |
Order cancelled |
Win-back |
Subscribed to List |
Email/SMS signup |
Welcome series |
Custom Event |
Any API event |
Custom automation |
Error Handling
| Error |
Status |
Cause |
Solution |
| Invalid metric name |
400 |
Empty or null metric |
Always include metric.data.attributes.name |
| Segment not found |
404 |
Wrong segment ID |
List segments with getSegments() |
| Campaign send failed |
400 |
Missing template/audience |
Assign template and set audience first |
| Duplicate event |
N/A |
Same uniqueId |
Deduplication built-in; safe to retry |
Examples
Concrete, runnable scenarios are collected in
references/examples.md:
- Fire an abandoned-cart signal — track a
Started Checkout event for a flow to pick up.
- Size a segment before sending — read
profileCount and refuse to send to an empty audience.
- Create and send a campaign to a segment — the ordered template → campaign → assign → send-job chain.
A minimal event track:
import { EventsApi, EventEnum, ProfileEnum } from 'klaviyo-api';
const eventsApi = new EventsApi(session);
await eventsApi.createEvent({
data: {
type: EventEnum.Event,
attributes: {
metric: { data: { type: 'metric', attributes: { name: 'Placed Order' } } },
profile: { data: { type: ProfileEnum.Profile, attributes: { email: 'customer@example.com' } } },
value: 99.97,
time: new Date().toISOString(),
uniqueId: 'ORD-12345',
},
},
});
Resources
Source: jeremylongshore/claude-code-plugins-plus-skills → plugins/saas-packs/klaviyo-pack/skills/klaviyo-core-workflow-b/SKILL.md
1---2name: klaviyo-core-workflow-b3description: "| Execute the Klaviyo secondary workflow: event tracking, segments, and campaigns. Use when you need to track customer events, query or size segments, build and send email campaigns, or inspect metric-triggered flows through the Klaviyo API. Trigger with phrases like \"klaviyo events\", \"klaviyo segments\", \"klaviyo campaigns\", \"track klaviyo event\", \"klaviyo flow trigger\"."4allowed-tools: "Read, Write, Bash(npm:*)"5category: backend-and-data6source_repo: jeremylongshore/claude-code-plugins-plus-skills7source_path: "plugins/saas-packs/klaviyo-pack/skills/klaviyo-core-workflow-b/SKILL.md"8source_url: https://github.com/jeremylongshore/claude-code-plugins-plus-skills/blob/HEAD/plugins/saas-packs/klaviyo-pack/skills/klaviyo-core-workflow-b/SKILL.md9---1011# Klaviyo Core Workflow B -- Events, Segments & Campaigns1213## Overview1415Secondary workflow: track customer events, query segments, create/send campaigns, and16trigger metric-based flows via the `klaviyo-api` SDK. This page summarizes the five steps17and their skeletons; the full copy-ready code lives in18[references/implementation.md](references/implementation.md) and worked scenarios in19[references/examples.md](references/examples.md).2021## Prerequisites2223- Completed `klaviyo-core-workflow-a` (profiles/lists set up)24- API key scopes: `events:write`, `segments:read`, `campaigns:read`, `campaigns:write`, `flows:read`25- `klaviyo-api` installed and `KLAVIYO_PRIVATE_KEY` set in the environment2627## Instructions2829Open one session, then use the API class each step needs. Full parameter shapes for every30step are in [references/implementation.md](references/implementation.md).3132```typescript33import { ApiKeySession, EventsApi } from 'klaviyo-api';34const session = new ApiKeySession(process.env.KLAVIYO_PRIVATE_KEY!);35```36371. **Step 1 — Track server-side events.** `new EventsApi(session).createEvent(...)`. Include38 `metric.data.attributes.name` (auto-creates the metric), a `profile`, a `value` for revenue39 attribution, and a `uniqueId` for deduplication. Custom metrics trigger listening flows.402. **Step 2 — Query events and metrics.** `MetricsApi.getMetrics()` lists event types;41 `EventsApi.getEvents({ sort: '-datetime', filter: 'equals(metric_id,"...")' })` reads recent events.423. **Step 3 — Work with segments.** `SegmentsApi.getSegments()` lists them,43 `getSegmentProfiles()` reads members, and `getSegment({ additionalFieldsSegment: ['profile_count'] })`44 returns the size — check it before a send.454. **Step 4 — Create an email campaign.** Four ordered calls: create a template, create the46 campaign (with `audiences.included`/`excluded`), assign the template to the campaign message,47 then create the `campaign-send-job`. Sending before the template is assigned returns a 400.485. **Step 5 — Query flows (read-only).** `FlowsApi.getFlows()` lists flows;49 `getFlowFlowActions({ id })` returns each flow's steps and their status.5051## Output5253- **Event tracking** returns an HTTP 202 Accepted acknowledgement (Klaviyo queues events54 asynchronously); the event appears in the profile's55 activity feed and fires any flow listening on that metric.56- **Metric/segment/flow queries** return a `body.data` array of records with `id` and57 `attributes` (name, status, `profileCount`, etc.).58- **Campaign creation** yields a campaign `id`; the send job queues the campaign, and Klaviyo59 reports delivery back in the app's campaign analytics.6061## Common Event Names for Flow Triggers6263| Event name | Typical trigger | Flow type |64|-----------|----------------|-----------|65| `Placed Order` | Purchase completed | Post-purchase / cross-sell |66| `Started Checkout` | Cart created | Abandoned cart |67| `Viewed Product` | Product page visit | Browse abandonment |68| `Ordered Product` | Per-item tracking | Product review request |69| `Fulfilled Order` | Shipment sent | Shipping confirmation |70| `Cancelled Order` | Order cancelled | Win-back |71| `Subscribed to List` | Email/SMS signup | Welcome series |72| `Custom Event` | Any API event | Custom automation |7374## Error Handling7576| Error | Status | Cause | Solution |77|-------|--------|-------|----------|78| Invalid metric name | 400 | Empty or null metric | Always include `metric.data.attributes.name` |79| Segment not found | 404 | Wrong segment ID | List segments with `getSegments()` |80| Campaign send failed | 400 | Missing template/audience | Assign template and set audience first |81| Duplicate event | N/A | Same `uniqueId` | Deduplication built-in; safe to retry |8283## Examples8485Concrete, runnable scenarios are collected in86[references/examples.md](references/examples.md):8788- **Fire an abandoned-cart signal** — track a `Started Checkout` event for a flow to pick up.89- **Size a segment before sending** — read `profileCount` and refuse to send to an empty audience.90- **Create and send a campaign to a segment** — the ordered template → campaign → assign → send-job chain.9192A minimal event track:9394```typescript95import { EventsApi, EventEnum, ProfileEnum } from 'klaviyo-api';96const eventsApi = new EventsApi(session);9798await eventsApi.createEvent({99 data: {100 type: EventEnum.Event,101 attributes: {102 metric: { data: { type: 'metric', attributes: { name: 'Placed Order' } } },103 profile: { data: { type: ProfileEnum.Profile, attributes: { email: 'customer@example.com' } } },104 value: 99.97,105 time: new Date().toISOString(),106 uniqueId: 'ORD-12345',107 },108 },109});110```111112## Resources113114- [Full implementation walkthrough](references/implementation.md) — copy-ready code for all five steps115- [Worked examples](references/examples.md) — end-to-end scenarios116- [Events API](https://developers.klaviyo.com/en/reference/events_api_overview)117- [Segments API](https://developers.klaviyo.com/en/reference/segments_api_overview)118- [Campaigns API](https://developers.klaviyo.com/en/reference/campaigns_api_overview)119- [Flows API](https://developers.klaviyo.com/en/reference/flows_api_overview)120- [Metrics API](https://developers.klaviyo.com/en/reference/metrics_api_overview)121- For common errors, see the `klaviyo-common-errors` skill.122123---124125**Source:** [`jeremylongshore/claude-code-plugins-plus-skills`](https://github.com/jeremylongshore/claude-code-plugins-plus-skills) → `plugins/saas-packs/klaviyo-pack/skills/klaviyo-core-workflow-b/SKILL.md`