One support screen for beehiiv subscribers and Stripe billing

By General Input

Paste a reader's email and see their newsletter status, tiers, and payment history on one screen, with safe fixes your support teammate can run.

Integrations

  • beehiiv
  • Stripe

Type

App

Categories

  • Customer Support
  • Operations

Build me an internal subscriber support console so a support teammate can answer reader questions without being given admin access to our beehiiv workspace or our Stripe dashboard. The app is essentially one screen: a search box at the top where I paste a reader's email address, and a single merged profile below it. This is the ops person's daily screen, so keep it dense and fast, and keep the search box ready for the next lookup after every search.

Lookup. When an email is submitted, the handler calls beehiiv Get Subscription by Email for the currently selected publication. A publication picker sits next to the search box, populated by beehiiv List Publications, and remembers the last publication each teammate chose. The profile shows subscription status, current tier, the date they subscribed, the signup source and any UTM fields beehiiv returns, and every custom field as a plain label and value list. If the exact email lookup returns nothing, fall back to beehiiv List Subscriptions filtered by that email to surface near matches such as typos or plus addressing, and let the teammate pick the right person from those results instead of showing a dead end.

Publications. Alongside the profile, call beehiiv Get Publications by Subscription Email to list every publication in our workspace that address is subscribed to, with the status on each. Compare that against beehiiv List Publications so the panel also shows the publications the reader is not on. That single view answers most "I am not getting your emails" tickets on its own.

Billing. If the reader pays us, the same profile shows their billing history. Resolve the email to a customer first with Stripe Search Customers using an email query, then call Stripe List Subscriptions filtered by that customer id, including cancelled and past due ones rather than active only, and Stripe List Charges filtered by the same customer. Show each subscription with its status, the plan and amount, the current period end, and whether it is set to cancel at period end. Show each charge with date, amount, paid or refunded or failed status, and description. If no Stripe customer matches the address, show a calm "no payment record found for this address" state rather than an error.

Mismatch banner. At the top of the profile, compare the two sides and state any conflict in plain language, because the mismatch is usually the whole answer to the ticket. Call out an active paid Stripe subscription while the beehiiv tier is free or the status is not active, which is the "I was charged but cannot read the paid posts" case. Call out a beehiiv status of unsubscribed with the date, which is the "I am not receiving emails" case. Call out a paid beehiiv tier with no active Stripe subscription. When both sides agree, say so clearly so the teammate can reply with confidence.

Actions. Three buttons on the profile, each behind a confirmation step. Correct the email address when someone mistyped it at signup. Change the tier, with the dropdown populated from beehiiv List Tiers for that publication so only real tiers can be chosen. Resubscribe a reader who unsubscribed by accident, by setting their subscription status back to active. Use beehiiv Update Subscription by ID when the lookup already gave us the subscription id, and beehiiv Update Subscription by Email when acting on an address that was just matched. Every button opens a confirmation dialog that spells out exactly what will change, showing the current value and the new value, and nothing is written until the teammate confirms. Refresh the profile after a successful write so the screen always reflects reality. Keep the write surface exactly this narrow and do not add deletion or bulk actions.

Audit trail. Every attempted action writes a record in the app with the logged in teammate, the timestamp, the reader email, the subscription id, the publication, the action type, the before value, the after value, and whether it succeeded or failed. Show a recent activity section on the loaded reader's profile, and a separate full history view listing all changes across all readers, newest first, filterable by teammate and by date range. The log is append only and nothing in the interface edits or deletes it.

Handle the edge cases inline rather than with blank screens: no results, an address that exists in Stripe but not in beehiiv, an address in beehiiv with no payment record, and any API error surfaced as readable text on the panel it came from so the teammate knows which half of the picture failed to load.

Related prompts

Explore more prompts
Let support send one-off Loops emails without an engineerCustomer lifecycle inspector for Loops, Stripe and PostHogMonth-end Stripe finance pack, stored and shared in SlackRank your Intercom queue by what each customer pays youCatch the trials quietly dying before the card gets chargedWork every open Stripe dispute from one chargeback war roomLook up any customer's support, billing and CRM in one pageInvestor update studio that builds your board deck monthlySell and invoice Ghost newsletter sponsor slots in one boardSupport console that pairs Gladly chats with orders and refunds