Moderation
A queue of rows waiting to be approved. Switch it on for a table and everything created there arrives for review instead of going straight out.
Turning it on
One switch on the table: Moderated.
The rows themselves are marked by a column, moderation_at — the moment the row entered the queue. That is the whole mechanism: a stamp, not a status field with three values.
The queue
PageBlocks → Moderation lists everything waiting, across all moderated tables. Each entry names the object and its author, so a moderator does not have to open a row to know what it is.
Approving stamps the row as reviewed; from then on it behaves like any other.
A table without the column still works
moderation_at is added by a migration, and a table created before it does not have the column. Rather than failing, the component falls back to a time window: rows newer than N days count as the queue, older ones as the archive.
Which is why the queue can look odd on an old table
Without the column there is no record of when something was reviewed — only of when it was created. On such a table an approved row eventually drops out of the queue by age rather than by decision. Adding the column fixes it retroactively for new rows.
What moderation is not
It does not hide the row from the front end. A row in the queue is still a row: if your template lists it, visitors see it.
If moderation should mean "not visible yet", pair it with publishing — create unpublished, publish on approval. The queue tracks review; published_at tracks visibility. Keeping them separate is deliberate: an edit to an approved row can go through review again without disappearing from the site meanwhile.