Top Customer Concentration
Ranks the top customers by year-to-date revenue and labels each as growing, stable, or declining against last year.
Copy and customize
You are an FP&A analyst preparing a top-customer revenue view.
Context: revenue is in the {amount_field} field, customer is in the {customer_field}
field, and reporting date is in the {date_field} field. "Current year" means
year-to-date through {as_of_date}; compare against the same YTD window one year
prior.
{revenue_data}
Task: rank the top {top_n} customers by YTD revenue and label each customer's trend.
Trend labels (vs. the same YTD period last year):
- Growing: up more than {growth_threshold}%
- Declining: down more than {growth_threshold}%
- Stable: within +/- {growth_threshold}%
Output format:
- A table ranked by YTD revenue: customer, YTD revenue, share of total company
revenue, trend label.
- State that "share of total" uses total company revenue as the denominator.
- The combined share represented by the top {top_n}, with one line on
concentration risk.
- Where a customer has no prior-year figure, label it "no prior-year baseline"
rather than inferring a trend.
Guardrails:
- Use only the customers and figures in the data; do not merge, split, or
invent rows.
- Flag likely duplicate customer names (spelling or entity variants) rather
than silently combining or ignoring them.
Run it in four steps
- Export revenue tagged to a customer, with parent-child relationships resolved, covering the current and prior-year period through your reporting cutoff.
- Paste it into
{revenue_data}, set{amount_field},{customer_field}, and{date_field}to the right columns, set{as_of_date}to your YTD cutoff, and set{top_n}and{growth_threshold}to how many customers you want ranked and what swing counts as "growing" or "declining." - Run it for the ranked list with trend labels.
- Spot-check that no large customer is split across name variants, which can drop your real number one off the list.
When to reach for this prompt
Use this for a QBR, a board appendix, or any "who are our biggest accounts and are they healthy" question. The trend label is the value: a static top-10 list won't tell you a key account is quietly shrinking. It's sensitive to customer-data hygiene, so it's better suited to a business with resolved parent-child relationships than one where the same customer appears under several names.
This prompt has real limitations you should understand.
Customer-level revenue is where data hygiene problems hit hardest, because the unit of analysis is exactly the thing that is hardest to define consistently across systems. A parent and its subsidiary, a renamed account, or a CRM identifier that differs from the billing name each appears as a separate customer, so a top entry may really be two entities, or the true number one may be split across rows and miss the list entirely.
The trend label needs a like-for-like baseline that the data rarely guarantees. "Declining 21%" assumes the prior-year figure is the same customer measured the same way, and a mid-year contract restructure, or a move from monthly to annual billing, fakes a decline that is purely a timing change. The same applies if the Amount field is invoiced rather than recognized revenue, where lumpy annual invoices swing a customer between growing and declining on cadence alone.
A reliable customer ranking depends on entity resolution that ties every transaction to one canonical customer, joined across CRM and billing on a single revenue basis, before the prompt ranks anything. That join is a data-layer problem, and it is the reason customer analytics built directly on raw exports so often points attention at the wrong accounts.
What your data needs to look like
- A revenue field ({amount_field}) tagged to a customer
- A deduplicated customer field with parent-child relationships resolved
- A consistent reporting date, with a defined "as of" cutoff, covering the current and prior-year period
- A single revenue basis (recognized or billed) applied across all customers
- A growth/decline threshold decided in advance, not left for the model to guess
See how FinanceOS handles this prompt on real financial data.
Book a 20-minute walkthrough. We’ll run this exact prompt against a sample dataset reconciled through FinanceOS, and show you what changes when the data underneath is right.
Book a walkthrough