Concepts
Projects & environments
A project is an isolated workspace, and every project has a Test and a Live environment. Which one you send from is decided entirely by the key you use.
Everything in Deckle lives inside a project, and every project ships with two environments. You don't configure environments separately — you pick one by using a sk_test_ or sk_live_ key, which keeps testing safely away from real inboxes.
Projects#
A project is a self-contained workspace. Each one owns its own data and never shares it with another project, so you can keep separate apps, brands, or clients fully isolated under a single account.
Everything below is scoped to the project you're in:
- Contacts — your audience, keyed by email, with events and activity timelines.
- Templates — the React Email templates you send and brand.
- Domains — the verified domains you're allowed to send from.
- API keys — the secret keys that authenticate every request.
- Events — the named actions that power segments and automations.
Because keys are scoped to a project, a key from one project can never read or send on behalf of another. Create and switch between projects with the project switcher in the dashboard top bar.
Test and Live#
Every project has two environments, Test and Live. You don't select an environment in a settings page — you select it by choosing which key you send with. A sk_test_ key targets the Test environment; a sk_live_ key targets Live.
import { Deckle } from "@deckle/sdk";
// A test key sends into the Test environment.
const test = new Deckle("sk_test_...");
await test.emails.send({
from: "Acme <hello@acme.com>",
to: "success@simulator.amazonses.com",
subject: "Sandbox check",
html: "<p>This never reaches a real inbox.</p>",
});
// A live key sends into the Live environment.
const live = new Deckle("sk_live_...");
await live.emails.send({
from: "Acme <hello@acme.com>",
to: "jane@example.com",
subject: "Welcome to Acme 👋",
html: "<h1>Hey Jane</h1>",
});In the dashboard, the Test/Live toggle sits in the top bar. It filters what you see — emails, logs, and reports — to the environment you're viewing, so a test send never clutters your live analytics.
What Test can do#
The Test environment is a sandbox. A sk_test_ key can only deliver to two kinds of recipient:
- AWS SES simulator mailboxes, such as
success@simulator.amazonses.com,bounce@simulator.amazonses.com, andcomplaint@simulator.amazonses.com. - Addresses on the project's own verified domains.
This lets you exercise the full pipeline — templates, variables, webhooks, and bounce or complaint handling — without any risk of reaching a real person.
Test keys are sandboxed
Ask_test_ key can never send to arbitrary real inboxes. It reaches only the SES simulator mailboxes or your project's verified domains. Any other recipient is rejected. To email real people — and to run campaign or broadcast sends — you must use a sk_live_ key.What requires Live#
| Action | Test | Live |
|---|---|---|
| Transactional send to the SES simulator | Yes | Yes |
| Send to your own verified domain | Yes | Yes |
| Send to arbitrary real inboxes | No | Yes |
| Campaign / broadcast send | No | Yes |
Switching projects#
Use the project switcher in the dashboard top bar to move between projects or create a new one. Switching changes everything the dashboard shows — contacts, templates, domains, keys, and logs all belong to the active project.
Over the API there's nothing to switch: the project (and its environment) is determined by the key on the request. Point your app at a different project by swapping the key, typically through an environment variable such as DECKLE_API_KEY.
One key per environment per deploy
Give each deploy its own key: ask_test_ key in local and staging, a sk_live_ key in production. Store both in API key secrets, never in source control.