Customer Journey Analyzer
Note from the creator
Why I built it
“Built because one email never tells the full story. Pull everything, analyze it all, flag what matters.”
What it does
Give this skill a single customer's email address and it retrieves their entire conversation history from your connected support data through Rippit. It builds a worksheet of every conversation for that customer, then enriches each row with AI columns you define — a plain-language summary, a structured inquiry summary, a request-type classification, a closure-intent check, and a risk level scored against the categories you set. From the enriched data it produces two breakdowns: interaction themes grouped by what the customer contacted about, and a flag report surfacing the signal categories you care about, each with a verbatim quote and severity. The finished analysis is presented back to you in the chat, including a customer overview, per-conversation results, and a one-line risk posture.
How it works
- 1
Reads the conversations
Confirms the customer's email, then reads every conversation for that address through the Rippit connector.
- 2
Enriches and scores each row
Adds AI columns for summary, inquiry, request type, closure intent and a risk level using your own categories and rules.
- 3
Delivers the breakdown
Returns a themed interaction breakdown, a flag report with quotes and severity, and a one-line risk posture.
How It Looks
See the reply this Skill builds, before you download it.
Run customer history read-out on last week.
▸RippitReads the customer's full all-time conversation history filtered by their email address through the Rippit connector✓
▸RippitBuilds a filtered worksheet and enriches every row with five AI columns for summary, closure, inquiry, risk, and request type✓
▸ClaudePresents a customer overview, per-conversation results, a themed interaction breakdown, and a Legal/SE/PG flag report with risk posture✓
Customer Analysis — hopper@bullrushbank.pond
Customer Overview
- Total conversations: 14 — all-time
- Date range: Mar 2023 – Feb 2024 — earliest to latest
- Business unit: Pond Memberships — from `brand_unit`
Customer: hopper@bullrushbank.pond — 14 conversations across the Pond Memberships and Fly Delivery units.
Per-Conversation Results
| Conv ID | Date | Inquiry | Risk | Closure |
|---|---|---|---|---|
| #4821 | 2024-02-11 | Lily pad billing dispute | High | No |
| #4610 | 2024-01-03 | Fly delivery late | Medium | No |
| #4402 | 2023-11-19 | Wants to close membership | High | Yes |
| #4188 | 2023-09-02 | Tadpole onboarding help | Low | No |
Breakdown 1 — Interaction Themes
| Theme | Count | Date range | Pattern |
|---|---|---|---|
| Billing disputes | 5 | Sep–Feb | Repeated lily pad overcharges |
| Fly delivery delays | 4 | Mar–Jan | Late deliveries to north pond |
| Membership changes | 3 | Nov–Dec | Escalating toward closure |
Breakdown 2 — Flag Report
| Type | Conv ID | Severity | Summary |
|---|---|---|---|
| Closure intent | #4402 | High | Clear unretracted request to close |
| Frustration | #4821 | Medium | Angry over repeat billing error |
| Churn signal | #4610 | Low | Mentioned rival pond |
Reply to Claude…
+⚙Claude Opus 4.8 ▾↑
Claude can make mistakes. Please double-check responses.
Illustrative preview, generated from the generic version of this Skill. The layout is real; the pond-side data is made up.
The Skill
Skill contents
---
name: customer-email-history-analyzer
description: "Given a single customer's email address, pull ALL their conversations through Rippit, enrich each with a configurable set of AI columns (summary, inquiry summary, request type, closure intent, risk level), then produce a themed interaction breakdown and a flag report over the signal categories the user defines. Use when someone sends a customer email address (or a forwarded email containing one) and wants a full-history view of that one customer rather than a single message read. Delivers a customer overview, per-conversation results, and a one-line risk posture in the chat."
---
# Customer Email History Analyzer
This skill takes a customer email address, retrieves their full conversation history through Rippit, enriches it with a configurable set of AI columns, and delivers a structured analysis of that customer.
## First run — make it yours
Before asking anything, LOOK at what is actually connected:
1. Call `list_data_sources` and list what the user has.
2. Pick the conversations source and `describe_table` it. Identify: the column that holds the customer's email/identifier, a timestamp column, a conversation-id column, a topic/category column, and any brand/business-unit column.
3. If there is no column that identifies a customer by email, say so plainly and ask how to proceed rather than running into a dead end.
Then ask ONE question at a time, leading with what you found and proposing a default:
- Confirm `{{customer_identifier_column}}` — the column to filter on to find all of one customer's conversations.
- Confirm `{{enrichment_columns}}` — which AI columns to add. Default set: a plain summary, a closure-intent check, a structured inquiry summary, a risk level, and a request type.
- Establish `{{risk_categories}}` — the risk levels and their definitions the risk column uses.
- Establish `{{flag_categories}}` — the signal categories the flag report scans for.
- Confirm `{{brand_grouping_column}}` — the column (if any) to group the overview by.
Restate the filled-in bindings for confirmation, then run. On later runs, reuse them unless the user asks to change them.
---
## Step 1 — Extract the customer email
From the user's input, identify the customer's email address. If the input is a forwarded email, look for the original sender's address. If multiple addresses are present, ask which one is the customer. Do not proceed until you have a confirmed email address.
---
## Step 2 — Find all conversations for this customer (all time)
1. Call `list_data_sources` to find the conversations table.
2. Call `describe_table` to confirm the schema and locate `{{customer_identifier_column}}`.
3. Call `aggregate_table` with a filter on `{{customer_identifier_column}}` to confirm how many conversations exist. State the count before proceeding.
4. Call `create_worksheet` filtered to that customer's identifier — no row limit, no sample. Title it: `Customer Analysis — [customer email]`. This captures full all-time history.
5. Call `read_table` on the new worksheet to confirm rows landed. If empty or still hydrating, wait and retry once.
---
## Step 3 — Enrich with AI columns
Call `enrich_worksheet` on the worksheet with all of `{{enrichment_columns}}` in a single call (cost scales with rows, not columns — batch them). For each column, use a prompt of this shape, written against the user's own categories:
### Summary
Write a 2-3 sentence summary covering what the customer contacted about, what action was taken (if visible), and the outcome. Base it only on the transcript; do not infer back-office actions. Internal notes are background only; bot replies are not agent conduct; summarize by meaning regardless of language. Output: plain paragraph.
outputType: `{ "type": "string" }`
### Closure intent
Detect whether the conversation contains a request to close, deactivate, or permanently restrict the account, as the user defines closure. Require clear, unretracted intent assessed at end of conversation. Output:
```
{ "classification": "Yes" | "No" | "Not enough information", "confidence": "High" | "Medium" | "Low", "key_evidence": "[verbatim quote, max 2 sentences, or empty]" }
```
outputType: `{ "type": "string" }`
### Inquiry summary
Summarize in structured form based on the final state of the conversation. Output:
```
{ "date": "[first message date or 'not specified']", "type": "[channel or Unknown]", "inquiry": "[one sentence]", "outcome": "[one sentence or 'unresolved']", "confidence": "High" | "Medium" | "Low", "key_evidence": "[verbatim quote, max 2 sentences]" }
```
outputType: `{ "type": "string" }`
### Risk level
Classify the interaction risk using the categories and definitions in `{{risk_categories}}`. Apply a clear priority hierarchy (highest category wins), disambiguation rules the user supplied, and evaluate at end of conversation (frustration resolved by end = lowest applicable level). Output:
```
{ "classification": "[one of {{risk_categories}}]", "confidence": "High" | "Medium" | "Low", "key_evidence": "[verbatim quote, max 2 sentences]" }
```
outputType: `{ "type": "string" }`
### Request type
Classify the primary request type — closure-type vs. other vs. not enough information — based on the final state of the conversation, ignoring retracted or incidental mentions. Output:
```
{ "classification": "[request-type label]", "confidence": "High" | "Medium" | "Low", "key_evidence": "[verbatim quote, max 2 sentences]" }
```
outputType: `{ "type": "string" }`
After calling `enrich_worksheet`, call `get_enrich_status` and loop until `done: true` before proceeding.
---
## Step 4 — Read enriched data
Call `read_table` on the worksheet to pull all rows with: the conversation id, the timestamp, `{{brand_grouping_column}}`, the topic/category column, and all enriched column IDs (from `get_enrich_status`). Paginate until `truncated: false`.
---
## Step 5 — Breakdown 1: Interaction Themes
Group conversations by theme using the inquiry summary and summary text. For each group: Theme, Count, Date range (earliest to latest timestamp), Conversation IDs, and a one-sentence pattern summary.
---
## Step 6 — Breakdown 2: Flag report
Scan every row's risk classification, closure intent and inquiry summary for the categories in `{{flag_categories}}`. For each flag: Type (one of `{{flag_categories}}`), Date, Conversation ID, one-sentence summary, verbatim Quote from the key_evidence field, and Severity (High = highest-risk row, explicit; Medium = mid-risk or ambiguous, needs review; Low = weak contextual signal). If none: state "No signals identified across all conversations."
---
## Output structure
1. **Customer overview** — email, total conversations, date range, values of `{{brand_grouping_column}}`.
2. **Per-conversation results** — one row per conversation: id, date, inquiry summary, risk, request type, closure.
3. **Breakdown 1 — Interaction Themes**
4. **Breakdown 2 — Flag report** (sorted High → Medium → Low)
5. **One-line risk posture**.
Be direct. Name flags clearly with evidence. Do not fabricate data.
Rippit
Claude