Firebase support desk with account actions and Stripe billing

Your support team types an email, phone, or user id and sees that person's account, app data, and billing on one screen, with the fixes they used to escalate.

App
FirebaseStripeSlack BotCustomer SupportEngineeringResearch & MonitoringNotifications & Alerts
PromptCreate

Build me an internal support desk app for our Firebase-backed product. A support agent opens it, types a customer's email address, phone number, or Firebase uid into a single search box, and gets that one person's entire account on one screen, so the team stops pinging an engineer for every lookup.

The search resolves the identifier against both systems at once. Use Firebase Look Up Auth Users to find the auth record by uid, email, or phone number. Use Stripe Search Customers with a query on the email to find the billing record. Handle mismatches plainly instead of erroring out. If the person exists in Firebase but no Stripe customer matches, render the profile normally and put a line on the Billing tab saying no Stripe customer was found for this email, with the email shown so the agent can go check Stripe by hand. If a Stripe customer matches but no Firebase auth user does, show a billing-only view with a banner explaining that this customer pays us but has no app account under that address, which usually means they signed up with a different email. If several Stripe customers share the email, list them and let the agent pick which one to view.

The page header is the Firebase Auth record: display name and photo if present, email with a verified or unverified badge, phone number, the uid with a copy button, the sign-in providers on the account (password, Google, Apple and so on), the created date, the last sign-in date, and an unmissable enabled or disabled state. Any custom claims already set on the account render as chips in the header, since those claims are the entitlements support cares about.

An App data tab lists that person's records from the Firestore collections we care about, keyed by their uid. Use Get Firestore Document to fetch their main user document (usually users/{uid}) and show it at the top of the tab, then use Run Firestore Query with a filter on the uid field for each configured collection, ordered newest first with a small limit, rendering each collection as its own section with a readable table and a raw JSON toggle for the awkward nested fields. Which collections appear, and which field holds the uid in each one, must be configurable in a settings screen rather than hardcoded, because every app names these differently.

A Billing tab shows the Stripe side. Use List Subscriptions filtered to the customer for the current plan, its status, and the renewal or cancellation date. Use List Invoices filtered to the customer with a limit of twelve for recent invoice history, each row showing amount, date, and a paid, open, or failed badge with the failure reason where Stripe provides one. Use List Refunds for the customer so an agent can immediately see whether this person has been refunded before. Stripe returns amounts in the smallest currency unit, so format them as real money everywhere. If our Firestore already mirrors Stripe data, which it does when the official Run Payments with Stripe extension is installed and writing customers/{uid} documents with subscriptions and invoices underneath, read those mirrored documents as well and show them next to the live Stripe data, flagging anything that disagrees.

An Actions panel handles the four things support always has to escalate for. First, disable or re-enable the account using Firebase Update Auth User, behind a confirmation dialog with a required reason. Second, grant or remove an entitlement by setting a custom claim, also with Update Auth User: a small form where the agent picks a claim key from a configured allow list, such as a plan tier or a beta flag, and sets its value. Setting a claim must merge with the existing claims rather than overwrite them, and the UI should say that custom claims reach the customer's device within about an hour or on their next sign-in, so agents stop asking why nothing changed instantly. Third, send that one person a push notification: read the device token off their user document and use Send Push Notification (FCM), with title and body fields and a preview of what the customer will actually see. Fourth, issue a full or partial refund with Stripe Create Refund, launched from a specific invoice or charge row rather than a free-floating form, requiring the agent to type the word REFUND to confirm, choose full or a partial amount, and write a reason.

Every action writes an audit document using Create Firestore Document into a support audit collection: the action taken, the target uid and email, the before and after values, the reason the agent typed, the name and email of the signed-in agent taken from the app viewer, and a timestamp. No action happens without its audit document. The profile renders the most recent audit entries for that customer inline, so an agent can see the last handful of things done to this account before touching anything.

Refunds above a configurable ceiling are blocked rather than executed. When an agent requests one, the app does not call Stripe at all. It posts a full context card to a Slack channel using Slack Bot Send a Message: the customer's email and uid, the charge and invoice details, the amount requested, the reason the agent gave, the account's refund history, and the plan they are on, so a manager has everything needed to approve or decline from that one message. The app tells the agent plainly that the request went to a manager for approval, and writes the same audit document with a blocked status.

Add an Investigate this account button that starts a background agent scoped to that customer. The agent reads the Firebase Auth record with Look Up Auth Users, the person's recent Firestore documents across the configured collections with Run Firestore Query, their billing history with List Invoices, List Subscriptions and List Refunds, and the existing support audit entries, then writes a plain-English timeline of what has happened to this account: when they signed up and how, what they did in the app, when payments failed, what support already changed and why, and the most likely explanation for whatever they are complaining about now. It writes that timeline with Create Firestore Document into a Firestore support notes collection, keyed by uid with a timestamp and the name of the agent who started it. The profile renders those support notes inline in reverse chronological order, so the next agent who opens this account sees what already happened instead of starting from zero. Show a running state on the button and refresh the notes list when the agent finishes.

