Multi-tenant SaaS

Email for every customer, from one API key

You bring the product and the customers. We give each of them an address, their own inbox and a wall around their mail.

Email in

  • Spacesspc_7k2m
  • Mailboxestom@gmail

Your code

Your platform

Customers, product, UI

onSignup(customer)

Email out

  • Wildcard domainsacme.you.io
  • Pacing5k / day
  • Suppressionsper customer

Wildcard domains

An address the minute they sign up

Connect *.yourapp.com once. Every customer gets a subdomain from your signup handler, sending and receiving before anyone touches DNS.

Wildcard domains
*.northwind.ioConnected once
  • HHarbourlyJust now

    harbourly.northwind.io

    hello@Welcome aboard, Tom
  • RRheinbau17m ago

    rheinbau.northwind.io

    support@Re: Booking for Thursday
  • LLindmetallYesterday

    lindmetall.northwind.io

    ava@Your quote for RFQ 4471
  • WWerkhaus2 Sep

    werkhaus.northwind.io

    notifications@Your weekly summary

+ 1,248 more, each created by one API call at signup

Spaces

Nobody sees anybody else's mail

Each customer's domains, inboxes and threads live in a space of their own. When one customer emails another, each gets their own copy.

Spaces
tom@harbourly.comOne email

“Quote for the Q3 order” · Message-ID: a7f2c1@harbourly.com

Tojana@rheinbau.de

Harbourly

tom@harbourly.com

thr_9fd21a· own thread

email.sent · spc_7k2m

Rheinbau

jana@rheinbau.de

thr_04be77· own thread

email.received · spc_1xq8

One message, a copy in each space. Tom sees what he sent, Jana sees what arrived — and neither thread ever looks across.

Mailboxes

Answer from the inbox they already use

Customers on Gmail or Outlook approve once, on a consent screen with your name on it. The inbox lands in their space.

Mailboxes

Connected through Northwind, your OAuth app

  • tom@harbourly.comHarbourlyconnected
  • jana@rheinbau.deRheinbauconnected

Pacing

Their limits, under your ceiling

Cap the whole platform once. Customers set their own hours and limits from your product, and can only ever go below yours.

Pacing

Your workspace · every customer

rate limitCeiling
from *@*.northwind.io
5,000 per day · this rule
Harbourly
time lockOffice hours
from *
Mon–Fri 09:00–17:00 · Berlin
Rheinbau
rate limitWarm-up
from *
40 per day · sender

Every rule that matches a send gets a say. A customer’s own can only hold their mail back further, never lift your ceiling.

Suppressions

An opt-out from one customer stays theirs

Unsubscribing from one of your customers stops their mail, not everyone's. A hard bounce stops it for all of them, because the address is gone.

Suppressions
IK

Iris Kaplan

Unsubscribed from Harbourly

On Harbourly’s list

The next email to Iris

  • HarbourlyThe spring newsletterNot sent
  • RheinbauYour booking for ThursdaySent

Put together

A new customer, in three calls

1spaces.createwhen a customer signs up
const space = await aiinbx.spaces.create({  name: customer.name,  external_id: customer.id,}) await aiinbx.domains.create({  name: `${customer.slug}.northwind.io`,  space_id: space.id,})
2mailboxes.connectwhen they bring their Gmail
const { url } = await aiinbx.mailboxes.connect({  provider: "google",  app_id: NORTHWIND_APP, // your consent screen, not ours  space_id: space.id,  return_to: "https://app.northwind.io/settings/inbox",})
3email.receivedone endpoint, every customer
const customer = await customerBySpace(event.space_id) await customer.notify(event.data.thread_id)

Give your product an inbox. The hard parts are already handled.

Get started