Workana returns a client rating on every single project. That means “client rating: 100% coverage” would be a true sentence to put in documentation. It would also cause anybody who believed it to throw away four fifths of the market.
The number, and what it is not
80.5% of client ratings are 0.00, and 0.00 means the client has no ratings yet. It does not mean they were rated zero. There is no way to tell the two apart from the number, and there is no way to tell that the number is doing double duty from looking at it.
So every row also carries:
client_has_rating— the boolean that separates the cases.client_rating_raw— Workana's original string.
Why an encoded absence is worse than a null
A null announces itself. Any competent pipeline handles it, and if it does not, it usually fails loudly.
A zero passes every check. It is the right type, it is in range, it survives validation, it aggregates cleanly — and it means something entirely different from what it appears to mean. The query WHERE client_rating >= 4 looks like quality filtering and is mostly history filtering.
The flag that fixes it
-- Clients with a track record, rated well
SELECT * FROM projects
WHERE client_has_rating = true AND client_rating >= 4.5;
-- Clients with no history — the majority, and not the same thing as bad
SELECT * FROM projects
WHERE client_has_rating = false;The second query is the one worth running once, because it shows you how much of the market the first one excluded. Four fifths is a lot to discard by accident.
Reporting coverage honestly
The documented figure for client_rating is 19.4%, not 100%. That is the principle this project applies throughout: coverage is how often a field carries useful information, not how often the key exists.
Two other fields on the same row follow the same rule. client_payment_verified is true on 18.9% — present everywhere, meaningful when true. is_hourly is true on 11.7%. Reporting those as “100% coverage” would be equally true and equally useless.
The client signals that do work
| Field | Useful | How to read it |
|---|---|---|
client_country_code | 100% | Always there. The most reliable dimension in the dataset. |
client_payment_verified | 18.9% true | A real positive signal when set. Absence is not a negative. |
client_has_rating | 100% | The gate for any rating filter. |
client_rating | 19.4% | Only meaningful with the gate applied. |
last_client_message_raw | 51.7% | Presence suggests an engaged client. |
client_plan | 0.4% | Too rare to build on. |
Practical filtering
For finding good clients to work with, the useful combination is client_payment_verified = true plus a fresh total_bids that is still low — a verified client whose project has few proposals is a better opportunity than a highly rated client whose project already has thirty.
And since proposal counts move within hours, that filter only works on fresh rows. Set maxCacheAgeHours: 0 when the decision is whether to bid.


