Customer Service Quality Index
A per-company support quality score blended from public review and complaint data, plus an aggregated reviews stream.
The Customer Service Quality Index (CSQI) gives you an at-a-glance read on how well a company actually treats its customers — before you spend an hour on hold finding out the hard way. It blends review and complaint data from multiple public sources into a single 0–100 score with a letter grade.
Two new tabs in the side panel power the experience:
- Quality — the score, the letter grade, and what went into it.
- Reviews — the actual reviews and complaints behind the score, filterable by source.
Both tabs only appear in the rail when there's something to show. If a company isn't tracked in our quality index, the Quality tab is hidden; if no reviews have been pulled yet, the Reviews tab is hidden. As soon as data appears for a company, the corresponding tab shows up automatically.
Quality tab
The hero of the panel is a large A–F grade with the underlying score (0–100) and a 90-day trend arrow. Grades use a familiar scale:
| Grade | Score | Meaning |
|---|---|---|
| A | 90+ | Excellent |
| B | 80–89 | Good |
| C | 70–79 | Average |
| D | 60–69 | Below average |
| F | < 60 | Poor |
Below the hero, What goes into this score breaks down each contributing source — what it measures, the value it contributed, and how heavily it was weighted. If a source has no data for this company, it's marked Unavailable and the remaining sources' weights are renormalized so the missing data doesn't unfairly tank the score.
The footer shows the company's industry and when the score was last refreshed. Click the refresh icon to re-pull (this doesn't count against your daily quota).
What the sources measure
- Trustpilot — Star rating from verified Trustpilot reviewers, weighted by review count. We pull confidence toward neutral when a company has very few reviews so a single 5-star review doesn't paint a false picture.
- Google reviews — Star rating from Google Maps reviewers, weighted the same way as Trustpilot. We auto-discover the business profile from the company name + website on the first refresh; no admin setup required.
- CFPB complaints — Volume of complaints filed with the U.S. Consumer Financial Protection Bureau over the last 90 days, ranked against other companies in the same sector. More complaints = lower percentile = lower score.
- Reddit mentions — Recent posts that mention the company across all of Reddit. In v1 these are surfaced in the Reviews tab as additional context but don't contribute to the blended score — we want to validate that per-company queries return useful posts before we trust the signal enough to weight it. A future release will add sentiment analysis or engagement scoring at a planned weight of 0.10.
Future versions will add ACSI, Better Business Bureau, and app-store ratings.
Source weights
| Source | v1 weight | Notes |
|---|---|---|
| CFPB | 0.22 | Sector-relative percentile |
| Trustpilot | 0.13 | Stars × review-count confidence |
| 0.10 | Same normalizer as Trustpilot | |
| 0.00 → 0.10 | Display-only in v1; planned weight after v2 scoring |
Weights are renormalized over only the sources that actually returned data for a given company, so a missing source doesn't tank the result.
Per-company configuration
Most external-source identifiers are auto-discovered or seeded — you don't
need to configure anything per company. The exceptions, all stored in
csqi_companies_meta, are:
cfpb_company— the legal name CFPB uses (e.g."BANK OF AMERICA, NATIONAL ASSOCIATION"). Seeded by an internal script.trustpilot_id— Trustpilot's business unit ID. Seeded by the same script.google_place_id— auto-discovered from name + website on first refresh and cached.reddit_query— auto-derived as"<Company Name>"(quoted phrase) on first refresh and cached. Admins can overwrite this row to refine noisy queries (e.g. addcomplaintfor a brand whose name is a common word, or scope to a specific subreddit withsubreddit:foo).
Self-hosted deployments
If you're running your own Supabase project, set these secrets before
deploying csqi-refresh-company:
TRUSTPILOT_API_KEYGOOGLE_API_KEYREDDIT_CLIENT_ID,REDDIT_CLIENT_SECRET,REDDIT_USER_AGENT— register a "script" type app atreddit.com/prefs/apps. The user-agent must identify your deployment, e.g.teleperson-csqi/1.0.
Each integration short-circuits silently if its credentials are missing, so you can roll out sources one at a time.
Reviews tab
The Reviews tab shows the actual reviews and complaints behind the score.
- Source filter — Pills at the top let you narrow to All, Trustpilot, Google, CFPB, or Reddit. Counts on each pill show how many items are cached for that source.
- Review cards — Each card shows the source badge, rating (Trustpilot and Google), date, title, body excerpt, and a link to view the original on the source site.
- Google reviews link to the Google Maps page for the business; per Google's terms of service, review fields are refreshed at least every 30 days.
- CFPB complaints are shown with redacted-by-CFPB consumer narratives and link back to the official CFPB complaint detail page.
- Reddit mentions show the post title, a snippet of the body (or a
pointer to the source for link posts), and the author/subreddit
(
u/someone in r/personalfinance). The link opens the original Reddit thread.
Reviews are cached snapshots from third parties — the source link is the authoritative copy.
How scores are computed
Scores are computed daily for our top tracked companies and on-demand for others. When you open the Quality tab on a company we don't have a recent score for, you'll see "Scoring this company…" while we pull fresh data — this usually takes under a minute. Keep the panel open and the score will appear.
The 90-day trend compares the current 7-day moving average of scores against the 7-day moving average from 90 days ago, so single-day spikes don't make the trend arrow bounce around.
Free vs Pro
The free plan includes 5 quality lookups per day. Pro removes the cap. Reviews aren't gated — once you've looked up a company, you can browse its reviews freely.