Skip to content
This repository has been archived by the owner on Mar 22, 2024. It is now read-only.

Added video explainer to Products, Entitlements, Offering page #240

Merged
merged 2 commits into from
Aug 3, 2023

Conversation

charliemchapman
Copy link
Collaborator

@charliemchapman charliemchapman commented Aug 2, 2023

Added an embedded video explainer that covers most everything on this page

Added an embedded video explainer that covers most everything on this page
@RCGitBot
Copy link
Contributor

RCGitBot commented Aug 3, 2023

Previews

temp/configuring-products.md

See contents

The RevenueCat dashboard allows you to specify what level of access each product should unlock for your users, which can greatly simplify your in-app code to check for subscription access. The dashboard also allows you to configure which in-app products are shown to your users remotely, so you can control how they're presented without the need to update your app. This is great for experimenting how different product configurations affect key subscription metrics.

[block:embed]
{
"html": "<iframe class="embedly-embed" src="//cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FQxHeZiW4KCA%3Ffeature%3Doembed&display_name=YouTube&url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DQxHeZiW4KCA&image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FQxHeZiW4KCA%2Fhqdefault.jpg&key=7788cb384c9f4d5dbbdbeffd9fe4b92f&type=text%2Fhtml&schema=youtube" width="854" height="480" scrolling="no" title="YouTube embed" frameborder="0" allow="autoplay; fullscreen; encrypted-media; picture-in-picture;" allowfullscreen="true"></iframe>",
"url": "https://www.youtube.com/watch?v=QxHeZiW4KCA",
"title": "RevenueCat Products, Offerings, and Entitlements Explained",
"favicon": "https://www.google.com/favicon.ico",
"image": "https://i.ytimg.com/vi/QxHeZiW4KCA/hqdefault.jpg",
"provider": "youtube.com",
"href": "https://www.youtube.com/watch?v=QxHeZiW4KCA",
"typeOfEmbed": "youtube"
}
[/block]

There are three levels of product configuration available within RevenueCat:

  1. Products
  2. Entitlements
  3. Offerings
    [block:image]
    {
    "images": [
    {
    "image": [
    "https://files.readme.io/fb06e40-Screen_Shot_2020-07-01_at_6.12.53_PM.png",
    "Screen Shot 2020-07-01 at 6.12.53 PM.png",
    1470,
    570,
    "#e6e4e2"
    ],
    "caption": "See how products in Apple, Google, and Stripe translate to Products, Entitlements, and Offerings in RevenueCat."
    }
    ]
    }
    [/block]
    The diagram above illustrates how products from Apple, Google, and Stripe tie into RevenueCat. The configuration is explained in more detail below.

Products

Products are the individual SKUs that users actually purchase. The stores (Apple, Google, Stripe) process these SKUs and charge the user.

Store Configuration

No matter how you choose to use RevenueCat, you'll need to first have products set up in the stores. This is done outside of RevenueCat, and where you set things like price, duration, and free trials. If you've never set up products before or need a refresher (or tips and tricks) check out these guides:

  • iOS / App Store Connect :fa-arrow-right:
  • Android / Google Play Console :fa-arrow-right:
  • Stripe :fa-arrow-right:

RevenueCat Configuration

After your products are set up in the stores, you'll also need to set up a 1-to-1 mapping of the products in RevenueCat as well.

Navigate to the Products tab in the Settings for your app in the RevenueCat dashboard. To add a new product, click the + New button and enter the product identifier exactly as it appears in the store, as well as the store that the product belongs to.

These product identifiers are the link between RevenueCat, and Apple, Google, Stripe.

[block:callout]
{
"type": "info",
"body": "If a user purchases a product that has not been set up in RevenueCat, the purchase will still go through and be tracked in RevenueCat."
}
[/block]

Entitlements

An entitlement represents a level of access, features, or content that a user is "entitled" to.

Entitlements are used to ensure a user has appropriate access to content based on their purchases, without having to manage all of the product identifiers in your app code.

Most apps only have one entitlement, unlocking all premium features. However, if you had two tiers of content such as Gold and Platinum, you would have 2 entitlements.

