Patreon New Member Webhook Data Format

Patreon • Automations • JSON • Data • Make
Peter Ronhovde
12
min read

In this series of articles, I highlight some of the stumbling blocks I've encountered while trying to automate my Patreon membership process.

Please note the disclaimer below.

My Setup Summary

Here is a brief summary of my particular setup. Note this is not necessarily a tutorial (with detailed steps) as much as it is a man holding a caution sign trying to help you around the potholes.

What I do?

I run a free newsletter (home page) along with a blog and a supplementary YouTube channel. My blog has a mixture of free and paid/gated content.

I use Webflow and Relume to build and maintain my website and blog. Gated content on the blog is managed through MemberStack 2.0.

My main source of subscriptions is probably going to be through Patreon (although Memberstack also allows me to directly handle paid subscriptions), so I wanted a way to automate adding new patrons to my gated blog content.

Why does this matter?

I started using Make.com to automate the process. This is where I started hitting snags since the Patreon test data is not entirely related to the real-life data. They are similar but not the same, and "that should work" often doesn't work in computer land.

If you're interested in following the similar path or using checking some of the tools I've been using, I've included some affiliate links near the bottom of this article.

Patreon Data

Webhook dialog

Patreon can send data is to webhooks you provide when certain events happen with members or pledges.

You get the webhook URL from whichever automation platform you are using. Two of the most common automation platforms are Zapier and Make. I personally use Make since I can design automation scenarios visually, but Zapier is a great choice for beginners, but it is more expensive.

Paste your the webhook URL into the edit box at the top of the register webhooks page (a Patreon creator account is required):

Once you click the plus to add the webhook, here is a sample screenshot of the webhook dialog on Patreon:

Patreon webhook setup dialog

You can add multiple webhooks keyed to different data packets. There is also an API that is more sophisticated than I wish to use at this point at least while working alone.

You can set the toggles on the right of the dialog to correspond to the data you want to respond to in a given automation.

I set up a new member/pledge automation, an update member/pledge automation, and a delete member/pledge automation. I personally do not use the deprecated webhooks at the top since that would be asking for trouble if Patreon quits using them as planned.

The problem(s) ...

A JSON data packet is sent to the indicated webhook you provided when the event occurs.

You then need to process that data on your automation platform (more articles on this later if enough people are interested).

In principle, you can click "Send test" to send a test data packet next to your desired event type, and it does indeed send a test packet ... The Patreon forum support and other information is apparently convinced that works well enough.

It doesn't.

I know because I spent hours trying to scour their information to know precisely how their data is formatted, so I could then precisely know how to process it in my automations.

With that said, I appreciate the platform that Patreon has provided for creators to organize patron support, but they needed to add another effort or two to clarify the webhook data since many creators are working alone or have very small teams.

If you're still reading, aren't you glad you have me here now?

Issues

Here is where I started encountering issues with the Patreon data.

It does send a JSON data packet, but it is not specific tot he type of data you think you are receiving. In fact, as far as I can tell, it sends the same creator data pack no matter which test you click.

That is a problem. Programming and even "no-code" automations cannot be willy-nilly. You have to know what you are receiving precisely in order to be able to parse it. Some support is found on Patreon and in the forum, but it lacks specificity of the JSON data and how that data packet changes (or not) with each member or pledge update type.

There is a more comprehensive help page, but it is less helpful (at least to me) than it appears when you first find it. While it does discuss the JSON data format in pieces, in practice, it doesn't give the actual structure or specific data included in the JSON data packets that are sent to your webhooks. A lot of the information is spent talking about the API interface, which is fine, just not as useful if you're using the webhooks interface.

I don't think we should have to create a fake user and manually test and coordinate data packets to get the actual data format sent to the webhooks by a regular Patreon user, so that's what I'm trying to do for you now to the best of my ability.

If that works for you, then read on.

What is JSON Data?

Without getting too deep in the weeds, JSON data is a structured data format borrowed from JavaScript. The basic format is:

{
    "data": "someData",
    "number": 5
}

Each element can have one of several types: string, number, boolean (true or false), object, array, or null (no type).

Objects are defined with curly braces { ... }. Element names and their corresponding data are separated by a colon. Successive data elements are separated by commas.

The object type means the data elements can be nested, so we could have a person object as a data element.

