Hisashi Space

October 2, 2026 · 7 min read

Finally beat the sales emails flooding my inbox, with Jev

Sales emails that aren't quite spam, but that you'll never have time to read. Filters you set up that they slip right past. I finally beat them, using Jev, an AI that reads a message and judges it.

It started with a press release. A press release brings replies. Some of them are the ones you wanted. A lot of them aren't.

"We read about your company with great interest." Then a free webinar, a whitepaper, a booth at a trade show, an ad agency offering to help. I'd become the one getting pitched.

I run more than ten products on my own. One of them is @SOHO, a Japanese job board for freelance and remote work. After the press release went out, its contact address started filling up with these.

Filters didn't hold

I tried Gmail filters first, and then regex in my own scripts. Neither held up for long.

The senders change every time, so filtering by sender is pointless. Filtering on "seminar" or "webinar" in the subject catches real inquiries that happen to use the same word. And "Thank you for your inquiry" shows up in auto-replies and in genuinely thoughtful human replies alike.

The trickiest ones borrow a big platform. A common move, mostly from English-speaking companies, is to write the pitch in a Google Doc and share it with your address. The email you get comes from Google. You can't just send Google's notifications to spam, because then the shares you actually need stop arriving too.

There's a Zoom version as well: someone signs you up for their webinar without asking, and the invite comes from Zoom's shared address. Same problem. I got several of each this time, and honestly, sorting them one by one was a pain.

There's a reason the human replies matter here. @SOHO reaches out to companies that look like they're hiring, through their website contact forms. So the inbox gets three things at once: pitches, form auto-replies, and real people writing back. Mix those up and you end up ignoring someone who took the time to answer you.

A wording rule also burned me once. I treated "we'll pass this time" as a refusal and stopped contacting that company for good. Read it again and it says "this time." It doesn't say "never." A person sees that instantly. My rule didn't.

Every rule I added came with new exceptions, and the inbox kept growing.

Asking the question a person would ask

When a person opens one of these emails, they know in a second whether it's a pitch or a reply. That judgment was the thing I actually needed.

So I used Jev from TypeSafe AI. It doesn't write text. You give it a piece of text and some questions, and it returns probabilities: how likely the answer to each yes/no question is "yes." Because it comes back as a number, you get to decide where the machine takes over and where a person does.

For each email I asked five questions in a single request:

  • Did a person write this reply individually (not an auto-reply or a newsletter)?
  • Would it be appropriate for us to reply?
  • Is the sender trying to sell us something?
  • Are they asking for a meeting?
  • Are they clearly asking us to stop contacting them?

That was it. Five plain-language questions instead of another page of rules.

92 down to 2

On October 2, 2026, there were 92 messages sitting in the inbox. After the sort:

  • about 70 went to "no reply needed" as pitches and event invites
  • about 15 were form auto-replies, filed away
  • 3 were bounces
  • 2 stayed: a Google Workspace invoice, and one reply I actually needed to answer

Both of the ones left were things I really did need to look at. The same sort now runs every five minutes.

What I didn't hand over

Letting an AI decide everything would just create a different kind of accident, so I set a few rules first.

Anything code can decide, code decides. Bounces are obvious from the sender address, so they never go to the model. Invoices, payments and contracts stay in the inbox no matter what it says.

I ask each question twice and only act when both answers land on the same side of the line. The probabilities wobble a little between runs. In an earlier test, the same three questions on the same 69 items moved by up to 0.15 across three runs. If the two answers disagree, a person looks at it.

The harder something is to undo, the higher the bar. Marking a company as "don't contact again" is permanent, so that question needs 0.7, higher than the others.

And I drew the lines from my own inbox, not the defaults. The library's defaults are 0.9 for yes and 0.1 for no. On a sample of 26 real emails, that left almost everything as "can't decide." Human replies scored 0.61 to 0.93 on "should we reply," pitches and auto-replies scored 0.05 to 0.49, so I put the line at 0.6.

How to set it up

Here's how to get the same sorting running on your own inbox. You can start without writing any code.

1. Try one email in the Playground

Open the Playground in the TypeSafe console and log in.

https://console.typesafe.ai/playground

Pick a sales email from your inbox and paste the sender, subject and body in as the state. Add one noul (yes/no) question, something like "The sender is trying to sell us their own product, service or seminar." Run it and you'll get back the probability that the answer is yes, between 0 and 1. Swap in a few real replies and a few pitches and watch how the numbers split.

2. Get an API key

Create a key on the keys page of the console.

https://console.typesafe.ai/keys

Keep it out of your code and put it in an environment variable such as TYPESAFE_API_KEY.

3. One call per email, all five questions together

It's a single POST. Put the sender, subject and body in state and list your questions under questions. Keep them in one call: most of the cost is sending the body, so a call per question sends the same body over and over.

curl -X POST https://api.typesafe.ai/v1/systemone \
  -H "Authorization: Bearer $TYPESAFE_API_KEY" \
  -H "Content-Type: application/json" \
  -d @- <<'EOF'
{
  "model": "jev-latest",
  "state": "From: ...\nSubject: ...\n\nBody...",
  "questions": {
    "human": { "type": "noul", "instructions": "A person wrote this reply individually. Auto-replies, promotions and newsletters don't count." },
    "needReply": { "type": "noul", "instructions": "It would be appropriate, socially or commercially, for us to reply to this email." },
    "counterSales": { "type": "noul", "instructions": "The sender is trying to sell us their own product, service or seminar." },
    "meetingRequest": { "type": "noul", "instructions": "The sender wants to set up a meeting, call or visit." },
    "stopRequest": { "type": "noul", "instructions": "The sender clearly asks us not to contact them again. Declining just this one time doesn't count." }
  }
}
EOF

Each question comes back under answers with its noul, the probability of yes.

4. Ask twice, act only when both agree

Send the same email twice and only sort it when both answers land on the same side of the line. If they split, leave it in the inbox for a person. Here's where mine go:

  • counterSales is yes: label it "no reply needed" and move it out of the inbox
  • human is no and it looks like an auto-reply: file it as a form receipt
  • needReply is yes: label it "needs reply" and leave it in the inbox
  • stopRequest is yes: stop contacting them (higher line, 0.7)

The labeling and archiving is done through the Gmail API: add a label, remove INBOX.

5. Draw the lines from your own inbox

Run 20 or 30 emails first and line up the numbers for each question. In my inbox, "should we reply" came out at 0.61 to 0.93 for real replies and 0.05 to 0.49 for pitches and auto-replies, so I set the line at 0.6. Changing the set of questions moves the numbers, so measure again whenever you add one.

6. Run it on a schedule

After that, it just runs, every five minutes in my case. Keep a record of message IDs you've already judged so you don't pay to judge the same email twice.

Who this is for

It's for people who've tried to sort mail with rules and keep chasing exceptions: the kind of email where neither the sender nor the keywords help, but a person would know at a glance.

If you get a handful of emails a day, don't bother. Opening them yourself is faster.

A press release brings good news and pitches together. I can't stop the pitches. But I can have them sorted before I ever open the inbox.

TypeSafe AI's docs are here:

https://docs.typesafe.ai/introduction

Get the next one by email

No schedule, no filler, and real numbers when there are any.

Subscribe

← All writing