Creating an Entitlement

To create a new entitlement, click 'Entitlements' in the sidebar of the RevenueCat dashboard and click + New. You'll need to enter a unique identifier for your app's entitlement that you can reference in your app, like "pro".

Most apps only have one entitlement, but create as many as you need. For example a navigation app may have a subscription to "pro" access, and one-time purchases to unlock specific map regions. In this case there would probably be one "pro" entitlement, and additional entitlements for each map region that could be purchased.

Attaching Products to Entitlements

Once entitlements are created, you should attach products to entitlements. This lets RevenueCat know which entitlements to unlock for users after they purchase a specific product.

When viewing an Entitlement, click the Attach button to attach a product. If you've already added your products, you'll be able to select one from the list to attach.

When a product that is attached to an entitlement is purchased, that entitlement becomes active for the duration of the product. Subscription products will unlock entitlements for the subscription duration, and non-consumable and consumable purchases that are attached to an entitlement will unlock that content forever.

If you have non-subscription products, you may or may not want to add them to entitlements depending on your use case. If the product is non-consumable (e.g. lifetime access to "pro" features), you likely want to attach it to an entitlement. However, if it is consumable (e.g. purchase more lives in a game) you likely do not want to add them to an entitlement.

When designing your Entitlement structure, keep in mind that a single product can unlock multiple entitlements.
[block:image]
{
"images": [
{
"image": [
"https://files.readme.io/5bb6bc2-Screen_Shot_2020-07-01_at_6.14.38_PM.png",
"Screen Shot 2020-07-01 at 6.14.38 PM.png",
1346,
741,
"#f0f4f2"
],
"caption": "Example Entitlement structure with associated Apple, Google, and Stripe product identifiers."
}
]
}
[/block]

[block:callout]
{
"type": "info",
"body": "When relying on entitlements to enable access to certain content, it's important that you remember to add new products to their associated entitlements if needed. Failing to add your products to an entitlement, could lead to your users making purchases that don't unlock access to the promised content."
}
[/block]

Offerings

Offerings are the the selection of products that are "offered" to a user on your paywall. They're an optional, but recommended feature of RevenueCat that can make it easier to change and experiment with your paywalls.

Offerings allow you to choose which combination of products are shown to a user on your paywall or upsell screen. For example your default Offering may contain a monthly and annual subscription, but you might want to experiment with Offerings with a different combination of subscription durations, trial lengths, prices, etc.

Within each Offering, there must be one or more Packages. Packages are simply a group of equivalent products across iOS and Android. If your app is available on multiple platforms, then a Package would contain all of the equivalent product Ids from each platform.

Creating an Offering

To create an Offering, navigate to the Offerings tab to your app's settings in the RevenueCat dashboard, and click + New to get started.

You'll be prompted to enter an Identifier and Description for your offering. Note that the offering identifier cannot be changed later. Once you've entered this information, click Add.

Current Offering
The RevenueCat dashboard allows you to choose which Offering should be current. The current Offering is a convenience method for the Purchases SDK to reference a primary Offering.

If you build your paywall to reference the current Offering, instead of hardcoding an identifier value, you can change this Offering from the dashboard to dynamically display different Offerings at any time. We strongly recommend utilizing the current Offering feature. See Displaying Products for more info.

Adding Packages

Each Offering you create should contain at least one Package that holds cross-platform products.

To create a package, click into your new Offering, then click + New in the Packages section. In the popup, choose an Identifier from the dropdown that corresponds with the duration of the package. If a duration isn't suitable for your package (e.g. consumable purchases), then you can choose a custom identifier. Include a Description, then click Add.

Click into the newly created package and begin attaching product by clicking Attach.

In the popup you'll see dropdowns to select the appropriate product for each store. Choose the appropriate products, then click Attach.

[block:callout]
{
"type": "info",
"body": "Any product can be added to an Offering, even if it's not part of any Entitlement. This can come in handy if your paywall contains a combination of subscription products that unlock Entitlements, and consumable products that do not."
}
[/block]
Continue this process until all of the packages are created for your Offering, and all Offerings are created.

