Skip to content
Hazelsong is still being built.Skip to content
Hazelsong

Read and decide

The plain ones approved, the rest waiting with a reason

Most testimonials are plain: a customer, through your own form, saying what happened, with nothing flagged. Switch on automatic moderation and those are approved as they arrive. Everything else waits in Pending with the reason it waited, and a log shows what it approved and why.

PlanStarter and Pro, the plans that carry AI readings; the free plan carries none, so it cannot be switched on there. Each testimonial it reads uses one AI reading from the month's allowance printed on the pricing page, on top of the reading for risk on arrival; one that fails a check first uses none. When the month's readings are spent, new testimonials wait in Pending.

How it works

Automatic moderation, step by step

  1. Every check before anything is spent

    It looks only at testimonials written through your collection or interview form, from a page that told the writer it could be approved by an automatic check, with permission for a public place. They must have been read for risk on arrival with nothing flagged and no reply owed, and be typed words only: no video, voice recording, photo or picture. No reward may be attached, the writer's address must have been checked and not flagged, and it must not be a repeat or rated 3 stars or fewer. The writer's name must not be a placeholder such as "Your name", "John Doe" or "Test", in any of the five languages it reads, nor read as a sentence, a review, a link or a business, such as "Five Stars From Me", a web address or a name ending in "Ltd". The words must carry no link, email address, phone number or @handle, and neither may the name, role or company: a check with fixed rules holds those before any reading, so nothing the writer types can talk it out of holding. One that fails a check is left for you at no cost.

  2. A second reading, made only for this

    One that passes is read once more, by a model asked a single question: may these exact words, with this name, be published as written without a person reading them first? It answers publish, or hold with reasons from a fixed list: a complaint, a promised result, a regulated claim, another person or company named, a private detail, not genuine, offensive, off topic, unclear, a name that is not the writer's own. The question also says what is not a reason by itself, with examples in English, Spanish, Portuguese, French and German: clear words in any language, a relative or friend of the writer with no name, a pet, your staff by role or by a first name alone, the writer's own company, a visit, operation, check-up or repair told as the writer's own with no outcome claimed, and a minor reservation inside praise rated 4 or 5. A private person who could be identified, your staff named in full, another company, and a cure or other health, legal or financial outcome stated as fact are still reasons to hold.

  3. Read strictly, so a doubt is a hold

    The model answers by filling in a fixed form, decision and reasons, that the AI provider holds it to, never in its own words. Only one finished answer in exactly that shape, with the model's usage reported, can approve. A written-out, cut-off, partial or unknown answer leaves the testimonial in Pending, and so does a model that did not answer.

  4. Applied only to what it read

    The approval is written in one step that first checks nothing changed: not the words, the name, the permission, the status, nor your setting. If a person acted, the writer withdrew permission or you switched it off while it was reading, nothing is applied.

  5. A log of what it decided, and what is waiting

    The Automatic moderation panel in your dashboard lists what is waiting to be checked, with its attempt and when it is tried next, and each decision, newest first, with its reasons and a button to open the testimonial. Each card says what it decided, and the testimonial's history records it. Return any of them to Pending or reject it as you would any approval. One left for you because the check could not run has a button to run it again, once.

  6. Tried again when the AI is busy

    Each testimonial it has to check is recorded as a task when the testimonial is stored. If the AI provider is busy, overloaded or does not answer in time, it tries again later, waiting longer each time, up to 5 attempts within 6 hours; when the provider says how long to wait, every check waits that long. An attempt that got no answer gives its reading back. A failure no later attempt can cure, such as a spent month of readings, is not retried.

  7. A stopped server loses nothing

    One worker holds a testimonial at a time, for at most 90 seconds. If it stops, a check that runs every minute takes the testimonial again. The AI's answer is saved before it is applied, so a stop between the two never buys a second reading, and the decision, its line in the history and the end of the task are written in one step.

  8. Fair when many arrive at once

    At most 4 AI checks run at once across all of Hazelsong, and at most 2 for one project, so a large backlog in one project cannot hold up another's. The per-minute check takes one testimonial from each project in turn.

  9. After a reading that was queued

    When the reading for risk on arrival did not come back and was queued, automatic moderation waits for it: once the reading comes back, the testimonial is checked as if it had just arrived, with its own attempts. One whose reading never came back is left for you as not read.

  10. Not held up by your webhooks

    It runs as soon as a testimonial arrives, without waiting for your testimonial.created webhook to be answered, so a slow or failing endpoint never delays or stops it. Its reading has its own time limit of about 22 seconds; one that runs past it counts as a model that did not answer. What it approves is sent to your testimonial.approved endpoints through the same outbox as a person's approval, tried again when an endpoint does not answer.

  11. How long it took, on your own testimonials

    Your report counts what automatic moderation decided on the testimonials that arrived in the last 30 days: how many it approved, proposed or left for you and why, the exact median time from arrival to its decision (the 95th percentile from 20 decisions, the 99th from 100), and how many wait for a person now and for how long. The figures are your project's own records, never a test's.

  12. With approval by two people

    On Pro, with approval by two people on, it counts as one person. It proposes, and an administrator or the owner signs. The record page never says a second person reviewed one it proposed.

  13. The writer is told

    With it on, your collection page and your invitation email say a testimonial may be approved by an automatic check, instead of saying a person reads every one first.

Safe by design

The rule that makes it safe to have

Clear boundaries

What it will not do

Every capability page ends with this list. It is the part that says what you are actually buying.

  • It is off until the owner switches it on, and only the owner can.
  • It will not show you a speed figure from a test as if it were yours: the report counts only your project's own testimonials.
  • It will not approve an import, a pasted review, a feed entry or one added through the API.
  • It will not approve anything the risk reading flagged, or one that was not read.
  • It will not approve a video, a voice recording, a photo or a picture: the AI does not watch, hear or look at them.
  • It will not approve one written for a reward. A reward is still disclosed wherever a testimonial is published.
  • It will not approve one whose writer may be owed a reply, one rated 3 stars or fewer, or a repeat.
  • It will not approve one whose words carry a link, an email address, a phone number or an @handle. The check reads written forms only: a link or number spelled out in words is left to the readings and to you.
  • It will not reject, delete, edit or shorten a testimonial.
  • It will not publish anything because a check failed or could not run: every testimonial waits in Pending until a reading says publish, or a person decides.
  • It will not try more than 5 times within 6 hours, and it will not retry a failure no attempt can cure; then it says so and waits for you.
  • It will not run the check again on a testimonial more than once at your request, nor on one it already decided.
  • It does not make you compliant with anything, and a testimonial it approved is still yours to check and take down.

Where it lives in the code: lib/automatic-moderation-rules.ts · scripts/contact-gate-check.mjs · lib/automatic-moderation.ts · lib/moderation-task-rules.ts · lib/moderation-task.ts · lib/moderation-sweep.ts · lib/arrival-reading.ts · lib/webhook-outbox.ts · app/api/cron/moderation/route.ts · lib/testimonial-admission.ts · app/api/automatic-moderation/route.ts · components/AutomaticModeration.tsx · lib/ai.ts · lib/ai-failure.ts · lib/testimonials.ts · app/api/testimonials/route.ts · scripts/automatic-moderation-check.mjs · scripts/moderation-task-check.mjs · scripts/ai-failure-check.mjs · scripts/submission-post-save-check.mjs

This is running now

Open a project and use it. Nothing on this page is a roadmap.