customerio-hello-world
Provides minimal working examples for identifying users, tracking events, and sending transactional emails in Customer.io.
Install
mkdir -p .claude/skills/customerio-hello-world && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/4847" && unzip -o skill.zip -d .claude/skills/customerio-hello-world && rm skill.zipInstalls to .claude/skills/customerio-hello-world
Activation
This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.
Create a minimal working Customer.io example.Key capabilities
- →Identify users to create or update profiles
- →Track custom events on user timelines
- →Track anonymous events before user signup
- →Send transactional emails via API
- →Verify integration status in dashboard
How it works
The skill demonstrates the core SDK operations: identify() to manage user profiles, track() for behavioral events, and APIClient for transactional messaging. It enforces specific data formatting, such as Unix timestamps in seconds.
Inputs & outputs
When to use customerio-hello-world
- →Test Customer.io SDK installation
- →Identify users in the Customer.io platform
- →Implement basic event tracking
- →Setup first transactional message
About this skill
Customer.io Hello World
Overview
Create a minimal working Customer.io integration: identify a user (create/update their profile), track an event, and send a transactional email. This covers the three fundamental Customer.io operations.
Prerequisites
customerio-nodeinstalled (npm install customerio-node)CUSTOMERIO_SITE_IDandCUSTOMERIO_TRACK_API_KEYconfiguredCUSTOMERIO_APP_API_KEYconfigured (for transactional email example)
Instructions
Step 1: Identify a User (Create/Update Profile)
// hello-customerio.ts
import { TrackClient, RegionUS } from "customerio-node";
const cio = new TrackClient(
process.env.CUSTOMERIO_SITE_ID!,
process.env.CUSTOMERIO_TRACK_API_KEY!,
{ region: RegionUS }
);
// identify() creates the user if they don't exist, or updates if they do.
// The first argument is your internal user ID (immutable — use DB primary key).
await cio.identify("user-123", {
email: "[email protected]", // Required for email campaigns
first_name: "Jane",
last_name: "Doe",
plan: "pro",
created_at: Math.floor(Date.now() / 1000), // Unix seconds, NOT milliseconds
});
console.log("User identified in Customer.io");
Key rules:
id(first arg) should be your immutable database ID — never use email as IDemailattribute is required if you want to send email campaignscreated_atmust be Unix timestamp in seconds (not ms) —Math.floor(Date.now() / 1000)- All custom attributes are stored on the user profile and usable in segments + Liquid templates
Step 2: Track an Event
// Track a custom event on the user's activity timeline.
// Events trigger campaigns — the event name must match exactly in the dashboard.
await cio.track("user-123", {
name: "signed_up", // snake_case, matches campaign trigger
data: {
signup_method: "google_oauth",
referral_source: "product_hunt",
timestamp: Math.floor(Date.now() / 1000),
},
});
console.log("Event tracked in Customer.io");
Key rules:
- User must be identified before tracking events (call
identify()first) - Event
nameis case-sensitive and must match your campaign trigger exactly - Use
snake_casefor event names —signed_up, notSigned UporsignedUp dataproperties are accessible in Liquid templates as{{ event.property_name }}
Step 3: Track an Anonymous Event
// Track events before the user signs up — merge later on identification
await cio.trackAnonymous({
anonymous_id: "anon-abc-123", // Your anonymous tracking ID (cookie, device ID)
name: "page_viewed",
data: {
url: "/pricing",
referrer: "https://google.com",
},
});
console.log("Anonymous event tracked");
When the anonymous user signs up, include anonymous_id in the identify() call to merge their pre-signup activity:
await cio.identify("user-123", {
email: "[email protected]",
anonymous_id: "anon-abc-123", // Merges anonymous activity
});
Step 4: Send a Transactional Email
import { APIClient, SendEmailRequest, RegionUS } from "customerio-node";
const api = new APIClient(process.env.CUSTOMERIO_APP_API_KEY!, {
region: RegionUS,
});
const request = new SendEmailRequest({
to: "[email protected]",
transactional_message_id: "1", // ID from Customer.io dashboard
message_data: { // Populates {{ liquid }} variables
welcome_name: "Jane",
login_url: "https://app.example.com/login",
},
identifiers: { id: "user-123" }, // Links delivery to user profile
});
const response = await api.sendEmail(request);
console.log("Email queued:", response.delivery_id);
Step 5: Verify in Dashboard
- Go to https://fly.customer.io
- Navigate to People and search for "[email protected]"
- Verify the profile shows
first_name,plan, and other attributes - Click the Activity tab to see the
signed_upevent - Check Deliveries for the transactional email
Complete Example
// scripts/hello-customerio.ts
import {
TrackClient, APIClient, SendEmailRequest, RegionUS
} from "customerio-node";
async function main() {
// Track API client — identify and track
const cio = new TrackClient(
process.env.CUSTOMERIO_SITE_ID!,
process.env.CUSTOMERIO_TRACK_API_KEY!,
{ region: RegionUS }
);
// 1. Identify
await cio.identify("user-hello-world", {
email: "[email protected]",
first_name: "Jane",
created_at: Math.floor(Date.now() / 1000),
});
console.log("1. User identified");
// 2. Track event
await cio.track("user-hello-world", {
name: "hello_world_completed",
data: { sdk: "customerio-node", step: "quickstart" },
});
console.log("2. Event tracked");
// 3. Clean up test user (optional)
await cio.suppress("user-hello-world");
console.log("3. Test user suppressed (won't receive messages)");
}
main().catch(console.error);
Run: npx tsx scripts/hello-customerio.ts
Error Handling
| Error | Cause | Solution |
|---|---|---|
401 Unauthorized | Invalid credentials | Verify Site ID + Track API Key in dashboard |
400 Bad Request | Malformed payload | Check attribute types and event name format |
| User not in People tab | identify() not called | Always call identify() before track() |
| Event not in Activity | Dashboard propagation delay | Wait 1-2 minutes and refresh |
| Transactional email fails | Wrong transactional_message_id | Verify the ID matches your template in Customer.io |
Resources
Next Steps
After verifying hello world works, proceed to customerio-local-dev-loop to set up your development workflow.
Prerequisites
Limitations
- →User must be identified before tracking events
- →Event names are case-sensitive
How it compares
This workflow provides a minimal, verified implementation path compared to reading general API documentation.
Compared to similar skills
customerio-hello-world side by side with the closest alternatives in the catalog.
| Skill | Installs | Updated | Safety | Difficulty |
|---|---|---|---|---|
| customerio-hello-world (this skill) | 1 | 27d | Review | Beginner |
| telegram-bot-builder | 106 | 6mo | Review | Intermediate |
| customerio-primary-workflow | 1 | 27d | Review | Intermediate |
| customerio-webhooks-events | 0 | 27d | Review | Intermediate |
Try saying
Example prompts that trigger this skill in your AI assistant.
More by jeremylongshore
View all by jeremylongshore →You might also like
telegram-bot-builder
davila7
Expert in building Telegram bots that solve real problems - from simple automation to complex AI-powered bots. Covers bot architecture, the Telegram Bot API, user experience, monetization strategies, and scaling bots to thousands of users. Use when: telegram bot, bot api, telegram automation, chat bot telegram, tg bot.
customerio-primary-workflow
jeremylongshore
Execute Customer.io primary messaging workflow. Use when setting up email campaigns, push notifications, SMS messaging, or in-app message workflows. Trigger with phrases like "customer.io campaign", "customer.io workflow", "customer.io email automation", "customer.io messaging".
customerio-webhooks-events
jeremylongshore
Implement Customer.io webhook handling. Use when processing delivery events, handling callbacks, or integrating Customer.io event streams. Trigger with phrases like "customer.io webhook", "customer.io events", "customer.io callback", "customer.io delivery status".
FCM Job Queue Integration
nexonic-technologies
Instructions and standards for managing asynchronous FCM Push Notifications via the JobQueue system.
telegram-mini-app
davila7
Expert in building Telegram Mini Apps (TWA) - web apps that run inside Telegram with native-like experience. Covers the TON ecosystem, Telegram Web App API, payments, user authentication, and building viral mini apps that monetize. Use when: telegram mini app, TWA, telegram web app, TON app, mini app.
stripe-integration
wshobson
Implement Stripe payment processing for robust, PCI-compliant payment flows including checkout, subscriptions, and webhooks. Use when integrating Stripe payments, building subscription systems, or implementing secure checkout flows.