AppdorTry it

We read 666 complaints about four competitors. Here is our scoreboard.

Research · 6 min read

We did not run a survey. Nobody answers a survey from a vendor honestly, and the questions would have been ours rather than theirs.

Instead we read what people had already written, unprompted, to each other. 666 complaint sentences out of 89 threads across r/Airtable, r/Notion, r/smartsheet, r/mondaydotcom, r/nocode and r/selfhosted — deduplicated and hand-clustered into 142 distinct complaints. Then we went through them one at a time and asked a narrower question than "could we build this?": does the product, as it exists in the repository today, answer this specific person?

The scoreboard

Complaints
✅ Answered — mechanism found, cited, and where possible exercised6646%
⚠️ Real, but narrower than the complaint5740%
❌ Looked for; not there43%
➖ Cannot apply to us structurally1511%

Forty-six per cent is not a number a marketing department picks. We are publishing it because the alternative — quietly reporting the ✅ column and calling it 142 — is the behaviour that made these threads worth reading in the first place.

The middle column is the honest one

⚠️ means we do something adjacent, and it is not what this person asked for. It is 40% of the corpus, and it is where a migration actually goes wrong, because it is the column a demo hides.

Three of them, stated as plainly as we can:

"Two people can't work in the same workspace simultaneously." Other people's committed cell edits merge into your open grid in about a second, by polling a permission-masked change stream. That is genuinely useful and it is not real-time collaboration: there are no websockets, no shared cursors and no co-typing. If you are picturing two cursors in one cell, we do not do that. It also needs the Pro tier.

"Annoying to pay extra for every little addition." No view, chart, field type or dashboard is behind a plan — that part is true and we will keep saying it. But ten features are tier-gated, six of them by database triggers, and since gating defaults to on even for self-hosters, an unlicensed docker compose up runs a free tier with real caps on it. Somebody objecting to metering in general is not answered by us. They are answered by a different product.

"Not being able to nest conditions is the most egregious." This one stung, because a version of it had already appeared in our own copy. The condition model round-trips nested AND/OR groups now. The builder still gives an author no way to create a group — a nested condition arriving from the API is shown read-only rather than silently flattened, which is the safe half of a fix, not the whole one.

The audit was wrong in both directions, and the pattern was not what we expected

The first pass was done by reading source, and it was corrected on re-check in both directions. We had assumed the errors would cluster in one place. They did not — they inverted.

It was too harsh on the craft work. It reported that no accessibility work existed. There are four axe-core suites and two contrast gates; run against a live stack, 15 tests pass across the logged-out site, the app navigation, record detail with a keyboard-only traversal, and the workflow builder in both skins. It also missed the theming engine entirely, and marked the mobile client as something it was not.

It was too generous on the commercial claims — and those turned out to be the weakest rows in the whole document. "Nothing is metered" is false. And one row claimed our API rate limit beat Airtable's; the documented write budget was 60 requests a minute, which is a fifth of the limit those threads complain about, with no recorded reason for the number. It is 300 now. It should never have shipped as a boast.

The lesson we did not want: the rows we were most confident about were the commercial ones, and confidence was inversely correlated with accuracy.

Reading your own code is not the same as using your product

Everything above was established by reading source and querying the database. Then we opened a browser, signed in, and did the thing the complaints describe.

Two defects turned up in the first hour, and both were invisible to source reading. One of them was in a feature this very document had already marked ✅.

Turning the workspace AI switch off removed every AI affordance we knew about — and left an "AI" button sitting in the application toolbar, plus a "Create with AI" button on the applications header. There was a test for exactly this. It walked the inventory and asked, for each listed surface, whether its file still carried the marker. Nothing walked the other direction, so a surface nobody had listed lived in a file nobody opened. Both buttons were static markup in index.html, which the inventory had no reason to name.

The fix is a line of code. The finding is worth more: a test that only walks from your list to your tree can only ever confirm your list.

The four we do not answer

Three of them are the same decision seen three times — the product is metered and tier-gated, and that is precisely what those users were objecting to. Changing it is a pricing call, not a bug, and we are not going to describe it as coming soon. The fourth wants the codebase itself as an escape hatch; the repository is private and carries no licence.

We would rather write that paragraph than have you find it in month three.

What we changed about how we write

Two rules came out of this, and they are enforced rather than intended.

The counts in our marketing copy are not typed by a person any more — a post writes a placeholder and the build substitutes the answer from the registry the product itself dispatches on. Competitor prices come from the same table the migration calculator bills against. That is how a homepage ends up advertising eight chart types after seventeen more have shipped: not dishonesty, just a digit somebody typed once.

And the scoreboard above is recounted from the audit's own tables by a test, because the first version of that document reported 131 complaints when its tables held 142. An audit that cannot count itself is not evidence. It is a mood.