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.
- harbourly.northwind.io
- harbourly.com
- tom@harbourly.com
- rheinbau.northwind.io
- jana@rheinbau.de
- lindmetall.northwind.io
- lindmetall.de
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.
“Quote for the Q3 order” · Message-ID: a7f2c1@harbourly.com
Tojana@rheinbau.de
tom@harbourly.com
thr_9fd21a· own thread
email.sent · spc_7k2m
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.
- 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
- 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.
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.
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,})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 soif (event.type === "email.received") { const customer = await customerBySpace(event.space_id) await queueReply(customer, event.data.thread_id)}