MCPInstall

revenuecat-audiences

Use before sharing a link to a filtered customer list or audience, and when identifying, filtering, or ranking the user's customers (a segment, who they are, a product or duration, spend, renewals, status, country, attribution).

Installs
198
Last 24h
—
Trending rank
—
Security
Not audited

Install

Works with every agent the skills CLI supports.

npx skills add https://github.com/revenuecat/ai-toolkit --skill revenuecat-audiences
  1. 01

    Install

    Run the command in your project. The CLI asks which agents to install for.

  2. 02

    Describe the task

    Ask your agent for something this skill covers. It loads revenuecat-audiences automatically when relevant.

  3. 03

    Review the result

    The agent follows the SKILL.md steps, scripts and references bundled with the skill.

SKILL.md

The instructions your agent reads when the skill is triggered.

Audience filters and dashboard links

Use Audiences to filter the user's customers and to share a dashboard link to that set. Filters select the segment; sort_by / sort_direction on preview-audience order the returned sample.

There is no first-class CLI command for audiences. Do not tell the user RevenueCat cannot filter or segment customers.

Identifying, filtering, or ranking customers

Audiences filter on the fields below, including:

  • Product and duration — latestProduct, allPurchasedProductIds, latestPurchasedOffering, entitlements, offers
  • Spend and renewals — totalSpent (filter, and sort_by: total_spent), totalRenewals (filter only; there is no renewal sort)
  • Subscription state — status, trial, auto-renew intent, ownership
  • Store, platform, and country — platform, latestStore, country, storefront
  • Dates — first seen, purchases, renewals, expiration, trial, cancellation
  • Attribution and experiments — media source, campaign, ad group, keywords, price experiment
  • Identity and custom attributes — app user ID, email, locale, customAttribute:{key}

Map the question onto those fields, filter, then read a sample.

  1. Fetch project-specific values with get-audience-filter-options for any field marked project-specific that the question uses (project_id, fields).
  2. Call preview-audience with project_id and body.rules in the filter rule shape (for a saved audience from list-audiences, pass body.audience_uuid instead). It is read-only and saves nothing. Do not create-audience just to inspect a segment.
  3. To rank or name a superlative, pass sort_by (status, latest_auto_renew_intent, first_seen_at, last_seen_at, total_spent) and sort_direction (asc default, or desc) as top-level parameters, not inside body. sort_by: total_spent with sort_direction: desc returns the highest spenders first, so the first customer_sample row is the top spender. The sample is capped (typically 50): it is the top or bottom matches, not every customer.
  4. Answer "how many" from stats (total_customers, active_subscriptions, active_trials, total_revenue in currency), never from the sample size. When stats.is_approximate is true, give counts and revenue as approximate ("about 6,400 customers").
  5. Name customers only from fields customer_sample returned (app_user_id, email, status, total_spent, latest_product_name, first/last seen). Without sort_by the sample is unordered: say it is a sample of matches, not a ranking.
  6. totalRenewals is a filter only, not a sort_by value or a sample column. Filter on a high threshold and report the matches; do not invent a renewal count or claim a unique maximum.
  7. Share the dashboard link. The preview-audience result for body.rules includes a line starting "Dashboard URL for this result"; link that exact URL. Build one yourself (constructing a link) only when no tool result gave you a URL.

Constructing a link

Use this only when no tool result gave you a "Dashboard URL for this result" line. Two shapes: a filtered all-customers link for ad-hoc exploration, and a saved-audience link after create-audience.

  1. Get the project ID from list-projects. For dashboard URLs, strip the proj prefix.
  2. Pick fields and operators from the field tables. Do not invent field or operator names.
  3. For project-specific fields, fetch valid values with get-audience-filter-options first.
  4. Assemble the rule JSON: one group per OR-branch, conditions inside a group for AND, values encoded per value formats.
  5. Serialize and URL-encode the rule with a short script (see encoding the rule) — do not encode by hand.
  6. Append it as the filters query param on https://app.revenuecat.com/projects/{project_id}/customer-lists/all-customers.

URL format

https://app.revenuecat.com/projects/{project_id}/customer-lists/all-customers?filters={encoded_rule}
  • {project_id} — short hex ID from list-projects with proj stripped.
  • Filters only work on the all-customers list. The unfiltered Audiences home is /projects/{project_id}/customer-lists.

Linking to a saved audience

The create-audience and get-audience results include a "Dashboard URL for this result" line; link that exact URL. If you only have list-audiences output, link with customer_list_id, the field returned alongside id:

