Skip to content

Hosted abuse prevention for open signups #75

Closed
6 of 6 issues completed
Closed

Description

@clbotdev

Background

app.sendlit.app has open self-serve signup, and we're about to invite public users, starting with creators leaving beehiiv. A hosted email sender with open signups is a magnet for spammers. One abusive account can burn shared reputation, get ESP connections suspended and put our payment account at risk.

Source: Jesse Hanley's anti-abuse checklist (shared by Marc Lou on X, 18 Oct 2026). Jesse Hanley is the founder of Bento/PostShiba.

Current status of each item, checked against main (7ce6795):

# Control Status Evidence
1 Require email verification at signup Have Better Auth emailOTP login/signup with a verification code (apps/api/src/auth/better-auth.ts:202-213)
2 Optional real-person check (e.g. Exa AI) Missing none
3 Block disposable/temp and free email providers Missing no blocklist code in apps/api/src
4 Rate-limit signup to ~3/day/IP Partial OTP limited to 3/60s (better-auth.ts:209-212), no daily per-IP cap
5 AI scan of templates/broadcasts + auto-suspend Missing the suspend mechanism exists (teams.status = sending_suspended), but nothing triggers it
6 New-account send throttling for the first 30-60 days Missing only flat daily/monthly quotas (apps/api/src/delivery/quota.ts); no rate limit (#51)
7 Alert admins on big imports Missing import doesn't exist yet (#38)

This blocks inviting public users to app.sendlit.app.

Proposed fix

Ship the controls below, hosted-only and feature-flagged so self-host is unaffected:

Also related: #65 (Acceptable Use / anti-spam policy, which gives us the right to suspend) and #25 (auto-pause on high bounce/complaint rates).

Acceptance criteria

Activity

  1. clbotdev commented on Oct 22, 2026

    @clbotdev
    ContributorAuthor

    All acceptance criteria are met:

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or requestseverity: highMajor gap or broken flow for many users

    Type

    No type

    Projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions