Call feedback becomes tickets and docs
Every call recorded during the day is distilled overnight, with bugs and feature requests routed to the right team as tickets and docs, plus a Friday digest.
- TriggerTriggered
Nightly schedule
- Completed
GranolaPull the day's calls
- CompletedClaudeChatGPT
Extract only what is actionable
- CompletedLinear
Check it is not already known
- CompletedLinearNotion
File what is genuinely new
- CompletedSlack
Post the weekly digest
Every product team has the same leak. A customer describes a bug on a call, the person on the call makes a mental note, and the note does not survive the afternoon. The transcript exists, complete and searchable, and nobody re-reads a transcript. The bug gets reported again by someone else four months later and is treated as new.
Both ends of the fix already exist. Calls are transcribed automatically, and the tracker is where work is decided. What is missing is the pass over the transcripts, which is genuinely tedious and genuinely mechanical right up until the moment somebody has to decide whether a complaint is a ticket.
What you get
Bugs and feature requests raised on calls arrive as tickets on the right board with the customer's own words attached, instead of staying in a transcript nobody re-reads.
The part worth getting right
Comment on the existing issue instead of filing a new one, and this stops being a transcription tool and starts being a prioritisation tool. Filed as duplicates, one bug reported by six customers looks like six small issues nobody has time for. Collapsed onto one issue with six quotes attached, it looks like what it is. The corroboration count is the output that changes what gets built, and it only appears if the deduplication happens before the create.
Keeping the customer's exact words is not a nicety. An engineer reading "user reports session instability" has been told nothing; reading "it logs me out every time I switch tabs, so I keep a second browser open just for this" has been told the symptom, the frequency and the workaround. The paraphrase is where all three go missing, and it happens by default because summarising feels like the useful thing to do.
The bar for creating anything at all is the part most worth defending. A transcript pass with a low threshold generates plausible tickets for every offhand remark, and the tracker becomes a place where real issues are buried under speculative ones. Sending everything below the bar into the digest instead means nothing is lost, but nothing unclear reaches the board either.
The prompt
The real prompt behind the steps above — detailed enough that an agent with a people-search tool, email/phone enrichment, and CRM access can run it as written.
# Turn recorded calls into tickets
You have access to a call-recording tool, an issue tracker, a
documentation tool, and a messaging tool. Run this nightly over
**[yesterday's recorded calls]**.
## 0. Set up (skip if you're already connected)
If you don't already have live tool access for this, connect it
first. This prompt is only as real as the tools behind it:
1. Create a free account at app.tulina.ai.
2. Add Tulina's MCP server to your assistant: https://mcp.tulina.ai/mcp
3. In Tulina, connect your own API keys for the tools this
prompt uses: your call-recording tool, your issue tracker, your documentation
tool, and your team's messaging tool.
Once connected, your assistant has real tool access and the rest of
this prompt runs as written.
## 0b. Already on Tulina? Three things around the run
An account and the MCP server are not the whole setup. Two of these come
before the run below and one after it, and together they turn this from a
one-off answer into a process your workspace keeps:
1. **Activate this process's connectors first.** Call
`oto_connector(op="list")`, match it against the tools named in step 3
above, and `oto_connector(op="select", name="...")` every one that
isn't active yet. Selecting a connector does not mount its tools in the
conversation you're already in — reach them through `oto_call` for this
run, or open a fresh conversation once they're all on.
2. **Attach the work to an existing project.** `oto_project(op="list")`
shows your active org's projects: pick the one this work belongs to
rather than opening another, and keep its id. The project is where this
process, the tables it writes to and the connectors it uses hang
together.
3. **When the run is done, save it as a process — with its graph.** Write
the body with `oto_procedure(op="set", ...)`, then attach it with
`oto_project(op="link", project_id=..., target_type="procedure",
target_ref="<your slug>")`. The body has to carry a drawing: read
`oto_guide(op="read", slug="procedure-flowchart")` and follow it
exactly — ONE untagged fenced block in that grammar, opening with the
trigger and a quoted example of what you'd type to start a run. Tulina
parses that drawing back into the graph it renders as the process's
default view, which is what makes it come out in the same style as
every other process in the app; a drawing the grammar can't read falls
back to raw characters instead. Saving a process needs org-admin
rights — without them, hand the finished body to someone who has them.
The bar for creating a ticket is high on purpose. A tracker filling
with speculative tickets from transcripts is worse than one that
missed a few, because the team stops trusting the queue.
## 1. Pull the day's calls
Fetch every call recorded in the last 24 hours, with transcript,
participants, account, and date. Skip internal-only calls unless the
team explicitly wants them included; most of what makes a good ticket
comes from a customer saying it.
## 2. Extract only what is actionable
Go through each transcript and pull out items in three categories:
- **A bug.** Something behaved wrongly. Requires a described symptom,
not just dissatisfaction.
- **A feature request.** Something they want that does not exist.
Requires a stated need, not a hypothetical.
- **A documentation gap.** They could not find out how to do
something that already works.
Everything else is discarded. Praise, pricing talk, scheduling and
general grumbling are not tickets.
Keep the customer's own words as a quote for each item, with the call
date and who said it. That quote is the payload; a ticket paraphrased
into internal vocabulary loses the specificity that made it worth
filing.
Apply one filter before anything is created: would a person reading
only this item know what to do next? If not, it goes into the digest
as an unclear signal rather than into the tracker as a ticket.
## 3. Check it is not already known
Search the tracker for each item before creating anything. Match on
substance, not wording: a customer describing "it logs me out when I
switch tabs" and an open issue titled "session dropped on visibility
change" are the same bug.
When it already exists, do not create a duplicate. Add the quote and
the account name as a comment on the existing issue, which is how a
team learns that one bug has now been reported by five customers.
## 4. File what is genuinely new
Create the ticket on the board that owns that area, with:
- A title describing the symptom, not the guessed cause.
- The customer quote, the account, and the call date.
- A link back to the recording.
- Severity from what was actually said. A customer describing a
workaround they now perform daily is high; a passing mention is not.
Documentation gaps go to the documentation tool as a page stub rather
than to the tracker, so they do not compete with engineering work in
the same queue.
## 5. Post the Friday digest
Once a week, post a summary rather than a nightly stream: new tickets
by area, existing issues that gained corroboration and how many
customers have now reported them, documentation gaps opened, and the
unclear signals that did not meet the bar.
The corroboration count is the most useful number in the digest. One
customer mentioning something is an anecdote; the same issue reported
by six accounts in a fortnight is a priority, and that only becomes
visible when comments are attached to one issue rather than spread
across six duplicates.
## Output
Report: calls processed, items extracted by category, items matched to
existing issues, new tickets created by board, documentation stubs
opened, and items held back as unclear.
Questions about this process
Related processes
- Prepare for a customer call
Before the call, the last conversations, the account's state, how the product is actually being used, and where their requested features stand, in one brief.
- Merged PRs move tickets and post a digest
Every pull request that lands gets matched to its ticket, moved forward on the board, and rolled into one summary for the team.
- Triage and route bug reports
An incoming report is read, matched against open issues to catch duplicates, and filed to the right team's board with severity attached.