https://app.revenuecat.com/projects/{project_id}/customer-lists/{customer_list_id}

An audience's id (aud…) and its customer_list_id (list…) are different identifiers. The dashboard route only resolves customer_list_id; an aud… id in that slot renders "Audience not found".

Correct:

https://app.revenuecat.com/projects/56965ae1/customer-lists/list7c1f0a2b93

Wrong (the audience id instead of the customer_list_id):

https://app.revenuecat.com/projects/56965ae1/customer-lists/audf0269cdf3df84dd2

Do not add a filters param to a saved-audience link — the audience carries its own rules. If the response has no customer_list_id, link to /customer-lists and name the audience rather than guessing an id.

Offering to save the filtered view

A filtered all-customers link is ad-hoc — nothing about it is saved. Say so in one short sentence when you share one, and offer to save it: "This view isn't saved — want me to save it as an audience so you can find it later?"

Offer once per conversation. If they accept, call create-audience with the same rule you built for the link, then link to it. Do not offer when the link is already to a saved audience.

The filter rule

The filters value is URL-encoded JSON with this shape:

{
  "groups": [
    {
      "conditions": [{ "field": "platform", "operator": "is", "value": "android" }]
    }
  ]
}
  • Conditions within a group combine with AND.
  • Groups combine with OR.
  • value is always a JSON string — booleans as "true"/"false", numbers as "42", lists as a comma-separated string, date ranges and relative dates as stringified JSON (see value formats).

Correct (compact JSON, whole value URL-encoded):

?filters=%7B%22groups%22%3A%5B%7B%22conditions%22%3A%5B%7B%22field%22%3A%22platform%22%2C%22operator%22%3A%22is%22%2C%22value%22%3A%22android%22%7D%5D%7D%5D%7D

Wrong (raw JSON, spaces, unencoded quotes/braces):

?filters={"groups": [{"conditions": [...]}]}

Encoding the rule

import json
from urllib.parse import quote

rule = {
    "groups": [
        {"conditions": [{"field": "platform", "operator": "is", "value": "android"}]},
    ]
}

print(quote(json.dumps(rule, separators=(",", ":")), safe=""))

Fields

The Audiences preview table shows only Customer, Subscription Status, Auto-Renewal Status, Spent, and Latest Purchase. Other attributes appear in the CSV from Export all, or on a customer's profile.

Use these exact field strings. See Audiences.

Text fields

Operators: is, isNot, contains, doesNotContain, isEmpty, isNotEmpty.

FieldMeaning
customerIdApp user ID
originalAppUserIdOriginal app user ID
emailEmail
phoneNumberPhone number
localeLocale
appVersionApp version
sdkVersionSDK version
platformVersionPlatform (OS) version
projectIdProject ID (e.g. proj1ab2c3d4)
projectNameProject name
appConfigIdApp ID (e.g. app1ab2c3d4)
appConfigNameApp name
idfaIDFA
idfvIDFV
gpsAdIdGPS ad ID
latestPurchasedOfferingLatest purchased offering
latestOfferLatest offer identifier
latestEntitlementsLatest entitlement identifiers
allPurchasedProductIdsAll purchased product identifiers

Enum fields

Operators: is, isNot, isAnyOf, isNotAnyOf, isEmpty, isNotEmpty.

FieldValues
platformiOS, android, web, macOS, amazon, roku, tvOS, visionOS, watchOS
statusactive, trialing, in_grace_period, in_billing_retry, paused, expired, incomplete, unknown
latestStoreapp_store, play_store, promotional, mac_app_store, stripe, amazon, roku, rc_billing, paddle, external
anyActiveStoreAny active store — same store identifiers as latestStore
latestOwnershipTypePURCHASED, FAMILY_SHARED
latestOfferTypeno_offer, free_trial, introductory_offer, offer_code, promotional_offer, win_back_offer, unspecified_offer
priceExperimentVarianta, b, c, d
countryLast seen country — ISO 3166-1 alpha-2 codes (e.g. US, DE)
latestStoreCountryISO 3166-1 alpha-2 country codes
storefrontStore country — ISO 3166-1 alpha-2 codes
mediaSourceproject-specific — fetch valid values
campaignproject-specific
adGroupproject-specific
adproject-specific
keywordproject-specific
creativeproject-specific
priceExperimentIdproject-specific
latestProductproduct IDs of the project — fetch valid values

Boolean fields

Operators: is, isNot. Value is exactly "true" or "false".

FieldMeaning
hasMadeSandboxPurchaseHas made a sandbox purchase
hasMadeNonSubscriptionPurchaseHas made a non-subscription purchase
latestAutoRenewIntentAuto-renewal status (true = set to renew)
isCurrentlyTrialingCurrently trialing
isRcPromoHas been granted an entitlement via RC (promotional)

Number fields

Operators: equal, notEqual, greaterThan, greaterThanOrEqual, lessThan, lessThanOrEqual, isEmpty, isNotEmpty. Value is a numeric string, e.g. "50".

FieldMeaning
totalSpentTotal spent
totalRenewalsTotal number of renewals

Date fields

Operators: before, beforeOrOn, on, after, afterOrOn, within, between, notBetween, isEmpty, isNotEmpty.

FieldMeaning
firstSeenAtFirst seen
lastSeenAtLast seen
firstPurchaseAtFirst purchase
mostRecentPurchaseAtMost recent purchase
mostRecentRenewalAtMost recent renewal
latestExpirationAtLatest expiration
trialStartAtTrial start
trialEndAtTrial end
subscriptionOptOutAtMost recent cancellation
trialOptOutAtMost recent trial cancellation

Custom attribute fields

Filter with customAttribute:{key} (e.g. customAttribute:favorite_team). They use the enum operators. Fetch known keys and values with get-audience-filter-options — never invent a key.

Value formats

  • isEmpty / isNotEmpty — set "value": "" (the value is ignored).
  • isAnyOf / isNotAnyOf — comma-separated string: "value": "US,CA,MX".
  • before, beforeOrOn, on, after, afterOrOn — calendar date "value": "2026-01-31" (YYYY-MM-DD).
  • between / notBetween — stringified JSON with exactly from and to: "value": "{\"from\":\"2026-01-01\",\"to\":\"2026-01-31\"}" (from ≤ to).
  • within — stringified JSON with exactly direction, value, unit: "value": "{\"direction\":\"last\",\"value\":30,\"unit\":\"days\"}". direction is last or next; unit is minutes, hours, or days; value is a non-negative integer. before/beforeOrOn/after/afterOrOn also accept this relative format (not on).

Fetching project-specific values

Fields marked project-specific (mediaSource, campaign, adGroup, ad, keyword, creative, priceExperimentId, latestProduct) and custom attributes only match values that exist in the project's data. Fetch with get-audience-filter-options:

  • project_id (required)
  • fields (required, at least one) — any of the eight fields above, customAttribute:{key} for one custom attribute, or customAttribute to list every custom attribute key with its values.

A custom-attribute entry may come back with cardinality_exceeded: true — a value the user stated verbatim can still be valid even if it is not in the list.

Fixed-value fields (country, platform, status, …) are not served by this tool — use the tables above. Never guess project-specific values — a filter on a non-existent value silently matches zero customers.

Example: building a link

User wants: "Android customers acquired through Instagram" in project proj56965ae1.

Rule (both conditions in one group — AND):

{
  "groups": [
    {
      "conditions": [
        { "field": "platform", "operator": "is", "value": "android" },
        { "field": "mediaSource", "operator": "is", "value": "Instagram" }
      ]
    }
  ]
}

Link:

https://app.revenuecat.com/projects/56965ae1/customer-lists/all-customers?filters=%7B%22groups%22%3A%5B%7B%22conditions%22%3A%5B%7B%22field%22%3A%22platform%22%2C%22operator%22%3A%22is%22%2C%22value%22%3A%22android%22%7D%2C%7B%22field%22%3A%22mediaSource%22%2C%22operator%22%3A%22is%22%2C%22value%22%3A%22Instagram%22%7D%5D%7D%5D%7D

User wants: "customers on iOS or Android who are currently trialing and were first seen in the last 30 days".

{
  "groups": [
    {
      "conditions": [
        { "field": "platform", "operator": "isAnyOf", "value": "iOS,android" },
        { "field": "isCurrentlyTrialing", "operator": "is", "value": "true" },
        {
          "field": "firstSeenAt",
          "operator": "within",
          "value": "{\"direction\":\"last\",\"value\":30,\"unit\":\"days\"}"
        }
      ]
    }
  ]
}

FAQ

What does the revenuecat-audiences skill do?

Use before sharing a link to a filtered customer list or audience, and when identifying, filtering, or ranking the user's customers (a segment, who they are, a product or duration, spend, renewals, status, country, attribution).

How do I install revenuecat-audiences?

Run npx skills add https://github.com/revenuecat/ai-toolkit --skill revenuecat-audiences in your project. The skills CLI detects the agents you use and copies the skill into the right folder. For Claude Code you can also place the skill folder at ~/.claude/skills/revenuecat-audiences/ (personal) or .claude/skills/revenuecat-audiences/ (project).