{
    "person": { "firstname": "John", "lastname": "Doe", "age": 25 },
    "number": 5
}

An array is a list of data elements for a given element. We will need this below.

{
    "movies": ["Lord of the Rings, "Star Wars", "Twilight"],
    "somenumber": 8
}

The elements of the array can be anything as well, but some sources implicitly assume they are the same data type.

If you want more explanation, a quick search will bring up half a dozen good sources.

Fortunately for us, a lot of no-code automation tools like Make or Zapier will parse the JSON data for us, so we can just indicate which data element we want. However, there are a few issues though which are covered in these articles.

New Member or Pledge Data

I decided to share what I know so far along with some specific (sanitized) data packets, so you can be better informed on how to process them in your own automations.

Now before I start the details, please be aware that Patreon could change the data format, and it might vary by user type. I will try to update this article as I learn more.

Full data packet

Here is an actual data packet send sometime in June 2023 with any user or creator specific information anonymized.

I apologize for the length, but I wanted to give everyone a better idea of an actual data packet than the standard Patreon documentation did.

{
    "data": {
        "attributes": {
            "campaign_lifetime_support_cents": 0,
            "currently_entitled_amount_cents": 500,
            "email": "someone@somedomain.com",
            "full_name": "Creator Name",
            "is_follower": true,
            "is_free_trial": true,
            "last_charge_date": null,
            "last_charge_status": null,
            "lifetime_support_cents": 0,
            "next_charge_date": null,
            "note": "",
            "patron_status": "active_patron",
            "pledge_cadence": null,
            "pledge_relationship_start": "2023-06-01T12:30:00.000+00:00",
            "will_pay_amount_cents": 0
        }, 
        "id": "01ab2c34-012a-01a2-a01b-a0b12cd34e56",
        "relationships": {
            "address": {
                "data": null
            },
            "campaign": {
                "data": {
                    "id": "0123456",
                    "type": "campaign"
                },
                "links": {
                    "related": "https://www.patreon.com/api/oauth2/v2/campaigns/0123456"
                }
            },
            "currently_entitled_tiers": {
                "data": [
                    {
                        "id": "6543210",
                        "type": "tier"
                    }
                ]
            },
            "user": {
                "data": {
                    "id": "01234567",
                    "type": "user"
                },
                "links": {
                    "related": "https://www.patreon.com/api/oauth2/v2/user/01234567"
                }
            }
        },
        "type": "member"
    },
    "included": [
        {
            "attributes": {
                "created_at": "2020-12-01T23:59:59.000+00:00",
                "creation_name": "creator is offering these features blurb",
                "discord_server_id": null,
                "google_analytics_id": null,
                "has_rss": false,
                "has_sent_rss_notify": false,
                "image_small_url": "https://c10.patreonusercontent.com/4/patreon-media/p/campaign/some-patreon-url-small",
                "image_url": "https://c10.patreonusercontent.com/4/patreon-media/p/campaign/v/some-patreon-url",
                "is_charged_immediately": true,
                "is_monthly": true,
                "is_nsfw": false,
                "main_video_embed": "",
                "main_video_url": "",
                "one_liner": null,
                "patron_count": 0,
                "pay_per_name": "month",
                "pledge_url": "/join/creatorname",
                "published_at": "2020-12-01T23:59:59.000+00:00",
                "rss_artwork_url": null,
                "rss_feed_title": null,
                "summary": "This is a creator summary.",
                "thanks_embed": null,
                "thanks_msg": "This is a creator thank you message for support.",
                "thanks_video_url": null,
                "url": "https://www.patreon.com/creatorname",
                "vanity": "creatorname"
            },
            "id": "6546455",
            "type": "campaign"
        },
        {
            "attributes": {
                "about": null,
                "created": "2023-08-01T23:59:59.000+00:00",
                "first_name": "UserFirstName",
                "full_name": "UserFirstName UserLastName",
                "hide_pledges": true,
                "image_url": "https://c10.patreonusercontent.com/4/patreon-media/p/user/creator-user-url",
                "is_creator": false,
                "last_name": "UserLastName",
                "like_count": 0,
                "social_connections": {
                    "deviantart": null,
                    "discord": null,
                    "facebook": null,
                    "google": null,
                    "instagram": null,
                    "reddit": null,
                    "spotify": null,
                    "spotify_open_access": null,
                    "twitch": null,
                    "twitter": null,
                    "vimeo": null,
                    "youtube": null
                },
                "thumb_url": "https://c10.patreonusercontent.com/4/patreon-media/p/user/creator-thumbnail-image-url",
                "url": "https://www.patreon.com/user?u=01234567",
                "vanity": null
            },
            "id": "01234567",
            "type": "user"
        },
        {
            "attributes": {
                "amount_cents": 500,
                "created_at": "2020-12-01T23:59:59.000+00:00",
                "description": "This is a creator support thank you message.",
                "discord_role_ids": null,
                "edited_at": "2023-12-31T08:00:00.000+00:00",
                "image_url": "https://c10.patreonusercontent.com/4/patreon-media/p/reward/creator-image-url",
                "patron_count": 1,
                "post_count": 0,
                "published": true,
                "published_at": "2020-12-02T23:59:59.000+00:00",
                "remaining": null,
                "requires_shipping": false,
                "title": "Tier Name",
                "unpublished_at": null,
                "url": "/join/creatorname/checkout?rid=0123456",
                "user_limit": null
            },
            "id": "7041924",
            "type": "tier"
        }
    ],
    "links": {
        "self": "https://www.patreon.com/api/oauth2/v2/members/01ab2c34-012a-01a2-a01b-a0b12cd34e56"
    }
}

The main problem is the above data is not the same as the "Send test" data packet, so you're left in the shadows trying to figure things out.

(Some) User data

The top "attributes" object has some useful user information:

{
    "data": {
        "attributes": {
            "campaign_lifetime_support_cents": 0,
            "currently_entitled_amount_cents": 500,
            "email": "someone@somedomain.com",
            "full_name": "Creator Name",
            "is_follower": true,
            "is_free_trial": true,
            "last_charge_date": null,
            "last_charge_status": null,
            "lifetime_support_cents": 0,
            "next_charge_date": null,
            "note": "",
            "patron_status": "active_patron",
            "pledge_cadence": null,
            "pledge_relationship_start": "2023-06-01T12:30:00.000+00:00",
            "will_pay_amount_cents": 0
        }, 
... more data stuff
}

But it doesn't split the user name into first and last names. You have to access those in the more detailed user data below.

The Make webhook module will automatically parse this main section of data.

Relationship data

Below the user data is the currently_entitled_tiers which is referenced from the below included data below:

{
        ... user data ...
        "relationships": {
            ... other relationship data ...
            
            "currently_entitled_tiers": {
                "data": [
                    {
                        "id": "6543210",
                        "type": "tier"
                    }
                ]
            },
            
            ... other relationship data ...
    },
    ... remaining data
}

I'm not sure as of August 2023 whether we actually need to access this relationship data since the more detailed tier data is included below.

Included array

The Make webhook module will automatically parse the main section of data, but it has an issue with the "included" data array apparently because the following data elements are not the same format (which is valid JSON data, but it causes some interpretation issues on Make).

I'll talk more in another article about how I dealt with this in Make to parse the relevant user data along with the user's chosen support tier.

Creator data

The first element of the included data is the creator info:

{
   ... initial data stuff ... 
    "included": [
        {
            "attributes": {
                "created_at": "2020-12-01T23:59:59.000+00:00",
                "creation_name": "creator is offering these features blurb",
                "discord_server_id": null,
                "google_analytics_id": null,
                "has_rss": false,
                "has_sent_rss_notify": false,
                "image_small_url": "https://c10.patreonusercontent.com/4/patreon-media/p/campaign/some-patreon-url-small",
                "image_url": "https://c10.patreonusercontent.com/4/patreon-media/p/campaign/v/some-patreon-url",
                "is_charged_immediately": true,
                "is_monthly": true,
                "is_nsfw": false,
                "main_video_embed": "",
                "main_video_url": "",
                "one_liner": null,
                "patron_count": 0,
                "pay_per_name": "month",
                "pledge_url": "/join/creatorname",
                "published_at": "2020-12-01T23:59:59.000+00:00",
                "rss_artwork_url": null,
                "rss_feed_title": null,
                "summary": "This is a creator summary.",
                "thanks_embed": null,
                "thanks_msg": "This is a creator thank you message for support.",
                "thanks_video_url": null,
                "url": "https://www.patreon.com/creatorname",
                "vanity": "creatorname"
            },
            "id": "6546455",
            "type": "campaign"
        },
   ... more data stuff ... 
}

The creator summary and thanks_msg elements can include HTML tags which are omitted here.

Detailed user data

The user data is below the creator data:

{
    ... data above the included array ...
    "included": [
        ... creator data  ...
        {
            "attributes": {
                "about": null,
                "created": "2023-08-01T23:59:59.000+00:00",
                "first_name": "UserFirstName",
                "full_name": "UserFirstName UserLastName",
                "hide_pledges": true,
                "image_url": "https://c10.patreonusercontent.com/4/patreon-media/p/user/creator-user-url",
                "is_creator": false,
                "last_name": "UserLastName",
                "like_count": 0,
                "social_connections": {
                    "deviantart": null,
                    "discord": null,
                    "facebook": null,
                    "google": null,
                    "instagram": null,
                    "reddit": null,
                    "spotify": null,
                    "spotify_open_access": null,
                    "twitch": null,
                    "twitter": null,
                    "vimeo": null,
                    "youtube": null
                },
                "thumb_url": "https://c10.patreonusercontent.com/4/patreon-media/p/user/creator-thumbnail-image-url",
                "url": "https://www.patreon.com/user?u=01234567",
                "vanity": null
            },
            "id": "01234567",
            "type": "user"
        },
    ... remaining data ...
}

Detailed tier data

Then finally the supported tier data which you will need while processing the new patron member or pledge:

{
    ... data above the included array ...
    "included": [
        {
        ... other data in the included array ...
        {
            "attributes": {
                "amount_cents": 500,
                "created_at": "2020-12-01T23:59:59.000+00:00",
                "description": "This is a creator support thank you message.",
                "discord_role_ids": null,
                "edited_at": "2023-12-31T08:00:00.000+00:00",
                "image_url": "https://c10.patreonusercontent.com/4/patreon-media/p/reward/creator-image-url",
                "patron_count": 1,
                "post_count": 0,
                "published": true,
                "published_at": "2020-12-02T23:59:59.000+00:00",
                "remaining": null,
                "requires_shipping": false,
                "title": "Tier Name",
                "unpublished_at": null,
                "url": "/join/creatorname/checkout?rid=0123456",
                "user_limit": null
            },
            "id": "7041924",
            "type": "tier"
        }
    ... remaining data ...
}

This information was referenced in the relationships array data under "currently_entitled_tiers" near the top.

Is the structure always the same?

Unfortunately, I can't guarantee all the above data is the exact order of the data or that it will always have exactly the same set of data (see disclaimer reminder below) depending on the particular user or some other unknown factor. For example, it may vary if the user is also a creator, or it might change if a creator allows someone to pay for multiple tiers.

Please contact me if you notice any discrepancies. I want this information to be as accurate as possible.

Affiliate Links

If you're interested in using some of the tools I've used for my automations or setup, check out these affiliate links. I may make a small commission when you purchase when using them, but there is no increase in cost for you, and it helps to support this site and associated content.

Make.com is a no-code automation platform that works with many external products. Make is less expensive than competitors and allows visually designed automations.
Fillout.com is an online form creation and processing software. It is a little more affordable than other paid form options, and it matched my own needs the best.
ActiveCampaign is email marketing software including no-code automations. it's probably one of the more feature-rich options before the most expensive solutions.
SmartSuite is an online database and project management software with some no-code automation features.

Disclaimer!

I am not a Patreon employee or representative nor a web-design expert in any measure (my professional background is in physics, mathematics, and scientific computing).

I am simply sharing my experience with trying to parse the JSON data sent to webhooks by Patreon because the current test data packets are not representative enough of "real life" data in my experience, and better information was difficult to find on the web.

I cannot guarantee that my data interpretation is accurate. Further, Patreon might revise or otherwise change the data structure(s) at any time, so use any or all information presented at your own risk! Neither I (Peter Ronhovde) nor this site accepts responsibility for any issues, problems, or financial losses incurred due to applying the information covered here.

I welcome any discussion to further enhance, clarify, and/or correct the information presented here. Please use the Contact Us link at the top or bottom of the page.