Awesome-omni-skill klaviyo-automation
Automate Klaviyo tasks via Rube MCP (Composio): manage email/SMS campaigns, inspect campaign messages, track tags, and monitor send jobs. Always search tools first for current schemas.
git clone https://github.com/diegosouzapw/awesome-omni-skill
T=$(mktemp -d) && git clone --depth=1 https://github.com/diegosouzapw/awesome-omni-skill "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/cli-automation/klaviyo-automation" ~/.claude/skills/diegosouzapw-awesome-omni-skill-klaviyo-automation && rm -rf "$T"
skills/cli-automation/klaviyo-automation/SKILL.mdKlaviyo Automation via Rube MCP
Automate Klaviyo email and SMS marketing operations through Composio's Klaviyo toolkit via Rube MCP.
Prerequisites
- Rube MCP must be connected (RUBE_SEARCH_TOOLS available)
- Active Klaviyo connection via
with toolkitRUBE_MANAGE_CONNECTIONSklaviyo - Always call
first to get current tool schemasRUBE_SEARCH_TOOLS
Setup
Get Rube MCP: Add
https://rube.app/mcp as an MCP server in your client configuration. No API keys needed — just add the endpoint and it works.
- Verify Rube MCP is available by confirming
respondsRUBE_SEARCH_TOOLS - Call
with toolkitRUBE_MANAGE_CONNECTIONSklaviyo - If connection is not ACTIVE, follow the returned auth link to complete Klaviyo authentication
- Confirm connection status shows ACTIVE before running any workflows
Core Workflows
1. List and Filter Campaigns
When to use: User wants to browse, search, or filter marketing campaigns
Tool sequence:
- List campaigns with channel and status filters [Required]KLAVIYO_GET_CAMPAIGNS
Key parameters:
: Campaign channel - 'email' or 'sms' (required by Klaviyo API)channel
: Additional filter string (e.g.,filter
)equals(status,"draft")
: Sort field with optionalsort
prefix for descending (e.g., '-created_at', 'name')-
: Pagination cursor for next pagepage_cursor
: Include archived campaigns (default: false)include_archived
Pitfalls:
is required; omitting it can produce incomplete or unexpected resultschannel- Pagination is mandatory for full coverage; a single call returns only one page (default ~10)
- Follow
until exhausted to get all campaignspage_cursor - Status filtering via
(e.g.,filter
) can return mixed statuses; always validateequals(status,"draft")
client-sidedata[].attributes.status - Status strings are case-sensitive and can be compound (e.g., 'Cancelled: No Recipients')
- Response shape is nested:
with status atresponse.data.datadata[].attributes.status
2. Get Campaign Details
When to use: User wants detailed information about a specific campaign
Tool sequence:
- Find campaign to get its ID [Prerequisite]KLAVIYO_GET_CAMPAIGNS
- Retrieve full campaign details [Required]KLAVIYO_GET_CAMPAIGN
Key parameters:
: Campaign ID string (e.g., '01GDDKASAP8TKDDA2GRZDSVP4H')campaign_id
: Include campaign messages in responseinclude_messages
: Include tags in responseinclude_tags
Pitfalls:
- Campaign IDs are alphanumeric strings, not numeric
andinclude_messages
add related data to the response via Klaviyo's include mechanisminclude_tags- Campaign details include audiences, send strategy, tracking options, and scheduling info
3. Inspect Campaign Messages
When to use: User wants to view the email/SMS content of a campaign
Tool sequence:
- Find campaign and its message IDs [Prerequisite]KLAVIYO_GET_CAMPAIGN
- Get message content details [Required]KLAVIYO_GET_CAMPAIGN_MESSAGE
Key parameters:
: Message ID stringid
: Sparse fieldset for message attributes (e.g., 'content.subject', 'content.from_email', 'content.body')fields__campaign__message
: Sparse fieldset for campaign attributesfields__campaign
: Sparse fieldset for template attributesfields__template
: Related resources to include ('campaign', 'template')include
Pitfalls:
- Message IDs are separate from campaign IDs; extract from campaign response
- Sparse fieldset syntax uses dot notation for nested fields: 'content.subject', 'content.from_email'
- Email messages have content fields: subject, preview_text, from_email, from_label, reply_to_email
- SMS messages have content fields: body
- Including 'template' provides the HTML/text content of the email
4. Manage Campaign Tags
When to use: User wants to view tags associated with campaigns for organization
Tool sequence:
- Get tag IDs for a campaign [Required]KLAVIYO_GET_CAMPAIGN_RELATIONSHIPS_TAGS
Key parameters:
: Campaign ID stringid
Pitfalls:
- Returns only tag IDs, not tag names/details
- Tag IDs can be used with Klaviyo's tag endpoints for full details
- Rate limit: 3/s burst, 60/m steady (stricter than other endpoints)
5. Monitor Campaign Send Jobs
When to use: User wants to check the status of a campaign send operation
Tool sequence:
- Check send job status [Required]KLAVIYO_GET_CAMPAIGN_SEND_JOB
Key parameters:
: Send job IDid
Pitfalls:
- Send job IDs are returned when a campaign send is initiated
- Job statuses indicate whether the send is queued, in progress, complete, or failed
- Rate limit: 10/s burst, 150/m steady
Common Patterns
Campaign Discovery Pattern
1. Call KLAVIYO_GET_CAMPAIGNS with channel='email' 2. Paginate through all results via page_cursor 3. Filter by status client-side for accuracy 4. Extract campaign IDs for detailed inspection
Sparse Fieldset Pattern
Klaviyo supports sparse fieldsets to reduce response size:
fields__campaign__message=['content.subject', 'content.from_email', 'send_times'] fields__campaign=['name', 'status', 'send_time'] fields__template=['name', 'html', 'text']
Pagination
- Klaviyo uses cursor-based pagination
- Check response for
in the pagination metadatapage_cursor - Pass cursor as
in next requestpage_cursor - Default page size is ~10 campaigns
- Continue until no more cursor is returned
Filter Syntax
- equals(status,"draft") - Campaigns in draft status - equals(name,"Newsletter") - Campaign named "Newsletter" - greater-than(created_at,"2024-01-01T00:00:00Z") - Created after date
Known Pitfalls
API Version:
- Klaviyo API uses versioned endpoints (e.g., v2024-07-15)
- Response schemas may change between API versions
- Tool responses follow the version configured in the Composio integration
Response Nesting:
- Data is nested:
response.data.data[].attributes - Campaign status at
data[].attributes.status - Mis-parsing the nesting yields empty or incorrect results
- Always navigate through the full path defensively
Rate Limits:
- Burst: 10/s (3/s for tag endpoints)
- Steady: 150/m (60/m for tag endpoints)
- Required scope: campaigns:read
- Implement backoff on 429 responses
Status Values:
- Status strings are case-sensitive
- Compound statuses exist (e.g., 'Cancelled: No Recipients')
- Server-side filtering may return mixed statuses; always validate client-side
Quick Reference
| Task | Tool Slug | Key Params |
|---|---|---|
| List campaigns | KLAVIYO_GET_CAMPAIGNS | channel, filter, sort, page_cursor |
| Get campaign details | KLAVIYO_GET_CAMPAIGN | campaign_id, include_messages, include_tags |
| Get campaign message | KLAVIYO_GET_CAMPAIGN_MESSAGE | id, fields__campaign__message |
| Get campaign tags | KLAVIYO_GET_CAMPAIGN_RELATIONSHIPS_TAGS | id |
| Get send job status | KLAVIYO_GET_CAMPAIGN_SEND_JOB | id |
When to Use
This skill is applicable to execute the workflow or actions described in the overview.