A settings screen holds the configuration: which Firestore collections appear on the App data tab and the uid field name in each, the paths for the support audit and support notes collections, the field on the user document that holds the push device token, the allowed custom claim keys and values, the refund ceiling amount, and the Slack channel for manager approvals.

Design it for speed in a support queue: one search box that accepts any of the three identifiers, a dense profile that mostly fits without scrolling, tabs rather than accordions, human dates and formatted money everywhere, and destructive actions visibly separated from safe ones. A read failure on one tab must never blank the page: show what loaded and say plainly which part could not be fetched.

What does this prompt do?

  • Search by email, phone number, or user id and get one profile page: how they sign in, when they joined, when they were last seen, whether their email is verified, and whether the account is switched off.
  • Two tabs beside it: the records that person has in your app's database, and their billing, with the current plan, the renewal date, and their last twelve invoices marked paid or failed.
  • An actions panel that covers the four things support normally hands to an engineer: switch an account off or back on, grant or remove a plan tier or beta flag, send that one person a push notification, and refund a charge behind a typed confirmation and a written reason.
  • An Investigate this account button that hands the case to an assistant, which reads the account, the recent app records, and the billing history, then writes a plain-English timeline into the profile so the next person to open it sees what already happened.

What do I need to use this?

  • A Firebase project holding the user accounts and app data your team needs to look up
  • A Stripe account for the billing tab and refunds
  • A Slack workspace if you want large refunds routed to a manager for approval
  • The names of the app collections that matter to support, such as user profiles, orders, or subscriptions

How can I customize it?

  • Set the refund ceiling: anything above it is blocked and posted to Slack for a manager instead of going through
  • Choose which app collections appear on the data tab and how many records each one lists
  • Decide which entitlements support can grant on their own, such as plan tiers or beta flags, and which stay locked to engineering

FAQs

Do support agents need a Firebase or Stripe login to use this?
No. That is the point of it. The app holds the connections centrally, so agents work in one screen built for support instead of being handed developer access to your project and your payments dashboard.
What stops someone issuing a huge refund by mistake?
Refunds sit behind a typed confirmation and a required written reason, and you set a ceiling amount. Anything above the ceiling is not sent to Stripe at all. Instead the app posts the full context, including the customer, the charge, the reason, and their refund history, to a Slack channel so a manager can decide.
How quickly does a plan change or beta flag reach the customer?
Entitlement changes generally reach the customer's app within about an hour, or immediately the next time they sign in. The app says this on screen so agents stop wondering why nothing changed the second they clicked.
What happens if a customer exists in Stripe but not in our app, or the other way around?
The app says so plainly rather than showing an error. You get the half it can find, plus a clear note explaining that no matching account or no matching billing record was found for that email, which usually means they signed up with a different address.
Will we have a record of what support actually did?
Yes. Every action writes an audit entry naming the agent who did it, what changed, and the reason they typed. The recent entries show up right on the customer's profile, so the next person can see the last few things done to that account.

Related templates

Share of voice dashboard for your brand and competitors

See how your brand's news coverage and sentiment stack up against four competitors, then let an assistant write the weekly report for you.

GDELT
Notion
Slack Bot
App
Approval war room for every social post awaiting sign-off

One screen showing every social post waiting on approval, sorted by deadline, so reviewers can approve or reject without leaving the page.

Hootsuite
Slack Bot
App
Turn champion job changes into new pipeline in Attio

Every Monday, find the past champions and closed-won contacts who changed jobs, update Attio, and get the moves worth chasing in Slack.

Boomerang
Attio
Slack Bot
Agentic Task
Collect social post requests and schedule them in Hootsuite

Staff submit what happened, your social manager edits the copy, picks the accounts and puts it on the calendar without a single spreadsheet.

Hootsuite
Slack Bot
General Input Database
App
Voice agent QA review board for your Hume EVI calls

Open one board each morning, see which voice calls went badly, replay the exact moment the caller got frustrated, and file the fix.

Hume
Linear
Slack Bot
App
Clear your Guru verification backlog in one weekly app

A personal queue of every overdue Guru card, sorted by how late it is, with one-click verify, reassign, comment, and an agent that drafts the refresh for you.

Guru
Slack Bot
App

Stop pinging an engineer to look up a customer.

Give your support team one screen with the account, the app data, the billing, and the four fixes they always have to ask for.