Available on the Corporate plan. This functionality is part of woku’s enterprise capabilities. Talk to our sales team.
429 and the form’s public screen
shows a specific message, without revealing the rule.
Typical uses:
- Anti-spam: block the same email trying to leave several reviews in a row to inflate a rating.
- Light anti-fraud: limit 1 response per employee per month per program.
- Data quality: prevent the same customer from submitting the same form twice by mistake.
Model
Each quarantine belongs to a company and defines:
Email identification is done against the SHA-256 hash of the
email, never against the plaintext email: the evaluator does not
decrypt data on the critical path.
Enable a quarantine
- Go to Quarantines in the side menu.
- Click New quarantine.
- Fill in the name, identifier, window in minutes and limit.
- Save.
The backend requires a name, an identifier, a window ≥ 1 and a limit ≥ 1.
How it is evaluated
For each incoming form submission:-
The evaluator loads the company’s active quarantines,
ordered by
priorityASC. -
For each rule, it computes the respondent value (normalized and
hashed email, or phone as-is), counts previous submissions
with the same identifier within the window, and
compares against
maxResponsesPerRespondent. -
If a rule blocks, evaluation stops and the backend throws
HTTP 429with the following body: -
If no rule blocks, the
totalAllowedcounters are incremented and the submission continues its normal flow.
remainingMinutes field indicates the window duration, not the
exact time until the next response is accepted (it is a sliding
window).
Simulator
The builder includes a Simulator panel that runs the real logic against a test email or phone, but withdryRun: true,
it does not increment the counters or persist anything. Useful for validating
a newly created rule before exposing it to real traffic.
What the respondent sees
Onreview.woku.app (and in any SDK that consumes the API), a
429 QUARANTINE_BLOCKED translates into a generic screen:
You already sent us this response recently. Try again in approximately N minutes.We intentionally do not reveal the rule name or the identifier that triggered it, so as not to give clues to an attacker who intends to enumerate the active rules.
Guarantees
- Privacy: the evaluator works with the search hash of the email, never with the plaintext email.
- Atomic: the
totalBlockedandtotalAllowedcounters are updated with MongoDB’s$inc; concurrent submissions cannot lose updates. - No impact if there are no rules: the initial query is backed
by the
{ companyId, enabled, priority }index and returns empty in microseconds when there are no active quarantines for the company. - Auditable: each block is recorded in the audit
log as
quarantine.create,quarantine.update, etc. Individual blocks are not recorded as separate entries to avoid flooding the log; the live counters are the source.
Known limitations (V1)
respondentIdentifieronly supportsemailorphone. Custom identifiers (acustomFieldsfield) anddeviceIdare left for V2.- Quarantine by
wokuId/formIdis not applied yet: the rule is global to the company. Once the submission starts carryingformId, the per-form filter activates without any data migration. - The phone identifier compares the value as it arrives (without E.164 normalization). We recommend that the customer normalize before sending.
Loss of access
If all members of the company are blocked by mistake (for example a rule withmaxResponsesPerRespondent: 0), an
admin can disable the quarantine from the panel, and new submissions
pass immediately. Previous metrics are preserved.