RReTestimonial
Sign inStart free
FeaturesManageSpam Protection
SHIELDSpam Protection · Manage

The bouncer
that never sleeps.

A weighted-signal engine sits in front of every form. Honeypots, blacklists, rate limits, content patterns — eleven signals, one score, one threshold you control. False positives recover in a click.

11
weighted signals
<800ms
p95 decision
100
instant-spam weight
1-click
false-positive restore
inbox / spam · live inspector
● scanning
?
“Anonymous”· winner@lottery-prize-247.shop
IP 185.220.101.42 · Form: Customer Stories · 3 sec ago
Quarantined
ACT NOW!! Visit lottery-prize-247.shop for LIMITED TIME offer. Free money awaiting!! bit.ly/x bit.ly/y bit.ly/z ...”
100
spam score
Verdict
SPAM· auto-quarantined
Threshold
60
Decision>= threshold
Signals fired · 4Weight
Blacklisted domainINSTANT
lottery-prize-247.shop
+100
Excessive URLs
5 links in 142 chars
+25
Suspicious patterns
matched: "act now", "limited time"
+20
All caps
61% uppercase
+10
1 of 12 in spam · auto-deletes in 30 days
Live
Every weight is tunable in your project settings.
One-click recovery
0 reups · keeps the audit log
The eleven signals

Every weight, on the table.

No black-box ML. Each signal has a published weight you can read, audit, and override. The total scores 0–100. Anything at or above the threshold lands in Spam.

WeightBucketSignal · what it catchesContribution
+100
Instant
Honeypot triggeredhoneypot_triggered

A hidden form field humans never see. If a bot fills it, you get an instant 100.

0threshold 60100
+100
Instant
Blacklisted emailblacklisted_email

Address-level block list. Specific senders you've explicitly banned.

0threshold 60100
+100
Instant
Blacklisted domainblacklisted_domain

Domain-level block list. Whole providers, parked domains, throwaways.

0threshold 60100
+60
Bursty
Rate limitrate_limit

Submissions/hour from one IP. Default 5/hour, configurable per project.

0threshold 60100
+35
Pattern
Duplicate contentduplicate_content

SHA-hashed content + name. Catches copy-paste sprays.

0threshold 60100
+30
Pattern
Gibberishgibberish_detected

Vowel ratio, consonant clusters — "asdfgh xyzwv" never gets through.

0threshold 60100
+25
Pattern
Excessive URLsexcessive_urls

More than 2 links in a single submission, scored proportionally.

0threshold 60100
+20
Pattern
Suspicious patternssuspicious_patterns

"act now", "viagra", "crypto", "nigerian prince" — curated regex list.

0threshold 60100
+15
Quality
Short contentshort_content

Under 30 chars. Real testimonials are longer; lone smileys aren't.

0threshold 60100
+15
Quality
Repeated charactersrepeated_chars

Four+ of the same character in a row. "AAAAAA" doesn't pass.

0threshold 60100
+10
Quality
All capsall_caps

Over 50% uppercase letters. Dampens shouty submissions.

0threshold 60100
Instant — fires alone Bursty / pattern — combines Quality — soft signal↳ source: lib/spam-detection.ts
Spotlight · Threshold

You decide how strict the door is.

Default is 60 — a single instant signal flips the verdict, but quality signals need backup. Drag the slider to see five real submissions reclassify in real time.

  • Lower it for high-stakes forms
    Premium customers, NPS surveys — every false positive is expensive. Drop to 40, route the gray zone to Pending.
  • Raise it for high-volume forms
    Big public form expecting bursts? 75 keeps the obvious junk out without quarantining your power-user IPs.
  • Per-project, per-form
    Each project has its own threshold + signals — your podcast form needs different defenses than your product page.
