Spaces

A space for every customer

Their domains, their connected inboxes, and every thread that went through them — filed under the customer they belong to, and never visible across.

Your workspace
*.northwind.ioone API keyone endpoint
Harbourlycus_1f4a
  • harbourly.northwind.io
  • harbourly.com
  • tom@harbourly.com
2,140 threadsSending now
Rheinbaucus_2c74
  • rheinbau.northwind.io
  • jana@rheinbau.de
884 threadsWaiting for 09:00
Lindmetallcus_3b92
  • lindmetall.northwind.io
  • lindmetall.de
317 threadsVerifying DNS
1,248 moreTheir domains, their inboxes, their mail.

One wildcard domain, one API key and one webhook endpoint on your side. A space per customer on theirs, holding whatever they send and receive on.

The wall

One of your customers emails another

The case that quietly breaks an inbox keyed on the message alone: one side gets the copy, the other gets nothing.

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.

The split

Theirs to set, yours to hold

A customer can have their own sending hours, their own caps and their own opt-out list. What they never get is a key — you front the API for them, and one credential of yours reaches every space.

In a customer's space1,248 of them
  • Domains and subdomainsYours handed out, or one they own
  • Connected inboxesThe Gmail or Outlook account they work in
  • Every thread and emailWhatever went through those addresses
  • Pacing rulesTheir own hours and caps, set from your product
  • Suppression listsSomebody who left them has not left you
At your workspaceOne of it
  • API keysOne credential, every space — never handed out
  • Webhook endpointsOne URL, every space's events, each stamped
  • The wildcard domainVerified once; every subdomain under it is free
  • Account-wide rulesYour ceiling holds over whatever a customer sets
  • Members and billingYour team, one invoice, however many customers

In the console

Every customer, and what their mail is doing

Spaces

One per customer. Their domains, inboxes and mail belong to it.

Search by name, or by the id your system knows them by…
Harbourlycus_1f4aharbourly.northwind.io, harbourly.com3 mailboxes2,140 threads2m ago32,1402m ago
Rheinbaucus_2c74rheinbau.northwind.io2 mailboxes884 threads17m ago288417m ago
Lindmetallcus_3b92lindmetall.northwind.io, lindmetall.deNo mailboxes317 threads1h ago—3171h ago
Werkhaus Groupcus_4d18werkhaus.northwind.io +26 mailboxes5,902 threads3m ago65,9023m ago
Stadtwerke Nordcus_5a03stadtwerke-nord.northwind.io1 mailbox46 threadsyesterday146yesterday
Kelda Logistikcus_6b71kelda.northwind.io, kelda.se4 mailboxes1,377 threads9m ago41,3779m ago
Vogt & Partnercus_7e2dvogt.northwind.io2 mailboxes612 threads41m ago261241m ago
Aurum Clinicscus_8c55aurum.northwind.io, aurumclinics.co.uk1 mailbox208 threads2h ago12082h ago
1,248 more

Pick one and the whole console narrows to it — threads, domains, metrics, pacing. A support ticket is answered inside the customer it is about, with nobody else’s mail on the screen.

In your code

One key, however many customers

Hold the spc_… against your customer record, or find it later by the external_id you set. Every object and every event carries it.

1spaces.createonce, when a customer signs up
const space = await aiinbx.spaces.create({  name: customer.name,  external_id: customer.id, // your own id, unique here}) // A subdomain of your wildcard — no DNS, verified alreadyawait aiinbx.domains.create({  name: `${customer.slug}.northwind.io`,  space_id: space.id,})
2emails.sendthe same call you already write
const email = await aiinbx.emails.send({  from: "assistant@harbourly.northwind.io",  to: lead.email,  subject: "Following up",  text: draft,}) email.space_id // "spc_7k2m" — the from address said so
3email.receivedone endpoint, every customer's mail
if (event.type === "email.received") {  const customer = await customerBySpace(event.space_id)   await queueReply(customer, event.data.thread_id)}

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

Get started