The Scenario
You run a membership community on Payhip and pipe subscription.created webhooks into a Google Sheet via Zapier — it's been running for four months. Column B of the "Subscriptions" tab holds the raw event JSON. Nobody has looked at it in weeks because nobody knows what to do with raw JSON.
This morning you got a Slack message from a co-founder: "Can you send me a breakdown of new subscribers by plan for the last three months? Trying to prep for the investor sync."
The investor sync is at 9 AM tomorrow.
The bad version:
- Open the first row in column B, parse the JSON manually to find the plan name and the subscription date.
- Tally it somewhere — a separate tab, a sticky note, a running total in your head.
- Work through all 400-odd rows in the tab, trying to keep a running count by plan without losing track of which rows you've processed.
You have the data. The output someone needs is a simple table: plan names down one side, months across the top, subscriber counts inside. Getting from A to B should not take until midnight.
The Easy Way: One Prompt in SheetXAI
SheetXAI is an AI agent that lives inside your Google Sheet. It reads the raw webhook data in column B, extracts the subscriber details, and pivots them into a summary table — all in one pass.
Read the Payhip subscription.created webhook data in column B, extract subscriber email, plan name, and date, then pivot by plan into a summary table on the "Summary" sheet.
What You Get
- A pivot table lands on the "Summary" sheet with plan names in one axis and subscriber counts grouped by month in the other.
- The source rows in column B are read but not modified.
- Any row where the JSON is malformed or missing the expected fields is noted in a separate column rather than silently excluded from the count.
What If the Data Is Not Quite Ready
Some webhook rows are subscription.updated events mixed in with subscription.created
For each row in column B of the "Subscriptions" tab, check whether the Payhip event type is "subscription.created". Process only those rows — extract subscriber email, plan name, and date — and pivot them into a summary table by plan and month on the "Summary" sheet. Skip all other event types.
Plan names in the webhook data use internal slugs instead of display names
Parse the Payhip subscription.created events in column B of the "Subscriptions" tab. Map the plan slugs to display names using this table: "tier_1" → "Starter", "tier_2" → "Pro", "tier_3" → "Enterprise". Then pivot subscriber counts by display plan name and month into the "Summary" sheet.
You want the summary broken down by both plan and acquisition month, plus a totals row
Parse the Payhip subscription.created webhook JSON in column B of the "Subscriptions" tab. Extract plan name and subscription date. Build a pivot table on "Summary" with plan names as rows, calendar months as columns, subscriber counts as values, and a "Total" row at the bottom summing each plan's full count.
Full pipeline — parse events, map slugs, filter to last 90 days, pivot, and add MoM growth
Parse subscription.created events from column B of "Subscriptions". Filter to events from the last 90 days. Map plan slugs to display names. Pivot subscriber counts by plan and month on "Summary". Add a "MoM Growth" row showing percentage change between each adjacent month column.
The investor summary you needed this morning is ready before the sync.
Try It
Get the 7-day free trial of SheetXAI and open the sheet where your Payhip subscription webhook data is accumulating, then ask it to pivot new subscriber counts by plan and month. To understand cancellations in the same dataset, see Track Churn From Payhip Subscription Deleted Events in Google Sheets or return to the Payhip integration overview.
