Skip to content

Top Customer Concentration

Ranks the top customers by year-to-date revenue and labels each as growing, stable, or declining against last year.

Workflow · Strategic & Ad-Hoc | Role · FP&A Analyst | Intermediate | Updated Aug 4, 2026
The prompt

Copy and customize

prompt.txt
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.
Open in
We’ll copy the prompt and open the chat.
How to use

Run it in four steps

  1. Export revenue tagged to a customer, with parent-child relationships resolved, covering the current and prior-year period through your reporting cutoff.
  2. 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."
  3. Run it for the ranked list with trend labels.
  4. Spot-check that no large customer is split across name variants, which can drop your real number one off the list.
When to use

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.

Limitations · Worth knowing

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.

Prerequisites

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 it run on real data

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
Be in the know

Join the FinanceOS Hub.

We add new webinars, prompts, and live events regularly. Leave your email and we'll reach out when something relevant drops.