Agent skill

Klaviyo

by alinaqi in alinaqi/maggy

Klaviyo email/SMS marketing - profiles, events, flows, segmentation

MITAuto-check: notesMarketing & SEO

Install Klaviyo

skills CLI
$ npx skills add alinaqi/maggy --skill klaviyo -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install alinaqi/maggy klaviyo --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/alinaqi/maggy.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/klaviyo .claude/skills/klaviyo && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
klaviyo
GitHub stars
707
Token cost
~4.4k tokens
SKILL.md length
355 words
Files
1
Skills in repo
71
Repo updated
First seen
Licence
MIT

At a glance

Klaviyo email/SMS marketing - profiles, events, flows, segmentation

  • Tasks that involve Email marketing
  • SKILL.md covers Why Klaviyo, API Basics, Installation and Profiles (Customers), plus 5 more sections
  • Calls npm and pip; reaches a.klaviyo.com and static.klaviyo.com; needs KLAVIYO_PRIVATE_KEY and KLAVIYO_PUBLIC_KEY

What it does

Klaviyo is an agent skill from alinaqi/maggy. Klaviyo email/SMS marketing - profiles, events, flows, segmentation

Its SKILL.md is about 4.4k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It sits in Marketing & SEO, covering Email marketing. The repository describes itself as: What started as an opinionated Claude Code setup kit is now an autonomous AI engineering command center. The licence is MIT.

When your agent uses it

  • Tasks that involve Email marketing

Example prompts

  • “/klaviyo”

Requirements

  • Python 3
  • Node.js
  • A credential in KLAVIYO_PRIVATE_KEY

What it can do on your machine

Read from SKILL.md and the folder at commit 72a456e. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • npm
    • pip

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    Hosts in commands or code, which the agent is likely to contact:

    • a.klaviyo.com
    • static.klaviyo.com

    Also links to:

    • developers.klaviyo.com

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names these keys or tokens, usually read from environment variables:

    • KLAVIYO_PRIVATE_KEY
    • KLAVIYO_PUBLIC_KEY
    • WEBHOOK_SECRET
    • KLAVIYO_WEBHOOK_SECRET

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Klaviyo loads about 4.4k tokens when it runs. Until then it costs about 19 tokens; SKILL.md has 355 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~19
When it runs · the whole SKILL.md, loaded when a task matches
~4.4k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check: notes

The automated check noted patterns worth knowing about, such as sudo or a known installer.

  • NoteMentions a .env fileSKILL.md:760
    # .env

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from alinaqi/maggy at commit 72a456e, republished under its MIT licence (© alinaqi). 355 words, ~4,397 tokens.