Thresholddrag ↔
60/ 100 · default 60
025506075100
Pass
3 / 5
Quarantine
2 / 5
0
Maya · maya@northwind.com
Loved how easy ReTestimonial made our launch — collected 40 stories in a week.
Pass
40
(no name) · vip@hotmail.com
GREAT PRODUCT!! GREAT PRODUCT!!
all_caps +10repeated_chars +15short_content +15
Pass
15
Pat · pat@startup.io
Tried it. Solid.
short_content +15
Pass
80
Crypto Chad · ceo@web3-millions.xyz
Buy now! Free money! Bitcoin investment opportunity — earn $5000/week passive income visit https://x https://y https://z
suspicious_patterns +20excessive_urls +25duplicate_content +35
Spam
100
(empty) · hidden field tripped
asdfgh xqwzpr klmqrt zzz
honeypot_triggered +100gibberish_detected +30
Spam
Block & allow lists

Final say on every door.

Override the engine in either direction. Allow trumps everything; block triggers an instant 100. Both lists are per-project, exported in your Data Export.

Block list
Always rejected
+100 instant
Domains · 5
lottery-prize-247.shop×fastcash-investments.xyz×crypto-millions.io×ru-ad-network.click×quick-wins.lol×
Specific emails · 2
spammer@example.com×bot@throwaway.tk×
Allow list
Bypasses every check
score: 0
AK
alex@partner-co.com
Long-time customer · always passes
✓ allow
Pt
press@journal.com
Reviewer outreach
✓ allow
Qb
qa@retestimonial-test.io
Internal load tests
✓ allow
The Spam queue

Quarantined.
Not deleted.

Flagged submissions land in a dedicated Spam queue with the full score, every signal that fired, and the original IP. Recovery is one click. Auto-deletion after 30 days of inactivity — your inbox stays clean without any work.

30d
auto-retention
1-click
restore to inbox
Bulk
delete all / restore all
Logged
every verdict, audited
Spam · 12
100
(empty)
3 sec ago
asdfgh xqwzpr klmqrt zzz
honeypot_triggered
80
Crypto Chad
11 min ago
ceo@web3-millions.xyz
Buy now! Free money! Bitcoin investment opportunity earn $5000/week...
suspicious_patternsexcessive_urlsduplicate_content
100
Anonymous
26 min ago
winner@lottery-prize-247.shop
ACT NOW!! Visit lottery-prize-247.shop for LIMITED TIME offer...
blacklisted_domainexcessive_urlssuspicious_patternsall_caps
65
AAAA AAAA
1 hr ago
AAAAAAA WINNER!!! AAAAA
repeated_charsall_capsshort_contentsuspicious_patterns
60
127.0.0.1 (rate-limited)
2 hr ago
test@example.com
(8 submissions in last hour, limit 5)
rate_limit
The lifecycle

From hit to verdict, in under a second.

Synchronous to the submitter, asynchronous to the audit log. The submitter sees a clean confirmation either way — they never know they were scored.

01
Submit
Form posts to /api/testimonials. Honeypot value, IP, content all captured.
02
Whitelist
Allow-list checked first. Hit = score 0, straight to Pending.
03
Score
Eleven signals run, weights summed, capped at 100.
04
Decide
Score >= threshold → Spam queue. Below → Pending inbox.
05
Audit
Score, every signal, IP, timestamp written to the testimonial record.
06
Retention
Spam auto-deletes after 30 days. Restored items return to Pending.
Receipts

The boring questions, answered.

On every plan, free included

Honeypot, blacklists, rate limit, content checks — all eleven signals on the entry tier. We don't paywall security.

Per-project isolation

One project's threshold can't influence another's. Allow-list a partner email here, still blocked there.

Audited, not just blocked

Every score and signal is persisted on the testimonial. Forensic trail for every false positive review.

Open weights, no surprises

Every weight is published in lib/spam-detection.ts. No mystery model, no vendor lock, no quietly-tuned thresholds.

PII-conscious

Bare minimum captured: IP for rate limiting, content for hashing. Auto-cleanup of rate-limit rows after 24 hours.

Plays nicely with rewards

Flagged submissions never charge your gift-card wallet. Holds release automatically; legit users still hit per-form caps.

Spam Protection · on every plan

Bots out.
Real stories in.

Eleven signals. Per-project thresholds. Block & allow lists. Auto-quarantine, one-click recovery, full audit trail. Free forever on the entry plan.

No credit card · Eleven signals on every tier · 100 testimonials free