name: klaviyo-profile
description: Manage Klaviyo profiles in bulk — subscribe/unsubscribe, suppression, GDPR/CCPA deletion requests, list hygiene operations, profile property updates. Trigger when the user says "unsubscribe these profiles", "GDPR delete", "import list", "suppress these emails", "update customer properties", "clean the list", "remove fake signups".
Brand scoping
Outputs live under ~/notes/Klaviyo/<brand>/<subfolder>/, where <brand> is resolved at run time from the connected Klaviyo account's organizationName attribute (via mcp__claude_ai_Klaviyo__klaviyo_get_account_details). For ExampleBrand, this resolves to ExampleBrand. If multiple brands are connected, ask Will which brand the current run is for.
/klaviyo-profile
Bulk subscriber + suppression management. Klaviyo has MCP coverage for create/update/subscribe/unsubscribe — this skill handles the bulk operations cleanly with audit logs so nothing is lost.
Operations supported
| Operation | MCP tool | Bulk safe |
|---|
| Create profile | klaviyo_create_profile | Yes |
| Update profile properties | klaviyo_update_profile | Yes |
| Subscribe to marketing | klaviyo_subscribe_profile_to_marketing | Yes |
| Unsubscribe from marketing | klaviyo_unsubscribe_profile_from_marketing | Yes |
| Get profile | klaviyo_get_profile | One at a time |
| List profiles | klaviyo_get_profiles | Pageable |
Flow
- Parse the operation — type (subscribe / unsubscribe / suppress / update-property / delete / list-import), targets (list of emails, segment id, file path, or filter criteria), reason (audit trail).
- Confirm the scope — show the user how many profiles will be affected and a sample of 3-5 emails. Wait for explicit
confirm before any mutation. Mutations are bulk-destructive — never auto-fire. - Run the operation — sequential MCP calls with progress feedback every 10 profiles. Rate-limited (Klaviyo cap: ~700 req/min for most write endpoints — stay below 10 req/sec to be safe).
- Log the audit trail — write
~/notes/Klaviyo/<brand>/profiles/YYYY-MM-DD-[op]-[count].md with operation type, scope, reason, full email list, completion status per profile, errors. - Print summary — total succeeded, total failed, link to the audit log.
Operation patterns
Bulk unsubscribe (e.g. complaint cleanup)
- Source: list of emails from a CSV or pasted list.
- Action:
klaviyo_unsubscribe_profile_from_marketing for each. - Audit: every email + status + timestamp.
- Confirmation gate: show count + sample + reason before firing.
Bulk suppression (e.g. hard-bounce cleanup, post-/klaviyo-deliverability)
- Source: a segment of disengaged profiles (e.g.
no_engagement_90d). - Action: unsubscribe + add suppression tag.
- Reason field required ("90-day inactive sunset" / "hard bounce list" / etc.).
List import
- Source: CSV path.
- Action: parse CSV → for each row,
klaviyo_create_profile (or klaviyo_update_profile if exists), then klaviyo_subscribe_profile_to_marketing IF the source has opt-in consent. - Consent gate: refuse the import if the user can't confirm where the opt-in came from. Importing non-consented lists tanks deliverability AND violates CAN-SPAM/GDPR.
- Required fields: email; optional: first name, last name, source, signup date, tags, custom properties.
Property update (e.g. tag VIPs)
- Source: segment OR explicit profile list.
- Action:
klaviyo_update_profile setting a custom property. - Use cases: tagging high-LTV, marking lead source, adding compliance flags.
GDPR / CCPA deletion
- Source: single profile or list of emails.
- Action: profile deletion via Klaviyo's REST API (MCP doesn't expose delete directly — fallback to manual or scripted curl with API key).
- Audit: critical — log request date, requestor, completion date, all profiles deleted.
- Confirmation gate: REQUIRES "I confirm — delete permanently" exact phrase; no shortcuts.
Audit log structure
# Klaviyo Profile Operation — [op] — YYYY-MM-DD HH:MM
**Operation:** subscribe / unsubscribe / suppress / property-update / delete / import
**Reason:** ...
**Source:** segment id / CSV path / explicit list
**Scope:** N profiles
**Initiated by:** Will (or whoever ran the skill)
## Profiles affected
| Email | Status | Notes |
|---|---|---|
| ... | success | ... |
| ... | failed | error: ... |
## Errors
- ...
## Reversibility
- Can this be undone? Yes / No / Partial
- How: ...
Hard rules — never break
- Never run a destructive operation without explicit `confirm` — the confirmation gate is non-negotiable. "Looks good" or "yes" alone is not enough for delete operations; require "I confirm — delete permanently" verbatim for permanent ops.
- Never import a list without consent confirmation — ask where the opt-in came from before any subscribe operation on imported emails.
- Never echo cookie values, API keys, or full email lists in the chat output — log to file, show count + sample only.
- Always log to the audit trail — even on failure. Bulk ops need a record.
What this skill does NOT do
- Does not edit Klaviyo settings (account-level config, sender domains) — that's manual in the dashboard.
- Does not modify subscription preferences at the granular consent level (SMS vs email vs push) without explicit per-channel request.
- Does not de-duplicate profiles automatically — surface duplicates, let Will decide.
Failure modes
- Rate-limited by Klaviyo → back off automatically, resume from last completed profile.
- MCP not connected / wrong brand → stop, tell Will, don't fabricate completions.
- CSV missing email column → stop, ask for the correct file or column mapping.
- One profile fails mid-bulk → log the error, continue with the rest, surface failures at the end.