ravn
Claude skill

Reduce bounce rate on a stale list

When bounces start climbing, re-verify the list, split it into segments by risk score, and give the user a written re-send policy: who to send to now, who to warm up slowly, and who to suppress for good. The aim is fewer hard bounces and a protected sender reputation.

Download SKILL.md Start free

Install

One command.

Installs into ~/.claude/skills for Claude Code. In Claude, upload the downloaded file under Settings → Capabilities → Skills.

npx ravn skill install reduce-bounce-rate

When to use

  • The user's email tool reports a rising bounce rate, or a send was paused for bounces.
  • A list has not been mailed in months, or it was last verified long ago.
  • "Why are we bouncing so much and what should we do?"

For a one-off check of a fresh list, verify-email-list is enough. This skill adds segmentation and an ongoing policy.

Before you start

  1. Check the connection: call get_account with {} or run npx ravn whoami.
  2. Costs: 1 lookup per unique address. On the Free plan, lookups are 1,000 in total; on Ravn ($24/month) 10,000 lookups a month are included, then $1 per 1,000, up to the spending cap (ravn cap <dollars>).
  3. Ask for the bounce report from the user's sending tool if they have one. Hard-bounced addresses should be suppressed whatever the re-check says.

Steps

  1. Remove known bad rows first, for free: hard bounces from the report, unsubscribes and spam complaints. Keep them in suppress.csv.
  2. Re-verify everything else. Dry run, sample, full:
npx ravn enrich list.csv --tool validate_email --column Email --dry-run
npx ravn enrich list.csv --tool validate_email --column Email --limit 10 --out sample.csv
npx ravn enrich list.csv --tool validate_email --column Email --out reverified.csv
  1. Segment by rw_verdict and rw_risk_score (A is 90 and above, B 75 and above, C 55 and above, D 30 and above, F below 30): - Send now: valid with risk score A or B. - Send slowly: valid with score C. Mail in small batches, to recently engaged contacts first. - Hold: risky (usually catch_all: true) and unknown. Only mail if the contact has opened or clicked recently; otherwise leave out. - Suppress: invalid (for example mailbox_not_found, no_mx, domain_not_found), disposable: true, and any score D or F.
  2. Look at the reasons for the suppress group. A large number of domain_not_found or no_mx usually means old companies that closed or changed domains. If the user wants, those people can be re-found with find-work-email on their new domain.
  3. Write the policy for the user in plain words: - Re-verify any address not mailed in the last 90 days before the next send. - Verify new addresses at the point of capture (a single validate_email call on sign-up). - Never re-add suppressed addresses. - After each send, add new hard bounces to the suppression list.
  4. Offer to re-run the same command on a schedule the user chooses, using the same file names so the comparison is easy.

Output

  • send-now.csv, send-slowly.csv, hold.csv, suppress.csv.
  • Each keeps the original columns plus rw_status (ok, not_found, error, dropped), rw_verdict, rw_risk_score, rw_reason, rw_catch_all, rw_disposable, rw_role_account and rw_mailbox_checked.
  • A short report: counts per segment, the top reasons for suppression, and the written re-send policy.

Rules

  • Suppression is one-way: unsubscribed, complained, hard-bounced and opted-out contacts never go back on the send list. See /privacy#optout.
  • Drop invalid and risky addresses from the main send. Do not relabel unknown as valid.
  • No FCRA uses.
  • If the list is larger than the lookups left in this window, tell the user the run will pause until the reset.
  • On a 429 fair_use_exhausted, stop and tell the human. Rows not reached are marked dropped; rerun to finish.

Example prompt

Our last newsletter had an 8% bounce rate and Mailchimp warned us. The list is 14,000 people and some haven't been emailed in a year. Fix it and tell us how to stop this happening again.