skills/sales-customerio/SKILL.md
Customer.io platform help — customer engagement and marketing automation for behavior-based multi-channel messaging (email, SMS, push, in-app, WhatsApp). Use when automations aren't triggering on the right behavior, transactional messages are failing or delayed, segments aren't updating as expected, journeys need debugging or restructuring, Data Pipelines or reverse ETL aren't syncing, custom object relationships aren't working, or API calls to Track/App/Transactional endpoints are erroring. Do NOT use for general email marketing strategy (use /sales-email-marketing), cross-platform email deliverability (use /sales-deliverability), or email open/click tracking strategy (use /sales-email-tracking).
npx skillsauth add sales-skills/sales sales-customerioInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Help the user with Customer.io platform questions — from behavior-triggered journeys and campaigns through transactional messaging, segmentation, multi-channel delivery (email, SMS, push, in-app, WhatsApp), Data Pipelines, Custom Objects, Ad Audience Sync, and analytics. Customer.io is a customer engagement and marketing automation platform for data-driven, event-based messaging across the entire customer lifecycle. Founded in 2012 by Colin Nederkoorn and John Allison, Customer.io serves 9,000+ brands with $100M+ ARR and differentiates through event-driven automation for product-led companies — while Mailchimp/SendGrid focus on marketing email, Customer.io excels at behavior-triggered messaging (onboarding, activation, retention, re-engagement) with first-party data at the center.
If references/learnings.md exists, read it first for accumulated knowledge.
Ask the user:
What area of Customer.io do you need help with?
What's your role?
What are you trying to accomplish? (describe your specific goal or question)
If the user's request already provides most of this context, skip directly to the relevant step. Lead with your best-effort answer using reasonable assumptions (stated explicitly), then ask only the most critical 1-2 clarifying questions at the end — don't gate your response behind gathering complete context.
Note: If the user needs a specialized skill, route them there with a brief explanation of why that skill is a better fit.
If the request maps to a specialized skill, route:
/sales-email-marketing/sales-deliverability/sales-email-tracking/sales-integration/sales-funnelOtherwise, answer directly from platform knowledge using the reference below.
Read references/platform-guide.md for detailed module documentation, pricing, integrations, and data model.
You no longer need the platform guide details — focus on the user's specific situation.
Based on the user's specific question:
Event-triggered campaign: ensure your app tracks the trigger event (trial_started, purchase_completed, …) via the Track API or Data Pipelines, then Journeys > Create Journey > "Event triggered" > select the event (optionally filter on event data, e.g. plan = "pro"). Add a delay, then a message action per channel, personalized with Liquid ({{ customer.first_name }}, {{ event.plan_name }}). Add true/false branches for follow-ups, set a conversion goal event with a time window, and test in draft with a test profile before activating.
Transactional email via the API: build a Transactional > Email template (Liquid vars like {{ order_number }}, {{ reset_url }}), note its message ID, and get your App API key from Settings > API Credentials — a Bearer token, different from the Track API Site ID/key pair. Send:
POST https://api.customer.io/v1/send/email
Authorization: Bearer YOUR_APP_API_KEY
Content-Type: application/json
{ "transactional_message_id": "YOUR_TEMPLATE_ID", "to": "[email protected]",
"identifiers": { "id": "user_123" }, "message_data": { "order_number": "ORD-456" } }
For EU data residency use https://api-eu.customer.io/v1/send/email. Delivery/opens/clicks show in Transactional Messages.
Data-driven segments: Segments > Create Segment > Data-driven, combining attribute filters (plan equals "premium"), event filters (performed login ≥3× in 7 days), and engagement filters (opened any email in 30 days) with AND/OR grouping. Preview before saving; use the segment as a journey trigger (people enter on match, exit when they no longer match). Segments re-evaluate in real time as Track API / Data Pipelines data arrives — no manual refresh.
Webhook inside a journey: add a "Send Webhook" action at a journey step; set method (GET/POST/PUT/PATCH/DELETE), URL, headers, and a Liquid body ({ "user_id": "{{ customer.id }}", "plan": "{{ customer.plan }}" }) plus auth headers as needed. Use it to update a CRM, ping Slack, or call your own API; branch the journey on the response status (success/failure). Test in draft first.
Data Pipelines ingestion: Data Pipelines > Sources > Add Source; pick a source (JS/browser, server SDK for Node/Python/Ruby/Go/Java/PHP, or HTTP API) and copy its write key. Send data via analytics.identify("user_123", {...}) (create/update a person) and analytics.track("user_123", "Feature Activated", {...}) (event). The API is Segment-tracking-spec compatible (minimal changes when migrating). For reverse ETL (Snowflake/BigQuery) add a Warehouse source with sync schedules, add destinations (Amplitude/Mixpanel/webhook) to route data beyond Journeys, and monitor source health for volume/errors/latency.
Best-effort from research — verify details against current Customer.io documentation.
Essentials plan starts at $100/mo, which is steep for small senders. Unlike Mailchimp (free tier up to 500 contacts) or SendGrid (free tier for 100 emails/day), Customer.io has no free plan and the entry point is $100/mo for 5,000 profiles. If you are a very early-stage startup or small sender with fewer than a few thousand contacts, evaluate whether Customer.io's event-driven automation justifies the cost versus simpler tools. The $0.009/profile overage also adds up quickly at scale.
Only 2 custom object types are available on the Essentials plan. If you need to model more than 2 non-person entities (e.g., accounts, products, subscriptions, orders), you must upgrade to Premium ($1,000/mo annual). Plan your data model carefully before committing to Essentials — if you need accounts and one more object type, you are already at the limit.
API-triggered broadcasts are rate-limited to 1 request per 10 seconds. This is significantly slower than the Track API (1000 req/sec fair-use) or Transactional API (100 req/sec). Do not use API-triggered broadcasts for high-frequency or real-time use cases. If you need to send urgent one-time messages to many people quickly, consider using the Transactional API for individual sends or schedule the broadcast in advance rather than triggering it via API at the last moment.
In-app messages require Customer.io SDK integration in your application. Unlike email or SMS which work without any client-side code, in-app messages need the Customer.io JavaScript SDK (web) or mobile SDK (iOS/Android/React Native/Flutter) installed and initialized in your app. This means engineering work to integrate the SDK, handle message rendering, and manage the user session. Budget development time for this — it is not a plug-and-play channel.
SMS requires a separate Twilio account and incurs separate Twilio charges. Customer.io does not provide SMS infrastructure directly — it uses Twilio under the hood. You must create a Twilio account, purchase a phone number, and connect your Twilio credentials to Customer.io. SMS costs are billed by Twilio (not Customer.io) based on Twilio's per-message pricing. This adds billing complexity and means your total messaging cost is split across two vendors.
references/learnings.md with today's date./sales-email-marketing — Email marketing strategy and best practices (platform-agnostic)/sales-deliverability — Cross-platform email deliverability — SPF/DKIM/DMARC, warmup, inbox placement/sales-email-tracking — Email open and click tracking strategy/sales-integration — Connect Customer.io to other tools via Zapier, webhooks, or API/sales-funnel — Funnel strategy and conversion optimization/sales-do — Not sure which skill to use? The router matches any sales objective to the right skill. Install: npx skills add sales-skills/sales --skill sales-doUser says: "I want to send a 5-email onboarding sequence when someone signs up for our SaaS product, with different paths based on whether they complete key activation steps." Skill does:
signed_up event (or equivalent) via the Track API or Data Pipelines — if not, guides them through instrumenting the eventsigned_up eventactivated event — true branch skips the activation nudge and sends a "great job" email instead; false branch continues with the nudgeactivated as the conversion goal with a 14-day window{{ customer.first_name }}, {{ customer.company }}, {{ customer.plan }}User says: "We need to send order confirmation emails with line items immediately after purchase, triggered from our backend API." Skill does:
{{ order_number }}, {{ items }} (looped with {% for item in message_data.items %}), {{ total }}POST https://api.customer.io/v1/send/email with transactional_message_id, to, identifiers, and message_data containing the order detailsid in identifiers so the transactional send is associated with their profile for analyticsapi-eu.customer.io
Result: User has production-ready transactional order confirmation emails triggered from their backend with dynamic line-item renderingUser says: "We want to stop showing acquisition ads to people who are already paying customers. Can Customer.io sync our paying customer segment to Google Ads?" Skill does:
plan is not "free" AND subscription_status equals "active")Symptom: You are tracking events via the Track API or Data Pipelines, but event-triggered campaigns or journeys are not firing for those events.
Cause: The most common cause is that the person does not exist in Customer.io before the event is tracked. The Track API requires that a person is identified (PUT /customers/{id}) before events can be associated with them. Another common cause is a mismatch between the event name in your code and the event name configured as the journey trigger (event names are case-sensitive). Finally, check that the journey is in an active state — draft or paused journeys will not trigger.
Solution: Verify the person exists by checking their profile in Customer.io (People > search by ID or email). Ensure you call identify before track in your integration code. Double-check the event name matches exactly (case-sensitive) between your code and the journey trigger configuration. Confirm the journey status is "Active" in the Journeys list. Use the Activity Log to see if Customer.io received the event at all — if the event does not appear, the issue is in your integration code or API authentication.
Symptom: Email steps in a journey work correctly, but SMS steps are skipped or show errors in the journey analytics.
Cause: SMS in Customer.io requires a connected Twilio account with an active phone number. If Twilio credentials are not configured, expired, or the Twilio account has insufficient funds, SMS steps will fail silently or be skipped. Additionally, the person must have a valid phone number attribute (typically phone or a custom attribute mapped in settings) and must not have unsubscribed from SMS.
Solution: Go to Settings > Workspace Settings > SMS to verify your Twilio Account SID, Auth Token, and phone number are correctly configured. Test the Twilio connection by sending a test SMS. Check the person's profile to confirm they have a valid phone number in the expected attribute field. Verify the person's SMS subscription status is not unsubscribed. Check your Twilio account dashboard for any errors, insufficient balance, or number compliance issues.
Symptom: The Data Pipelines source shows events being received (event count is increasing), but when you look at individual person profiles in Customer.io, the events do not appear.
Cause: Data Pipelines requires that an identify call is made for a person before track events are associated with their profile. If you are sending track calls with a userId that has never been identified, the events may be received by the pipeline but not associated with a person profile. Another cause is that the Data Pipelines destination for Customer.io Journeys is not enabled or is misconfigured.
Solution: Verify that you are calling analytics.identify("user_id", { traits }) before or alongside your analytics.track() calls. Check Data Pipelines > Destinations to confirm that Customer.io Journeys is listed as a destination and is enabled. Review the destination's event delivery logs for any errors. If using reverse ETL from a warehouse, verify that the sync mapping includes both identity and event data, and check the sync schedule to ensure it has run recently.
tools
Wizlogo (wizlogo.com) platform help — a budget online logo maker (template/style-variation, marketed as "AI") plus a hub of FREE branding tools (business-name, blog-name and slogan generators, business-card maker, invoice generator, color converter, domain search). The pricing traps: the FREE logo is PERSONAL-USE-ONLY; the two cheap paid tiers are RASTER PNG/JPG only — Single (~€39.99 one-time) and Unlimited (~€3.99 per WEEK, recurring) — and VECTOR (SVG/PDF/EPS) is gated to the ~€299.99 Enterprise tier, which also bundles human designer edits and a social kit. Transparent PNG is on all paid plans. Use when making a Wizlogo logo, understanding free-vs-paid or personal-vs-commercial use, which tier unlocks vector/SVG for print, the weekly-subscription billing trap, its free name/slogan generators, or whether it has an API (UI-only — no public API, webhooks, Zapier or MCP). Do NOT use to just generate the business name (use /sales-namelix) or to compare/validate branding tools (use /sales-idea-validation).
tools
VistaPrint platform help (vistaprint.com, a Cimpress company) — the small-business design + print + digital-marketing platform: a free AI Logomaker (4 generations, 60 more after free sign-up) exporting SVG/PNG/PDF at 4000x4000 with no watermark, a free Brand Kit, business cards/flyers/signage/apparel/promo print, and a website builder. THE RIGHTS TRAP: VistaPrint states NO intellectual-property rights transfer on an AI-generated logo — you get usage rights but CANNOT register it for trademark or copyright; only its human designer service transfers full IP. Use when making a VistaPrint logo, asking if you own or can trademark it, running out of AI logo credits, printed colors not matching the screen, bleed/DPI/font file-prep rejections, or asking whether VistaPrint has an API (the consumer site does not — automation runs through the parent Cimpress Open partner-fulfilment API). Do NOT use for Vista Social scheduling (use /sales-vistasocial) or comparing logo tools market-wide (use /sales-idea-validation).
tools
Turbologo (turbologo.com) platform help — a budget AI/DIY logo maker: enter a business name + industry, pick icons and colors, and it proposes logo concepts you refine in an in-browser editor, then pay a one-time fee to download (designing is free, previews are watermarked, downloading is the paywall). Vector SVG/PDF is gated to the mid tier and up; the top tier adds a brand kit (business cards, letterheads, email signatures, social assets). Use when generating a logo in Turbologo, choosing which download tier to buy, vector SVG vs raster PNG, removing the free watermark, the time-limited edit-after-purchase window, pay-to-download pricing questions, whether an AI logo is yours to trademark, or whether Turbologo has an API to bulk-generate logos (it is UI-only — no public API, webhooks, Zapier, or MCP). Do NOT use to generate the business name (use /sales-namelix), compare or validate branding tools across the market (use /sales-idea-validation), or build wider marketing creative (use /sales-canva).
tools
Online Logo Maker (onlinelogomaker.com) platform help — a long-standing free/freemium DIY logo maker: build the mark yourself from icons, shapes, text, and fonts — MANUAL/template-based, NOT enter-a-name-get-AI-concepts. The free pack downloads a LOW-RES 300px PNG with a background; vector SVG, transparent PNG, and 2000px high-res are gated to a one-time lifetime Premium pack (not a subscription). The free tier's commercial-use rights are disputed by reviewers — clean ownership effectively needs Premium, and a shared-icon mark can be non-distinctive. Use for building/editing a logo here, free download vs Premium, vector SVG or transparent PNG, one-time pricing, commercial-use/trademark terms, near-namesake confusion (NOT LogoMaker.com / LogoMakr / Logomakerr.ai), or whether it has an API (UI-only — no API, webhooks, Zapier, MCP). Do NOT use to generate the business name (use /sales-namelix), compare branding tools across the market (use /sales-idea-validation), or build wider creative (use /sales-canva).