Customerio Core FeatureSAFE
Model-agnostic agent-skills platform with a harness-free canonical layer, verified adapters, and the ccpi package manager. Explore at tonsofskills.com.
Overview
Model-agnostic agent-skills platform with a harness-free canonical layer, verified adapters, and the ccpi package manager. Explore at tonsofskills.com.
4f83675ca38aOBSERVED · 2026-10-08Host compatibility
What the documentation claims. We have not run a compatibility test.
| Host | Status | Notes |
|---|---|---|
| claude-code | mentioned |
What it tells the agent
The instruction file, verbatim from the audited commit — this is the text the model reads, and the surface the audit's instruction layer examines. Quoted here so you can judge it without cloning anything.
--- name: customerio-core-feature description: 'Implement Customer.io core features: transactional messages, API-triggered broadcasts, segments, and person merge. Trigger: "customer.io segments", "customer.io transactional", "customer.io broadcast", "customer.io merge users", "customer.io send email". ' allowed-tools: Read, Write, Edit, Bash(npm:*), Bash(npx:*), Glob, Grep version: 1.14.0 license: MIT author: Jeremy Longshore <[email protected]> tags: - saas - customer-io - transactional - broadcasts - segments compatibility: Designed for Claude Code --- # Customer.io Core Features ## Output - A scoped, consent-aware Customer.io feature configuration with a validated data contract and owner. - A test receipt showing intended audience, environment, event/message behavior, and safe rollback path. ## Examples Configure a feature in development with a synthetic profile and a narrowly defined event. Verify attributes, segment membership, and message preview before promotion. If the audience or consent behavior differs from expectation, disable the development configuration and correct the contract before proceeding. ## Overview Implement Customer.io's key platform features: transactional emails/push (password resets, receipts), API-triggered broadcasts (one-to-many on demand), segment-driving attributes, anonymous-to-known user merging, and person suppression/deletion. ## Prerequisites - `customerio-node` installed - Track API credentials (`CUSTOMERIO_SITE_ID` + `CUSTOMERIO_TRACK_API_KEY`) - App API credential (`CUSTOMERIO_APP_API_KEY`) — required for transactional + broadcasts ## Instructions ### Feature 1: Transactional Email Transactional messages are opt-in-implied messages (receipts, password resets). Create the template in Customer.io dashboard first, then call the API with data. ```typescript // lib/customerio-transactional.ts import { APIClient, SendEmailRequest, RegionUS } from "customerio-node"; const api = new APIClient(process.env.CUSTOMERIO_APP_API_KEY!, { region: RegionUS, }); // Send a transactional email // transactional_message_id comes from the Customer.io dashboard template async function sendPasswordReset(email: string, userId: string, resetUrl: string) { const request = new SendEmailRequest({ to: email, transactional_message_id: "3", // Template ID from dashboard message_data: { reset_url: resetUrl, expiry_hours: 24, support_email: "[email protected]", }, identifiers: { id: userId }, // Links delivery metrics to user profile }); const response = await api.sendEmail(request); // response = { delivery_id: "abc123", queued_at: 1704067200 } return response; } // Send an order confirmation with complex data async function sendOrderConfirmation( email: string, userId: string, order: { id: string; items: { name: string; qty: number; price: number }[]; total: number } ) { const request = new SendEmailRequest({ to: email, transactional_message_id: "5", message_data: { order_id: order.id, items: order.items, // Accessible as {{ event.items }} in Liquid total: order.total, order_date: new Date().toISOString(), }, identifiers: { id: userId }, }); return api.sendEmail(request); } ``` **Dashboard setup:** Create transactional message at Transactional > Create Message. Use Liquid syntax: `{{ data.reset_url }}`, `{{ data.order_id }}`, `{% for item in data.items %}`. ### Feature 2: Transactional Push ```typescript import { APIClient, SendPushRequest, RegionUS } from "customerio-node"; const api = new APIClient(process.env.CUSTOMERIO_APP_API_KEY!, { region: RegionUS, }); async function sendPushNotification(userId: string, title: string, body: string) { const request = new SendPushRequest({ transactional_message_id: "7", // Push template ID identifiers: { id: userId }, message_data: { title, body }, }); return api.sendPush(request); } ``` ### Feature 3: API-Triggered Broadcasts Broadcasts send to a pre-defined segment on demand. Define the segment and message in the dashboard, then trigger via API. ```typescript // lib/customerio-broadcasts.ts import { APIClient, RegionUS } from "customerio-node"; const api = new APIClient(process.env.CUSTOMERIO_APP_API_KEY!, { region: RegionUS, }); // Trigger a broadcast to a pre-defined segment async function triggerProductUpdateBroadcast(version: string, changelog: string) { await api.triggerBroadcast( 42, // Broadcast ID from dashboard { version, changelog }, // Data merged into Liquid template { segment: { id: 15 } } // Target segment (defined in dashboard) ); } // Trigger broadcast to specific emails async function triggerBroadcastToEmails( broadcastId: number, emails: string[], data: Record<string, any> ) { await api.triggerBroadcast( broadcastId, data, { emails, email_ignore_missing: true, // Don't error on unknown emails email_add_duplicates: false, // Skip if user already in broadcast } ); } // Trigger broadcast to specific user IDs async function triggerBroadcastToUsers( broadcastId: number, userIds: string[], data: Record<string, any> ) { await api.triggerBroadcast(broadcastId, data, { ids: userIds }); } ``` ### Feature 4: Segment-Driving Attributes Segments in Customer.io are data-driven — they automatically include/exclude people based on attributes you set via `identify()`. ```typescript // services/customerio-segments.ts import { TrackClient, RegionUS } from "customerio-node"; const cio = new TrackClient( process.env.CUSTOMERIO_SITE_ID!, process.env.CUSTOMERIO_TRACK_API_KEY!, { region: RegionUS } ); // Update attributes that drive segment membership async function updateEngagementAttributes(userId: string, metrics: { lastActiveAt: Date; sessionCount: number; totalRevenue: number; daysSinceLastLogin: number; }) { await cio.identify
Trust audit
SAFEgrade B · trust 89/100 Nothing in the source contradicts what it says it does. Grade A is reserved for packages that have also passed the behavioural sandbox.
| Layer | What it checks | Result |
|---|---|---|
| L0 | Provenance & inventory | PASS |
| L1 | Static analysis of the code | PASS |
| L2 | Instruction surface (what it tells the agent) | PASS |
| L3 | Class-specific surface | PASS |
| L4 | Behavioural (sandbox) | SKIPPED |
What the source does
- Filesystem
- none-observed
- Network
- none-observed
- Shell
- none-observed
- Dependencies
- pinned
- Secrets in source
- none-found
Findings (0)
No findings outside the package's declared scope.
Gates applied: no_behavioural_pass.
4f83675ca38afull audit observations/trust-audit/skill/jeremylongshore__customerio-core-feature.json · Report an issue / request a re-scanAudit history
Every audit this skill has had.
| Date | Source | Verdict | Grade | Score | Change |
|---|---|---|---|---|---|
| 2026-10-08 | 4f83675ca38a | SAFE | B | 89 | first audit |
Questions
What does the Customerio Core Feature skill do?
Model-agnostic agent-skills platform with a harness-free canonical layer, verified adapters, and the ccpi package manager. Explore at tonsofskills.com.
Is Customerio Core Feature safe to install?
The audit found nothing in the source that contradicts what it says it does, and graded it B (89/100). Grade A is held back for packages that have also passed a sandboxed behavioural run, which is why a clean skill reads B.
What can Customerio Core Feature access on my machine?
The audit observed no filesystem, network or shell use at all in its source.
Which assistants does Customerio Core Feature work with?
Its documentation mentions claude-code. That is what the text claims, not a compatibility test we ran.
How current is this page?
The grade is for one exact copy of the source (4f83675ca38a), read on 2026-10-08. The repository is watched, and a new audit runs when it changes — this is the first audit.