The packages within an offering can be updated at any time, and their display order can be modified by dragging their position in the table. This display order will be reflected in the SDK when you fetch Offerings.

Next Steps

You've successfully created Entitlements, Offerings, and Packages, and have attached products to be used in your app.

Continue on to Displaying Products to start showing your new Offering in your app.

temp/slack.md

See contents

👍

The Slack integration is available on the Starter plan.

RevenueCat can send you Slack message to a channel any time an event happens in your app. This lets you keep a close pulse on your app and celebrate those money making moments!

Events

The Slack integration tracks the following events:

[block:parameters]
{
"data": {
"h-0": "Event Type",
"h-1": "Default Event Name (Fallback)",
"h-2": "Description",
"h-3": "App Store",
"h-4": "Play Store",
"h-5": "Amazon",
"h-6": "Stripe",
"h-7": "Promo",
"0-0": "Initial Purchase",
"0-1": "Customer \<user_id> just started a subscription of \<product_id>",
"0-2": "A new subscription has been purchased.",
"0-3": "✅",
"0-4": "✅",
"0-5": "✅",
"0-6": "✅",
"0-7": "❌",
"1-0": "Trial Started",
"1-1": "Customer \<user_id> just started a free trial of \<product_id>",
"1-2": "The start of an auto-renewing subscription product free trial.",
"1-3": "✅",
"1-4": "✅",
"1-5": "✅",
"1-6": "✅",
"1-7": "❌",
"2-0": "Trial Converted",
"2-1": "Customer \<user_id> just converted from a free trial of \<product_id>",
"2-2": "When an auto-renewing subscription product converts from a free trial to normal paid period.",
"2-3": "✅",
"2-4": "✅",
"2-5": "✅",
"2-6": "✅",
"2-7": "❌",
"3-0": "Trial Cancelled",
"3-1": "Customer \<user_id> just cancelled their free trial of \<product_id>",
"3-2": "When a user turns off renewals for an auto-renewing subscription product during a free trial period.",
"3-3": "✅",
"3-4": "✅",
"3-5": "✅",
"3-6": "✅",
"3-7": "❌",
"4-0": "Renewal",
"4-1": "Customer \<user_id> just renewed their subscription of \<product_id>",
"4-2": "An existing subscription has been renewed or a lapsed user has resubscribed.",
"4-3": "✅",
"4-4": "✅",
"4-5": "✅",
"4-6": "✅",
"4-7": "❌",
"5-0": "Cancellation",
"5-1": "Customer \<user_id> just cancelled their subscription of \<product_id>",
"5-2": "A subscription or non-renewing purchase has been cancelled. See cancellation reasons for more details.",
"5-3": "✅",
"5-4": "✅",
"5-5": "✅",
"5-6": "✅",
"5-7": "✅",
"6-0": "Non Subscription Purchase",
"6-1": "Customer \<user_id> just purchased \<product_id>",
"6-2": "A customer has made a purchase that will not auto-renew.",
"6-3": "✅",
"6-4": "✅",
"6-5": "✅",
"6-6": "✅",
"6-7": "✅",
"7-0": "Billing Issue",
"7-1": "Customer \<user_id> got a billing issue on \<product_id>",
"7-2": "There has been a problem trying to charge the subscriber. This does not mean the subscription has expired. \n \nCan be safely ignored if listening to CANCELLATION event + cancel_reason=BILLING_ERROR.",
"7-3": "✅",
"7-4": "✅",
"7-5": "✅",
"7-6": "✅",
"7-7": "❌",
"8-0": "Product Change",
"8-1": "Customer \<user_id> got a product change from \<old_product_id> to \<new_product_id>",
"8-2": "A subscriber has changed the product of their subscription. \n \nThis does not mean the new subscription is in effect immediately. See Managing Subscriptions for more details on updates, downgrades, and crossgrades.",
"8-3": "✅",
"8-4": "✅",
"8-5": "❌",
"8-6": "✅",
"8-7": "❌"
},
"cols": 8,
"rows": 9,
"align": [
"left",
"left",
"left",
"left",
"left",
"left",
"left",
"left"
]
}
[/block]