Which AI agents can use revenuecat-audiences?

Any agent that supports the open Agent Skills format (a folder with a SKILL.md file), including Claude Code, Codex, Cursor, GitHub Copilot, Gemini CLI, Windsurf, Cline, OpenCode and more.

Is revenuecat-audiences safe to install?

No partner security audit is available yet. Skills can run commands and scripts, so read the SKILL.md and any bundled files before installing.

Who maintains revenuecat-audiences?

It is published by revenuecat in revenuecat/ai-toolkit. It has 198 recorded installs.

More from revenuecat/ai-toolkit

View all →

revenuecat-paywall

revenuecat/ai-toolkit

Display a RevenueCat paywall inside an app using the RevenueCatUI SDK. Use when the user asks to add a paywall, show a RevenueCat paywall, present PaywallView, integrate RevenueCatUI, gate a premium screen with a paywall, launch PaywallActivity, call presentPaywall or presentPaywallIfNeeded, or show the dashboard configured paywall UI on iOS, Android, Kotlin Multiplatform, Flutter, or React Native. To create, edit, evaluate, or audit the dashboard paywall itself, use revenuecat-paywall-design.

Mobile1.1K installs

integrate-revenuecat

revenuecat/ai-toolkit

End-to-end RevenueCat integration — sets up the dashboard side via the RevenueCat MCP or the rc CLI (project, app, public API key) and installs/configures the Purchases SDK in the app. Use when the user asks to add RevenueCat, hook up RevenueCat, add subscriptions or in-app purchases to an app, integrate Purchases, install the RevenueCat SDK, set up a RevenueCat API key, configure Purchases on launch, or set up a brand new RevenueCat integration on iOS, Android, Kotlin Multiplatform, Flutter, or React Native.

Mobile1.1K installs

revenuecat-purchase-flow

revenuecat/ai-toolkit

Implement the RevenueCat purchase and restore flow. Use when the user asks to buy a package, purchase a subscription, fetch offerings, build the purchase logic behind a custom (hand-coded) paywall, handle purchase errors, detect user cancelled, or restore previous purchases on iOS, Android, Kotlin Multiplatform, Flutter, or React Native.

Mobile987 installs

revenuecat-testing-setup

revenuecat/ai-toolkit

Set up a testing environment for RevenueCat purchases without charging real money. Use when the user says test RevenueCat purchases, sandbox setup, StoreKit configuration file, license tester, how do I test purchases without real money, set up sandbox account, internal testing track, or test paywall on iOS, Android, Kotlin Multiplatform, Flutter, or React Native.

Testing & QA901 installs

create-revenuecat-project

revenuecat/ai-toolkit

Set up a complete RevenueCat project from scratch — creates apps, products, entitlements, offerings, and packages in the correct order. Use when the user wants to create a new RevenueCat project, configure in-app purchases, set up subscriptions or monetization, or bootstrap IAP infrastructure for iOS, Android, or Web.

Mobile882 installs

revenuecat-troubleshoot

revenuecat/ai-toolkit

Diagnose and resolve RevenueCat integration issues — inspects dashboard configuration through the RevenueCat MCP, walks the SDK debug logs, and covers code-side gotchas. Use when the user says offerings are empty, products not loading, entitlement not active after purchase, paywall won't load, transactions not appearing, customer info shows no entitlements, sandbox purchase not working, an SDK-gated RevenueCat feature not working, or RevenueCat is broken on iOS, Android, Kotlin Multiplatform, Flutter, or React Native. Also use when asked to check or validate the store / product setup.

Mobile878 installs

Popular other skills

View category →

hyperframes-cli

heygen-com/hyperframes

The HyperFrames CLI by job - scaffold, check, look at frames, edit the timeline, preview, render locally or in the cloud, publish, project history - plus reading its JSON and recovering from build or render failures.

1.3M installs

triage

mattpocock/skills

Move issues and external PRs through a state machine of triage roles, categorise, verify, grill if needed, and write agent-ready briefs.

1M installs

ask-matt

mattpocock/skills

Ask which skill or flow fits your situation. A router over the skills in this repo.

778.4K installs

to-questionnaire

mattpocock/skills

Turn a decision you can't fully answer into a questionnaire for someone else to fill in.

508.9K installs

wait-what

mattpocock/skills

Stop. That last message did not land: re-pitch it.

459.7K installs

loop-me

mattpocock/skills

Grill me about specs for the workflows I want to build, within this workspace.

447.9K installs