# How to Automate Patreon Reward Fulfillment using the API

- Tool: API Automations
- Difficulty: Advanced
- Fix time: 90 minutes
- Compatibility: Patreon API v2 — campaigns.members, campaigns.members.address, and w:campaigns.webhook scopes
- Last updated: May 2026

## TL;DR

Fetch patron members with their shipping addresses and currently_entitled_tiers using campaigns.members.address scope (a separate scope beyond campaigns.members). Walk the JSON:API included array to link address and tier objects to each member. Digital rewards (Discord roles, download links) are fulfilled by matching tier IDs to your reward configuration. Physical rewards require the shipping address, which may be empty if the patron didn't provide one or if the tier doesn't have shipping enabled.

## Best practices

- Request campaigns.members.address scope only if you actually fulfill physical rewards — patron addresses are sensitive data
- Always handle the null address case — not all patrons provide shipping info even on physical tiers
- Use the addressee field for the shipping label name and fall back to full_name — these can differ
- Implement idempotency keyed on (member_id, tier_id, billing_month) to prevent double-fulfillment from webhook retries
- Process fulfillments asynchronously from a queue — return 200 immediately from the webhook handler
- Generate time-limited signed URLs for digital downloads rather than permanent public links
- Delete patron shipping addresses from your system after fulfillment — don't store longer than necessary

## Frequently asked questions

### Why is the shipping address null even though I have campaigns.members.address scope?

Three possible causes: (1) The patron didn't provide a shipping address — not all patrons fill this in even on physical tiers. (2) The specific tier doesn't have shipping enabled in your Patreon settings. (3) You're requesting the address but not including fields[address]=addressee,line_1,... — without explicit field selection, JSON:API returns only {id, type}. Always handle the null address case in your fulfillment logic.

### What is the campaigns.members.address scope and how is it different from campaigns.members?

campaigns.members allows you to list patrons and access their basic membership data (name, status, pledge amount). campaigns.members.address is a separate, more sensitive scope that additionally grants access to shipping addresses. You must request both explicitly. Patreon separates them because shipping addresses are particularly sensitive personal data.

### Can I use the webhook payload directly or do I need to fetch the full member?

The pledge:create webhook payload contains basic member data but typically won't include the full address object from the included array. Fetch the full member immediately after receiving the webhook using GET /api/oauth2/v2/members/{id} with include=currently_entitled_tiers,address to get complete data. The extra API call is necessary for physical fulfillment.

### How do I handle patrons who haven't provided an address yet?

Add them to a 'pending fulfillment' queue with their tier and email. Send an automated email asking them to update their shipping address on Patreon. Re-run the fulfillment check after 7 days. For critical physical rewards, flag them for manual follow-up. Some creators remind patrons to update addresses as part of their monthly patron communication.

### Can I fulfill the same reward multiple times for monthly subscribers?

It depends on your reward type. One-time rewards (like a welcome gift) should use idempotency keyed on (member_id, tier_id) to prevent re-fulfillment. Monthly rewards (like a print or exclusive content) should use (member_id, tier_id, year_month) as the key to allow monthly delivery while preventing duplicates within the same month.

### What if a patron upgrades to a higher tier — should they get the new tier's rewards?

Yes — handle the members:pledge:update event. On upgrade, fulfill the new tier's rewards that the previous tier didn't include. On downgrade, remove digital entitlements (Discord roles) that no longer apply. Physical rewards already shipped cannot be un-fulfilled, but you can pause future shipments.

### What's the difference between addressee and full_name for the shipping label?

addressee is the name the patron set in their Patreon shipping address — this is what goes on the shipping label. It can differ from full_name (their Patreon display name). For example, a patron named 'JaneArtist' on Patreon might have addressee 'Jane Smith' in their shipping details. Always use addressee for shipping labels, fall back to full_name only if addressee is empty.

---

Source: https://www.rapidevelopers.com/api-automations/how-to-automate-patreon-reward-fulfillment-using-the-api
© RapidDev — https://www.rapidevelopers.com/api-automations/how-to-automate-patreon-reward-fulfillment-using-the-api