Download SKILL.mdSave it as .claude/skills/klaviyo/SKILL.md (or your agent's skills folder).
name
klaviyo
description
Klaviyo email/SMS marketing - profiles, events, flows, segmentation
when-to-use
When integrating Klaviyo for email/SMS marketing
user-invocable
false
effort
medium

Klaviyo E-Commerce Marketing Skill

For integrating Klaviyo email/SMS marketing - customer profiles, event tracking, campaigns, flows, and segmentation.

Sources: Klaviyo API Docs | API Reference


Why Klaviyo

FeatureBenefit
E-commerce NativeBuilt for online stores, deep integrations
Event-BasedTrigger flows from any customer action
SegmentationAdvanced filtering on behavior + properties
Email + SMSUnified platform for both channels
AnalyticsRevenue attribution per campaign

API Basics

Base URLs
TypeURL
Server-side (Private)https://a.klaviyo.com/api
Client-side (Public)https://a.klaviyo.com/client
Authentication
typescript
// Server-side: Private API Key
const headers = {
  "Authorization": "Klaviyo-API-Key pk_xxxxxxxxxxxxxxxxxxxxxxxx",
  "Content-Type": "application/json",
  "revision": "2024-10-15",  // API version
};

// Client-side: Public API Key (6 characters)
const publicKey = "XXXXXX";  // Company ID
// Use as query param: ?company_id=XXXXXX
API Key Scopes
ScopeAccess
Read-onlyView data only
FullRead + write (default)
CustomSpecific permissions

Installation

Node.js
bash
npm install klaviyo-api
typescript
// lib/klaviyo.ts
import { ApiClient, EventsApi, ProfilesApi, ListsApi } from "klaviyo-api";

const client = new ApiClient();
client.setApiKey(process.env.KLAVIYO_PRIVATE_KEY!);

export const eventsApi = new EventsApi(client);
export const profilesApi = new ProfilesApi(client);
export const listsApi = new ListsApi(client);
Python
bash
pip install klaviyo-api
python
# lib/klaviyo.py
from klaviyo_api import KlaviyoAPI

klaviyo = KlaviyoAPI(
    api_key=os.environ["KLAVIYO_PRIVATE_KEY"],
    max_delay=60,
    max_retries=3
)
Direct HTTP (Any Language)
typescript
// lib/klaviyo.ts
const KLAVIYO_BASE_URL = "https://a.klaviyo.com/api";

async function klaviyoRequest(
  endpoint: string,
  method: "GET" | "POST" | "PATCH" | "DELETE" = "GET",
  body?: object
) {
  const response = await fetch(`${KLAVIYO_BASE_URL}${endpoint}`, {
    method,
    headers: {
      Authorization: `Klaviyo-API-Key ${process.env.KLAVIYO_PRIVATE_KEY}`,
      "Content-Type": "application/json",
      revision: "2024-10-15",
    },
    body: body ? JSON.stringify(body) : undefined,
  });

  if (!response.ok) {
    const error = await response.json();
    throw new Error(`Klaviyo API error: ${JSON.stringify(error)}`);
  }

  return response.json();
}

Profiles (Customers)

Create/Update Profile
typescript
// Upsert profile (create or update)
async function upsertProfile(data: ProfileInput) {
  return klaviyoRequest("/profiles", "POST", {
    data: {
      type: "profile",
      attributes: {
        email: data.email,
        phone_number: data.phone, // E.164 format: +1234567890
        first_name: data.firstName,
        last_name: data.lastName,
        properties: {
          // Custom properties
          lifetime_value: data.ltv,
          plan: data.plan,
          signup_source: data.source,
        },
        location: {
          city: data.city,
          region: data.state,
          country: data.country,
          zip: data.zip,
        },
      },
    },
  });
}
python
# Python
def upsert_profile(data):
    return klaviyo.Profiles.create_or_update_profile({
        "data": {
            "type": "profile",
            "attributes": {
                "email": data["email"],
                "first_name": data["first_name"],
                "last_name": data["last_name"],
                "properties": {
                    "plan": data.get("plan"),
                }
            }
        }
    })
Get Profile
typescript
async function getProfileByEmail(email: string) {
  const response = await klaviyoRequest(
    `/profiles?filter=equals(email,"${email}")`
  );
  return response.data[0];
}

async function getProfileById(profileId: string) {
  return klaviyoRequest(`/profiles/${profileId}`);
}
Update Profile Properties
typescript
async function updateProfileProperties(
  profileId: string,
  properties: Record<string, any>
) {
  return klaviyoRequest(`/profiles/${profileId}`, "PATCH", {
    data: {
      type: "profile",
      id: profileId,
      attributes: {
        properties,
      },
    },
  });
}

// Usage
await updateProfileProperties("profile_id", {
  last_purchase_date: new Date().toISOString(),
  total_orders: 5,
  vip_status: true,
});

Events (Tracking)

Track Event (Server-Side)
typescript
async function trackEvent(data: EventInput) {
  return klaviyoRequest("/events", "POST", {
    data: {
      type: "event",
      attributes: {
        profile: {
          data: {
            type: "profile",
            attributes: {
              email: data.email,
              // or phone_number, or external_id
            },
          },
        },
        metric: {
          data: {
            type: "metric",
            attributes: {
              name: data.eventName,
            },
          },
        },
        properties: data.properties,
        value: data.value, // For revenue tracking
        unique_id: data.uniqueId, // Deduplication
        time: data.timestamp || new Date().toISOString(),
      },
    },
  });
}
Common E-Commerce Events
typescript
// Viewed Product
await trackEvent({
  email: customer.email,
  eventName: "Viewed Product",
  properties: {
    ProductID: product.id,
    ProductName: product.name,
    ProductURL: product.url,
    ImageURL: product.image,
    Price: product.price,
    Categories: product.categories,
  },
});

// Added to Cart
await trackEvent({
  email: customer.email,
  eventName: "Added to Cart",
  properties: {
    ProductID: product.id,
    ProductName: product.name,
    Quantity: quantity,
    Price: product.price,
    CartTotal: cart.total,
    ItemNames: cart.items.map(i => i.name),
  },
  value: product.price * quantity,
});

// Started Checkout
await trackEvent({
  email: customer.email,
  eventName: "Started Checkout",
  properties: {
    CheckoutURL: checkout.url,
    ItemCount: cart.itemCount,
    Categories: cart.categories,
    ItemNames: cart.items.map(i => i.name),
  },
  value: cart.total,
});

// Placed Order
await trackEvent({
  email: customer.email,
  eventName: "Placed Order",
  properties: {
    OrderId: order.id,
    ItemCount: order.itemCount,
    Categories: order.categories,
    ItemNames: order.items.map(i => i.name),
    Items: order.items.map(i => ({
      ProductID: i.productId,
      ProductName: i.name,
      Quantity: i.quantity,
      Price: i.price,
      ImageURL: i.image,
      ProductURL: i.url,
    })),
    BillingAddress: order.billingAddress,
    ShippingAddress: order.shippingAddress,
  },
  value: order.total,
  uniqueId: order.id, // Prevent duplicate orders
});

// Fulfilled Order
await trackEvent({
  email: customer.email,
  eventName: "Fulfilled Order",
  properties: {
    OrderId: order.id,
    TrackingNumber: fulfillment.trackingNumber,
    TrackingURL: fulfillment.trackingUrl,
    Carrier: fulfillment.carrier,
  },
});

// Cancelled Order
await trackEvent({
  email: customer.email,
  eventName: "Cancelled Order",
  properties: {
    OrderId: order.id,
    Reason: cancellation.reason,
  },
  value: -order.total, // Negative value for refunds
});
Client-Side Tracking (JavaScript)
html
<!-- Add to your site -->
<script async src="https://static.klaviyo.com/onsite/js/klaviyo.js?company_id=XXXXXX"></script>

<script>
  // Identify user
  klaviyo.identify({
    email: "customer@example.com",
    first_name: "John",
    last_name: "Doe",
  });

  // Track event
  klaviyo.track("Viewed Product", {
    ProductID: "prod_123",
    ProductName: "Blue T-Shirt",
    Price: 29.99,
  });

  // Track with value
  klaviyo.track("Added to Cart", {
    ProductID: "prod_123",
    ProductName: "Blue T-Shirt",
    Price: 29.99,
    $value: 29.99,  // Revenue tracking
  });
</script>

Lists & Segments

Add Profile to List
typescript
async function addToList(listId: string, emails: string[]) {
  return klaviyoRequest(`/lists/${listId}/relationships/profiles`, "POST", {
    data: emails.map(email => ({
      type: "profile",
      attributes: { email },
    })),
  });
}

// By profile ID
async function addProfileToList(listId: string, profileId: string) {
  return klaviyoRequest(`/lists/${listId}/relationships/profiles`, "POST", {
    data: [{ type: "profile", id: profileId }],
  });
}
Remove from List
typescript
async function removeFromList(listId: string, profileId: string) {
  return klaviyoRequest(
    `/lists/${listId}/relationships/profiles`,
    "DELETE",
    {
      data: [{ type: "profile", id: profileId }],
    }
  );
}
Get List Members
typescript
async function getListMembers(listId: string, cursor?: string) {
  const params = new URLSearchParams({
    "page[size]": "100",
  });
  if (cursor) {
    params.set("page[cursor]", cursor);
  }

  return klaviyoRequest(`/lists/${listId}/profiles?${params}`);
}
Create List
typescript
async function createList(name: string) {
  return klaviyoRequest("/lists", "POST", {
    data: {
      type: "list",
      attributes: { name },
    },
  });
}

Campaigns

Get Campaigns
typescript
async function getCampaigns(status?: "draft" | "scheduled" | "sent") {
  const params = new URLSearchParams();
  if (status) {
    params.set("filter", `equals(status,"${status}")`);
  }

  return klaviyoRequest(`/campaigns?${params}`);
}
Get Campaign Performance
typescript
async function getCampaignMetrics(campaignId: string) {
  return klaviyoRequest(
    `/campaign-recipient-estimations/${campaignId}`,
    "GET"
  );
}

Flows (Automations)

Get Flows
typescript
async function getFlows() {
  return klaviyoRequest("/flows");
}

async function getFlowById(flowId: string) {
  return klaviyoRequest(`/flows/${flowId}`);
}
Common Flow Triggers
Flow TypeTrigger Event
Welcome SeriesAdded to List
Abandoned CartAdded to Cart + No Purchase
Browse AbandonViewed Product + No Cart
Post-PurchasePlaced Order
WinbackNo Order in X Days
Review RequestFulfilled Order

Webhooks

Create Webhook
typescript
async function createWebhook(data: WebhookInput) {
  return klaviyoRequest("/webhooks", "POST", {
    data: {
      type: "webhook",
      attributes: {
        name: data.name,
        endpoint_url: data.url,
        secret_key: data.secret,
        topics: data.topics, // e.g., ["profile.created", "event.created"]
      },
    },
  });
}
Webhook Topics
TopicTrigger
profile.createdNew profile created
profile.updatedProfile properties changed
profile.mergedProfiles merged
event.createdNew event tracked
list.member.addedProfile added to list
list.member.removedProfile removed from list
Verify Webhook Signature
typescript
import crypto from "crypto";

function verifyKlaviyoWebhook(
  payload: string,
  signature: string,
  secret: string
): boolean {
  const expectedSignature = crypto
    .createHmac("sha256", secret)
    .update(payload)
    .digest("base64");

  return crypto.timingSafeEqual(
    Buffer.from(signature),
    Buffer.from(expectedSignature)
  );
}

// Express handler
app.post("/webhooks/klaviyo", (req, res) => {
  const signature = req.headers["klaviyo-webhook-signature"] as string;

  if (!verifyKlaviyoWebhook(JSON.stringify(req.body), signature, WEBHOOK_SECRET)) {
    return res.status(401).json({ error: "Invalid signature" });
  }

  const { type, data } = req.body;

  switch (type) {
    case "profile.created":
      handleNewProfile(data);
      break;
    case "event.created":
      handleNewEvent(data);
      break;
  }

  res.status(200).json({ received: true });
});

Show full SKILL.md (142 more words)Show less

Rate Limits

WindowLimit
Burst75 requests/second
Steady700 requests/minute
Handle Rate Limiting
typescript
async function klaviyoRequestWithRetry(
  endpoint: string,
  method: "GET" | "POST" | "PATCH" | "DELETE" = "GET",
  body?: object,
  retries = 3
): Promise<any> {
  for (let attempt = 0; attempt < retries; attempt++) {
    const response = await fetch(`${KLAVIYO_BASE_URL}${endpoint}`, {
      method,
      headers: {
        Authorization: `Klaviyo-API-Key ${process.env.KLAVIYO_PRIVATE_KEY}`,
        "Content-Type": "application/json",
        revision: "2024-10-15",
      },
      body: body ? JSON.stringify(body) : undefined,
    });

    if (response.status === 429) {
      const retryAfter = parseInt(response.headers.get("Retry-After") || "5");
      await new Promise(r => setTimeout(r, retryAfter * 1000));
      continue;
    }

    if (!response.ok) {
      throw new Error(`Klaviyo error: ${response.status}`);
    }

    return response.json();
  }

  throw new Error("Max retries exceeded");
}

Pagination

typescript
async function getAllProfiles() {
  const profiles = [];
  let cursor: string | undefined;

  do {
    const params = new URLSearchParams({ "page[size]": "100" });
    if (cursor) {
      params.set("page[cursor]", cursor);
    }

    const response = await klaviyoRequest(`/profiles?${params}`);
    profiles.push(...response.data);

    cursor = response.links?.next
      ? new URL(response.links.next).searchParams.get("page[cursor]")
      : undefined;
  } while (cursor);

  return profiles;
}

Filtering & Sorting

typescript
// Filter by date
const recentEvents = await klaviyoRequest(
  `/events?filter=greater-than(datetime,2024-01-01T00:00:00Z)`
);

// Filter by property
const vipProfiles = await klaviyoRequest(
  `/profiles?filter=equals(properties.vip_status,true)`
);

// Multiple filters (AND)
const filtered = await klaviyoRequest(
  `/profiles?filter=and(equals(properties.plan,"pro"),greater-than(properties.ltv,1000))`
);

// Sorting
const sorted = await klaviyoRequest(
  `/profiles?sort=-created`  // Descending by created date
);

// Sparse fieldsets (only return specific fields)
const sparse = await klaviyoRequest(
  `/profiles?fields[profile]=email,first_name,properties`
);

Integration Patterns

E-Commerce Order Sync
typescript
// After order is placed
async function syncOrderToKlaviyo(order: Order) {
  // 1. Upsert customer profile
  await upsertProfile({
    email: order.customerEmail,
    firstName: order.customerFirstName,
    lastName: order.customerLastName,
    phone: order.customerPhone,
  });

  // 2. Update lifetime metrics
  await updateProfileProperties(
    await getProfileIdByEmail(order.customerEmail),
    {
      last_order_date: new Date().toISOString(),
      total_orders: order.customerOrderCount,
      lifetime_value: order.customerLifetimeValue,
    }
  );

  // 3. Track order event
  await trackEvent({
    email: order.customerEmail,
    eventName: "Placed Order",
    properties: {
      OrderId: order.id,
      Items: order.items,
      // ... other properties
    },
    value: order.total,
    uniqueId: order.id,
  });
}
Subscription Status Sync
typescript
// When subscription changes
async function syncSubscriptionStatus(user: User, status: string) {
  await updateProfileProperties(user.klaviyoProfileId, {
    subscription_status: status,
    subscription_plan: user.plan,
    subscription_updated_at: new Date().toISOString(),
  });

  await trackEvent({
    email: user.email,
    eventName: `Subscription ${status}`,
    properties: {
      plan: user.plan,
      mrr: user.mrr,
    },
    value: status === "cancelled" ? -user.mrr : user.mrr,
  });
}

Environment Variables

bash
# .env
KLAVIYO_PRIVATE_KEY=pk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
KLAVIYO_PUBLIC_KEY=XXXXXX
KLAVIYO_WEBHOOK_SECRET=your_webhook_secret

Add to credentials.md:

python
'KLAVIYO_PRIVATE_KEY': r'pk_[a-f0-9]{32}',
'KLAVIYO_PUBLIC_KEY': r'[A-Z0-9]{6}',

Checklist

Setup
  • Klaviyo account created
  • Private API key generated
  • Public API key noted (company ID)
  • API revision set in headers
Integration
  • Profile sync on signup/update
  • Key events tracked (view, cart, order)
  • Order events include Items array
  • Revenue tracked with $value
  • Unique IDs for deduplication
Testing
  • Test profile creation
  • Test event tracking
  • Verify events in Klaviyo dashboard
  • Test webhook delivery
  • Test rate limit handling

Anti-Patterns

  • Missing email/phone - Every profile needs at least one identifier
  • Duplicate events - Use unique_id for orders/transactions
  • Missing Items array - Required for product recommendations
  • Client-side only - Server-side tracking is more reliable
  • Ignoring rate limits - Implement exponential backoff
  • Hardcoded API keys - Use environment variables
  • Missing revenue tracking - Include $value for ROI attribution

© alinaqi, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in skills/klaviyo of alinaqi/maggy.

Open the folder on GitHubat commit 72a456e

Compare with similar skills

Klaviyo next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Klaviyo compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Klaviyo this skillalinaqi/maggy707—~4.4kAutomated safety check: NotesMIT
Email Generationextruct-ai/gtm-skills109—~1.7kAutomated safety check: PassNone
CLI Anything MailchimpHKUDS/CLI-Anything52k—~2.4kAutomated safety check: PassApache-2.0
56 Retargeting Plan Globalminhnv0807/ai-business-skills609—~2.8kAutomated safety check: PassMIT
29 Xuat Khau B2bminhnv0807/ai-business-skills609—~2.9kAutomated safety check: PassMIT
Suede EmailsJasonColapietro/suede-creator-skills127—~2.5kAutomated safety check: PassMIT

Similar skills

  • Email Generation

    extruct-ai/gtm-skills

    Render a cold-outreach email sequence from a fixed template set and a contact CSV whose input fields are already filled.

    109 GitHub stars~1.7k tokensUpdated 12 days ago
    Marketing & SEOAuto-check passed
  • CLI Anything Mailchimp

    HKUDS/CLI-Anything

    CLI harness for the Mailchimp Marketing API v3.0 — 303 commands across 30 resource groups (lists, campaigns, reports, automations, ecommerce, templates, and more).

    52k GitHub stars~2.4k tokensUpdated 19 days ago
    Marketing & SEOAuto-check passed
  • 56 Retargeting Plan Global

    minhnv0807/ai-business-skills

    A skill your agent uses when warm audiences need a plan — retargeting tiers by intent and recency, a different message per tier, frequency caps, attribution windows, lookalike seeds, exclusion…

    609 GitHub stars~2.8k tokensUpdated 29 days ago
    Marketing & SEOAuto-check passed
  • 29 Xuat Khau B2b

    minhnv0807/ai-business-skills

    Dung khi doanh nghiep Viet Nam muon ban ra NUOC NGOAI theo duong B2B — ho so nang luc tieng Anh, chon thi truong muc tieu, pitch deck cho buyer, email chao hang quoc te, chuan bi hoi cho thuong mai…

    609 GitHub stars~2.9k tokensUpdated 29 days ago
    Marketing & SEOAuto-check passed
  • Suede Emails

    JasonColapietro/suede-creator-skills

    Suede-owned lifecycle email design for welcome, onboarding, nurture, re-engagement, post-purchase, and trigger-based sequences.

    127 GitHub stars~2.5k tokensUpdated yesterday
    Marketing & SEOAuto-check passed
  • Sales Mastery

    aAAaqwq/AGI-Super-Team

    World-class autonomous sales and revenue skill system. An agent skill from aAAaqwq/AGI-Super-Team.

    105 GitHub starsUsed in 1 repo~4.5k tokens
    Marketing & SEOAuto-check passed

More from alinaqi/maggy

All 71 skills in this repo
  • Aeo Optimization

    alinaqi/maggy

    AI Engine Optimization - semantic triples, page templates, content clusters for AI citations

    707 GitHub stars~3.7k tokensUpdated 17 days ago
    Auto-check passed
  • Agent Teams

    alinaqi/maggy

    Claude Code Agent Teams - default team-based development with strict TDD pipeline enforcement

    707 GitHub stars~5k tokensUpdated 17 days ago
    Auto-check: notes
  • AI Models

    alinaqi/maggy

    Latest AI models reference - Claude, OpenAI, Gemini, Eleven Labs, Replicate

    707 GitHub stars~4.1k tokensUpdated 17 days ago
    Auto-check passed
  • Android Java

    alinaqi/maggy

    Android Java development with MVVM, ViewBinding, and Espresso testing

    707 GitHub stars~3.9k tokensUpdated 17 days ago
    Auto-check: notes
  • Android Kotlin

    alinaqi/maggy

    Android Kotlin development with Coroutines, Jetpack Compose, Hilt, and MockK testing

    707 GitHub stars~3k tokensUpdated 17 days ago
    Auto-check passed
  • Autonomous Testing

    alinaqi/maggy

    AI-driven testing agent that auto-discovers, generates, executes, evaluates, and fixes tests for any project type

    707 GitHub stars~1.1k tokensUpdated 17 days ago
    Auto-check passed

Questions about Klaviyo

What does Klaviyo do?

Klaviyo email/SMS marketing - profiles, events, flows, segmentation. Klaviyo is an agent skill from alinaqi/maggy.

When should I use Klaviyo?

Klaviyo fits situations like: tasks that involve Email marketing.

How do I install Klaviyo in Claude Code?

Run `npx skills add alinaqi/maggy --skill klaviyo -a claude-code`. Or copy the skill folder (skills/klaviyo in alinaqi/maggy) into .claude/skills/klaviyo in your project. Claude Code loads it when a task matches its description.

How do I install Klaviyo in Codex?

Run `npx skills add alinaqi/maggy --skill klaviyo -a codex`. Or copy the skill folder (skills/klaviyo in alinaqi/maggy) into .agents/skills/klaviyo in your project. Codex loads it when a task matches its description.

Can I use Klaviyo in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add alinaqi/maggy --skill klaviyo -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/klaviyo, .gemini/skills/klaviyo, .github/skills/klaviyo and .opencode/skills/klaviyo in your project.

What does Klaviyo need to run?

Going by SKILL.md and its folder, Klaviyo needs the command-line tools its instructions call (npm and pip) and credentials named KLAVIYO_PRIVATE_KEY, KLAVIYO_PUBLIC_KEY, WEBHOOK_SECRET and KLAVIYO_WEBHOOK_SECRET. Our summary lists: Python 3; Node.js; A credential in KLAVIYO_PRIVATE_KEY.

Does Klaviyo access the network?

SKILL.md names 3 domains. In commands or code: a.klaviyo.com and static.klaviyo.com; the agent is likely to contact these when it follows the instructions. As links in the text: developers.klaviyo.com. This is read from the text; nothing was executed.

Is Klaviyo safe to install?

Our automated static check of SKILL.md found notes only (mentions a .env file), nothing it rates as a warning. It is not a guarantee. Review the folder before installing.

What licence does Klaviyo use?

Klaviyo is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Klaviyo use?

About 4.4k tokens (SKILL.md is roughly 18k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Klaviyo?

Skills that share tags, products or a category with Klaviyo: Email Generation (extruct-ai/gtm-skills, 109 stars), CLI Anything Mailchimp (HKUDS/CLI-Anything, 52k stars), 56 Retargeting Plan Global (minhnv0807/ai-business-skills, 609 stars) and 29 Xuat Khau B2b (minhnv0807/ai-business-skills, 609 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Klaviyo?

alinaqi (a GitHub user) maintains it in alinaqi/maggy, which has 707 GitHub stars. The repository holds 71 skills in this directory. The repository was last updated on September 24, 2026.

Source: alinaqi/maggy on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.