Customer story studio: turn closed won deals into case studies
A board that surfaces the customers ready for a case study, keeps the proof in one place, and builds a shareable story page when you say go.
Build me a customer story studio app for our customer marketing team. It is a board with four columns, Candidate, Approved, Drafting and Published, and every card is one potential customer story. A person moves every card by hand. Nothing in this app drafts or publishes on its own.
The Candidate column fills itself from HubSpot. Use Search Deals to pull closed won deals whose amount is at or above a minimum deal size I set in settings and whose close date is at least 60 days in the past, because results take time to show up and a story written the week after signature has nothing to prove. For each of those deals, use Search Companies to pull the associated company's name, domain, industry and headcount, and Search Contacts to pull the champion on the deal, meaning their first and last name and their job title. Every card shows the company, industry, headcount, deal amount, close date, days since close, champion name and title, and the deal owner.
Each card also holds three story inputs that the app stores itself rather than writing back to the CRM: the problem before, meaning what was broken before they bought, the quantified results after, meaning the actual numbers such as 40 percent faster onboarding or 12 hours saved per week, and a customer quote with the name and title of whoever said it. These are editable directly on the card and saved by the app, and they are deliberately the single place those details live. Any card missing the quantified results is flagged loudly, a red badge on the card in the board view and a banner at the top of the card detail, because a story without numbers is not a story. A card cannot be moved into Drafting until the quantified results field has something in it.
The columns mean: Candidate is sourced from the CRM but nobody has vetted it, Approved is a human confirming the customer will go on record, Drafting means the story page is being produced, and Published means the link is live and shared. Moving a card between columns is drag and drop, the column is persisted by the app, and the app remembers who moved it and when.
When someone drags a card into Drafting, kick off a background agent for that one card. The agent takes the CRM facts already on the card, company name, industry, headcount, deal amount, close date, champion name and title, plus the three story inputs typed into the app, and writes a customer story in the classic structure of context, problem, what changed, quantified results and the quote. It then calls Gamma's Generate a Gamma to produce a shareable webpage from that outline, not a slide deck, since a page is easier to send to a customer for approval. Gamma generation is asynchronous, so the agent polls the generation until it completes, then saves the resulting Gamma document URL onto the card. Save the document URL rather than an export link, because Gamma export links expire after about a week. Each generation costs a few Gamma credits, so the agent should run once per card and never re-run on its own.
Once the page exists, the agent uses HubSpot Create Note to write a note associated with that company record saying a customer story was produced, with the Gamma link and the headline result, so anyone looking at the account in the CRM can find it. Then it uses Slack Send a Message to post the story into our customer marketing channel with the company name, industry, the headline number and the link. When the agent finishes, the card shows the Gamma link, confirmation that the CRM note was filed, and a link to the Slack message. The card stays in Drafting until a person reviews the page and moves it to Published themselves.
Important constraint for the agent: it must not go looking for narrative material inside the CRM. The only CRM data it uses is deal, company and contact properties already loaded onto the card. Everything about the story itself comes from the three inputs captured in the app.
The board also doubles as a coverage view, and this is the reason people keep opening it. Above the columns, show a coverage panel breaking down our published and in progress stories by industry and by deal size band, for example under 25k, 25k to 100k, and over 100k, set against the closed won deals we actually have in those same buckets. Empty cells get highlighted so it is immediately obvious which segments we have zero proof for. Add a second small summary showing how many candidates are missing quantified results, since that is the real bottleneck.
Settings should let me choose the HubSpot deal pipeline and the stage that counts as closed won, the minimum deal size, the number of days a deal must have been closed before it becomes a candidate with a default of 60, the Slack channel that receives the story link, and the deal size bands used in the coverage panel. Give me a refresh button that re-pulls candidates from HubSpot on demand. Refreshing must never create a duplicate card for a deal that already has one, and it must never overwrite story inputs someone has already typed.
What does this prompt do?
- Fills a candidate column with customers worth a story: closed won deals above the size you set that closed at least 60 days ago, with industry, headcount and the champion's name and title pulled in for you.
- Keeps the three things a story actually needs on every card, the problem before, the quantified results after, and a customer quote, with any card missing numbers flagged loudly.
- Moving a card into drafting builds a shareable customer story page, saves the link on the card, files it on the company record in your CRM, and posts it to your customer marketing channel.
- Doubles as a coverage view, so you can see at a glance which industries and deal sizes you have proof for and which ones you have none.
What do I need to use this?
- A HubSpot account with your closed won deals, companies and contacts in it.
- A Gamma account on a paid plan (Pro, Ultra, Teams or Business), since the story pages are generated in Gamma.
- A Slack workspace and the channel your customer marketing team works in.
- About ten minutes to set your minimum deal size and how long after closing a customer becomes eligible.
How can I customize it?
- Change the minimum deal size and the waiting period, 60 days by default, that decides who shows up as a candidate.
- Pick the Slack channel that gets the story link, or turn the post off entirely.
- Adjust the structure and tone of the story page, or change the deal size bands used in the coverage view.
FAQs
Does anything get written or published without me?
Where do the problem, results and quote come from?
Do I need a paid Gamma plan?
Do we get a slide deck or a web page?
Will this work with our custom deal pipeline?
Related templates
Stop buying stale lists. Reps run a saved search, work the results like an inbox, and only the accounts they approve ever reach your CRM.
Pick a date, a starting point and a radius, then build a sequenced day of customer visits that lands straight on your calendar.
One screen where reps filter for companies that fit, see who is actually reachable at each account, and save only the addresses that verify.
Search creators for free, shortlist the best with your team, and spend an audit credit only when you decide someone is worth a closer look.
One screen showing invited, completed, and shortlisted counts for every open role, plus the stalled invites that have quietly gone nowhere.
See every competitor battlecard next to the number of open deals that name that competitor, so the cards carrying real pipeline get refreshed first.
Stop letting good customer stories go cold.
Set the board up once and your team always knows which customers are ready and exactly what proof is still missing.