Configure Slack Workspace

Before RevenueCat can post to your Slack channel, you need to authorize a webhook to post to your workspace. Slack has a more detailed article on their website explaining how to set this up if you have trouble.

1. Create a Slack app

  • Click Create App

2. Enable Incoming Webhooks from the settings page

  • Select Incoming Webhooks under Add features and functionality

  • Enable the Incoming Webhooks toggle
  • After the settings page refreshes, click Add New Webhook to Workspace

3. Pick a channel that the app will post to, then click Authorize

Configure RevenueCat Integration

Once you've set up a webhook in your Slack workspace. Enter the details into the Slack Integration section of your dashboard.

👍

You're all set! RevenueCat will start sending events into Slack!

Sample Events

Below are sample JSONs that are delivered to Slack for each event type.

{
    "product_identifier": "monthly_1",
    "app_id": "12345678-1234-1234-1234-123456789012",
    "payload": {
        "channel": "purchases",
        "username": "RevenueCat",
        "icon_url": "https://app.revenuecat.com/favicon-96x96.png",
        "attachments": [
            {
                "fallback": "Customer 12345 just started a subscription of monthly_1",
                "color": "#30B296",
                "fields": [
                    {
                        "value": ":smiley_cat: Customer <https://app.revenuecat.com/activity/123abcd45/12345|12345> just started a subscription."
                    },
                    {
                        "title": "Product",
                        "value": "monthly_1",
                        "short": false
                    },
                    {
                        "title": "Revenue",
                        "value": "$5.99",
                        "short": false
                    }
                ],
                "ts": 1588335655
            }
        ]
    }
}
{
    "product_identifier": "monthly_3d_trial",
    "app_id": "12345678-1234-1234-1234-123456789012",
    "payload": {
        "channel": "purchases",
        "username": "RevenueCat",
        "icon_url": "https://app.revenuecat.com/favicon-96x96.png",
        "attachments": [
            {
                "fallback": "Customer 12345 just started a free trial of monthly_3d_trial",
                "color": "#30B296",
                "fields": [
                    {
                        "value": ":smiley_cat: Customer <https://app.revenuecat.com/activity/123abcd45/12345|12345> just started a free trial."
                    },
                    {
                        "title": "Product",
                        "value": "monthly_3d_trial",
                        "short": false
                    }
                ],
                "ts": 1553805130
            }
        ]
    }
}
{
    "product_identifier": "monthly_1",
    "app_id": "12345678-1234-1234-1234-123456789012",
    "payload": {
        "channel": "purchases",
        "username": "RevenueCat",
        "icon_url": "https://app.revenuecat.com/favicon-96x96.png",
        "attachments": [
            {
                "fallback": "Customer 12345 just converted from a free trial of monthly_1",
                "color": "#30B296",
                "fields": [
                    {
                        "value": ":smiley_cat: Customer <https://app.revenuecat.com/activity/123abcd45/12345|12345> just converted from a free trial."
                    },
                    {
                        "title": "Product",
                        "value": "monthly_1",
                        "short": false
                    },
                    {
                        "title": "Revenue",
                        "value": "$5.99",
                        "short": false
                    }
                ],
                "ts": 1554466423
            }
        ]
    }
}
{
    "product_identifier": "monthly_3d_trial",
    "app_id": "12345678-1234-1234-1234-123456789012",
    "payload": {
        "channel": "purchases",
        "username": "RevenueCat",
        "icon_url": "https://app.revenuecat.com/favicon-96x96.png",
        "attachments": [
            {
                "fallback": "Customer 12345 just cancelled their free trial of monthly_3d_trial",
                "color": "#F2545B",
                "fields": [
                    {
                        "value": ":pouting_cat: Customer <https://app.revenuecat.com/activity/123abcd45/12345|12345> just cancelled their free trial."
                    },
                    {
                        "title": "Product",
                        "value": "monthly_3d_trial",
                        "short": false
                    }
                ],
                "ts": 1554502133
            }
        ]
    }
}
{
    "product_identifier": "monthly_1",
    "app_id": "12345678-1234-1234-1234-123456789012",
    "payload": {
        "channel": "purchases",
        "username": "RevenueCat",
        "icon_url": "https://app.revenuecat.com/favicon-96x96.png",
        "attachments": [
            {
                "fallback": "Customer 12345 just renewed their subscription of monthly_1",
                "color": "#30B296",
                "fields": [
                    {
                        "value": ":smiley_cat: Customer <https://app.revenuecat.com/activity/123abcd45/12345|12345> just renewed their subscription."
                    },
                    {
                        "title": "Product",
                        "value": "monthly_1",
                        "short": false
                    },
                    {
                        "title": "Revenue",
                        "value": "$5.99",
                        "short": false
                    }
                ],
                "ts": 1554091875
            }
        ]
    }
}
{
    "product_identifier": "annual",
    "app_id": "12345678-1234-1234-1234-123456789012",
    "payload": {
        "channel": "purchases",
        "username": "RevenueCat",
        "icon_url": "https://app.revenuecat.com/favicon-96x96.png",
        "attachments": [
            {
                "fallback": "Customer 12345 just cancelled their subscription of annual",
                "color": "#F2545B",
                "fields": [
                    {
                        "value": ":crying_cat_face: Customer <https://app.revenuecat.com/activity/123abcd45/12345|12345> just cancelled their subscription."
                    },
                    {
                        "title": "Product",
                        "value": "annual",
                        "short": false
                    }
                ],
                "ts": 1553810169
            }
        ]
    }
}
{
    "product_identifier": "500_coins",
    "app_id": "12345678-1234-1234-1234-123456789012",
    "payload": {
        "channel": "purchases",
        "username": "RevenueCat",
        "icon_url": "https://app.revenuecat.com/favicon-96x96.png",
        "attachments": [
            {
                "fallback": "Customer 12345 just purchased 500_coins",
                "color": "#30B296",
                "fields": [
                    {
                        "value": ":smiley_cat: Customer <https://app.revenuecat.com/activity/123abcd45/12345|12345> just made a purchase."
                    },
                    {
                        "title": "Product",
                        "value": "500_coins",
                        "short": false
                    },
                    {
                        "title": "Revenue",
                        "value": "$4.99",
                        "short": false
                    }
                ],
                "ts": 1590390293
            }
        ]
    }
}
{
    "product_identifier": "annual_trial",
    "app_id": "12345678-1234-1234-1234-123456789012",
    "payload": {
        "channel": "purchases",
        "username": "RevenueCat",
        "icon_url": "https://app.revenuecat.com/favicon-96x96.png",
        "attachments": [
            {
                "fallback": "Customer 12345 got a billing issue on annual_trial",
                "color": "#F2545B",
                "fields": [
                    {
                        "value": ":scream_cat: Customer <https://app.revenuecat.com/activity/123abcd45/12345|12345> got a billing issue."
                    },
                    {
                        "title": "Product",
                        "value": "annual_trial",
                        "short": false
                    }
                ],
                "ts": 1663976618
            }
        ]
    }
}
{
    "product_identifier": "annual",
    "app_id": "12345678-1234-1234-1234-123456789012",
    "payload": {
        "channel": "purchases",
        "username": "RevenueCat",
        "icon_url": "https://app.revenuecat.com/favicon-96x96.png",
        "attachments": [
            {
                "fallback": "Customer 12345 got a product change from annual to monthly",
                "color": "#30B296",
                "fields": [
                    {
                        "value": ":smiley_cat: Customer <https://app.revenuecat.com/activity/123abcd45/12345|12345> just changed the product of their subscription."
                    },
                    {
                        "title": "Product",
                        "value": "monthly",
                        "short": false
                    }
                ],
                "ts": 1663976617
            }
        ]
    }
}

@charliemchapman charliemchapman merged commit 4c2fa87 into main Aug 3, 2023
@charliemchapman charliemchapman deleted the charliemchapman-products-video-explainer branch August 3, 2023 13:47
@charliemchapman charliemchapman restored the charliemchapman-products-video-explainer branch August 3, 2023 14:39
@codykerns codykerns mentioned this pull request Aug 4, 2023
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants