// Field station 001 — Amazon SES observability for Phoenix

YOUR EMAILS ARE
OUT THERE.
SQUATCHMAIL FINDS THEM.

The self-hosted Amazon SES dashboard for Elixir, shipped as a Hex package. Add the dep, run one migration, mount one route — and every email your Phoenix app sends leaves a trackable footprint in your own Postgres.Big footprint. Tiny bill.

Read the field guide

// Live from the forest floor

WITNESS A SIGHTING

Every send is a Sighting. Every SES event is a Footprint. This is the Trail Log — the part of the dashboard you'll leave open in a tab and glance at like a trail camera.

TRAIL LOG
Tracking live
SightingStatus
  • mulder@fbi.example

    I want to believe (your receipt)

    clicked
  • scully@fbi.example

    Evidence attached: invoice #1967

    opened
  • ranger@pnw.example

    Trail conditions: muddy, mysterious

    delivered
  • bear@forest.example

    You are NOT the cryptid we ordered

    bounced
  • patterson@gimlin.example

    Frame 352: your weekly digest

    opened
Following tracks…simulated — your real mail goes here

1

migration to run

0

extra services to babysit

0

blurry photos — raw payloads kept

100%

of the evidence in YOUR postgres

// What the expedition has confirmed

FIELD EVIDENCE

Most researchers spend decades without a single confirmed sighting. You'll have one before your coffee cools.

// EXHIBIT A

Zero-config capture

SquatchMail attaches to Swoosh's telemetry at boot and observes every send your app already makes. No adapter swap. No proxy. It was watching the whole time.

// EXHIBIT B

SES event ingestion

Deliveries, opens, clicks, bounces, complaints, delays — every SNS notification becomes a Footprint on a per-email timeline. Signatures hand-verified. No blurry evidence.

// EXHIBIT C

One-click Base Camp

"Connect SES" provisions the configuration set, SNS topic, HTTPS subscription, and event destination for you. The afternoon you'd lose in the AWS console, done from a button.

// EXHIBIT D

The Do-Not-Disturb Registry

Hard bounces and complaints are suppressed permanently; soft bounces expire. Some addresses have asked to be left alone. The Squatch respects boundaries.

// EXHIBIT E

A circuit breaker with claws

The Guard auto-pauses sending at a 0.1% complaint rate — SES's own account-suspension threshold — before AWS pauses it for you, less politely.

// EXHIBIT F

Status that never lies

A late delivery notification can't un-click an email. Statuses only ever upgrade; bounces and complaints always win outright. The trail record is sacred.

// EXHIBIT G

It cleans up after itself

The Pruner sweeps old emails and footprints past your retention window on a timer. The forest doesn't accumulate footprints forever. Leave no trace.

// EXHIBIT H

Your database, your rules

Everything lives in its own squatch_mail Postgres schema inside your existing database, versioned and migrated the Oban / ErrorTracker way. No queue. No Redis. No cryptid infrastructure.

// How a sighting gets tracked

TRACKING METHODOLOGY

Outbound — a send happens

  1. 01

    Your Swoosh mailer delivers — exactly as it does today. No adapter swap, no proxy, no code changes to your send path.

  2. 02

    Telemetry hears the branch snap — SquatchMail captures the send from inside your BEAM node, asynchronously. It never blocks a delivery.

  3. 03

    The Sighting is logged — recipients, subject, attachments, all filed in the squatch_mail schema of your own database.

Inbound — SES reports back

  1. 04

    SES → SNS → your webhook — delivery, open, click, bounce, complaint, delay. Signed notifications, straight to your app.

  2. 05

    The evidence is authenticated — SigV1/SigV2 signatures hand-verified against :public_key. Forged footprints don't make it past the perimeter.

  3. 06

    Footprints hit the timeline — statuses upgrade, suppressions update themselves, and the Trail Log moves. No queue, no polling, no séance.

// Actual footage — not an artist's rendering

THE FIRST CRYPTID PHOTO IN PERFECT FOCUS

Sixty years of blurry evidence, and then this: the Trail Log, captured in the wild, every pixel sharp. Sightings on the left, delivery stats up top, the whole forest accounted for.

The SquatchMail Trail Log dashboard: sidebar navigation, delivery / open / click / bounce rate stats, and a table of sent emails with live tracking
// Trail Log, live capture — subject did not notice the camera

// Know your local wildlife

RAW SES LEAVES YOU ALONE IN THE WOODS

Amazon SES hands you a message ID and wishes you luck. Hosted wrappers keep your evidence on their servers. There is a third path through the trees.

CapabilityRaw SESHosted wrapperSquatchMail
Send observabilityA message ID and silenceYes, on their serversYes, in your Postgres — zero code changes
Bounce & complaint handlingWire up SNS yourselfBuilt inBuilt in, signatures hand-verified
Suppression listBuild and enforce it yourselfBuilt inBuilt in, bounce-type-aware expiry + optional send blocking
Where your data livesNowhere — SES keeps no timelineTheir database, their retentionYour database, your schema, your rules
SetupThe AWS console, by hand, in the rainAPI key + their SDKmix igniter.install squatch_mail
Extra infrastructureNone (but also none of the above)A vendor dependencyNone. It's a library, not a lodge fee.

// Speak fluent cryptid

LEARN THE LINGO

Sighting
An email your app sent. It's out there now.
Footprint
An SES event — delivered, opened, clicked, bounced. Evidence it happened.
Trail Log
The live activity feed. Where you watch the woods.
Base Camp
SES connection & settings. Where the expedition starts.
Do-Not-Disturb
The suppression list. Boundaries, respected.
Field Guide
The documentation. You're soaking in it.

The code underneath is boring on purpose — Email,EmailEvent,Suppression. The bigfoot is a costume the UI wears, not a religion the codebase practices.

// Two ways into the woods

SET UP BASE CAMP

Elixir 1.15+, Ecto 3.13+, Phoenix LiveView 1.0+, PostgreSQL. If your Phoenix app already talks to SES, SquatchMail is mostly just…there — the way a footprint is there whether or not you were looking for it.

# one command. the installer does the rest:
# dep, config, migration, route, raw-body reader.
mix igniter.install squatch_mail

# then run the migration and go look at your woods
mix ecto.migrate
mix phx.server   # → http://localhost:4000/squatch

Full trail map — including the one endpoint tweak the installer can't always do for you — in the installation guide.

Realistic Bigfoot mascot

// The hide-and-seek world champion, on your side for once

STOP TAKING AWS'S WORD FOR IT.
START COLLECTING EVIDENCE.

Open source, MIT licensed, and self-hosted — because the best proof is the kind that lives in your own database.

"I want to believe (in my delivery rates)."