# 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.

[Get started](/signup)
[Documentation](https://docs.aiinbx.com/guides/spaces)

Mail coming in passes through Spaces, Mailboxes. Your platform is your code: Customers, product, UI. Mail going out passes through Wildcard domains, Pacing, Suppressions.

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](/features/wildcard-domains)

Example: \*.northwind.io is connected once, and every customer gets a subdomain under it (harbourly.northwind.io, rheinbau.northwind.io, lindmetall.northwind.io, werkhaus.northwind.io) that sends and receives from the moment it exists, with 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](/features/spaces)

Your customer Harbourly's tom@harbourly.com emails jana@rheinbau.de at your customer Rheinbau. The one message is filed twice: in Harbourly's space as email.sent on a thread of its own, and in Rheinbau's space as email.received on a thread of its own. 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](/features/mailboxes)

Example: tom@harbourly.com at Harbourly and jana@rheinbau.de at Rheinbau are connected through Northwind, your own OAuth app, each in its customer’s space.

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](/features/pacing)

Your workspace · every customer

Rule “Ceiling” (rate limit): 5,000 per day · this rule, for from \*@\*.northwind.io.

Harbourly

Rule “Office hours” (time lock): Mon–Fri 09:00–17:00 · Berlin, for from \*.

Rheinbau

Rule “Warm-up” (rate limit): 40 per day · sender, for from \*.

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](/features/suppressions)

Example: Iris Kaplan unsubscribes from Harbourly and lands on Harbourly’s list. The next email to her from Harbourly, “The spring newsletter”, is not sent; the one from Rheinbau, “Your booking for Thursday”, is.

Put together

## A new customer, in three calls

Step 1, spaces.create: when 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,
})
```

Step 2, mailboxes.connect: when 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",
})
```

Step 3, email.received: one 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](/signup)
