Observe first. Send safely.
AllStackd runs on your Amazon SES account. You never paste SES SMTP passwords or long-lived AWS access keys into AllStackd. You install a reviewable CloudFormation stack that creates a scoped IAM role AllStackd can assume with a unique External ID.
Machine-readable reference: /openapi.json. Examples use the placeholder $ALLSTACKD_API_KEY — never commit real keys. IAM permission lists: /security.
First 10 minutes
- Create an account and start the 14-day trial (no card).
- Create an AWS connection in Settings and download the CloudFormation template.
- Create the stack in your SES region, then paste RoleArn, SnsTopicArn, and ConfigurationSetName.
- Verify the connection and confirm the SNS subscription for SES events.
- Verify a sender domain (DKIM / SPF / DMARC) on Domains.
- Create a project, assign the connection, mint an
as_API key, and send a test email.
1. Prepare Amazon SES in your AWS account
AllStackd does not host mail and does not issue “SES API keys.” Delivery charge stays on your AWS bill. Complete these steps in the AWS console (or equivalent IAM/SES APIs) before Control-mode traffic.
- Sign in to an AWS account you control and pick the region where you will send (for example
eu-central-1orus-east-1). SES quotas and sandbox status are per region. - Open Amazon SES → create and verify a domain identity you own. Add the Easy DKIM CNAME records (and SPF / DMARC as recommended) at your DNS host. Do not use Gmail, Outlook, iCloud, or Yahoo as the sending domain.
- Check sandbox vs production. New SES accounts start in the SES sandbox: you can only mail verified recipients (and the mailbox simulator), with low daily quotas. When you are ready for real users, request production access from the SES Account dashboard (mail type: usually Transactional for product email). AWS reviews the request; AllStackd cannot approve it for you.
- Connect AllStackd with CloudFormation — not access keys. In AllStackd → Settings, create a connection, download the generated template, then in AWS CloudFormation choose Create stack → With new resources → Upload a template file. After the stack finishes, copy the
RoleArn,SnsTopicArn, andConfigurationSetNameoutputs back into AllStackd and verify. The stack embeds a unique External ID so only AllStackd’s runtime role can assume your role. - Confirm the SNS subscription for SES events if AWS emails a confirmation link. AllStackd verifies signed SNS messages against the topic ARN stored on the connection.
Official AWS steps to request production sending access
Easy DKIM and identity setup in the SES console
Upload the AllStackd template file in the AWS console
Why External ID + AssumeRole replaces long-lived keys
Do not create IAM user access keys or SES SMTP credentials for AllStackd. If a guide asks you to “generate SES keys,” stop — that path is for other products. AllStackd’s path is role assumption only.
Troubleshooting
- CloudFormation stack rolled back
- Open the failed stack events in AWS. Common causes: missing IAM permissions to create roles/topics, or an invalid SNS HTTPS endpoint. Fix the cause, delete the failed stack, and create again from a fresh AllStackd template download.
- AssumeRole failed / External ID validation failed
- Confirm you pasted the RoleArn from this connection’s stack, not another environment. The trust policy must name AllStackd’s runtime role and the exact External ID from Settings. Re-download the template if you recreated the connection.
- SNS subscription pending
- Confirm the subscription in the SNS console or via the AWS confirmation email. Until it is Confirmed, SES events will not reach AllStackd and health findings stay empty.
- Still in the SES sandbox
- You can only mail verified recipients until AWS approves production access. Request it from the SES Account dashboard; AllStackd cannot approve the request for you.
- DKIM pending or drift
- Publish the three Easy DKIM CNAMEs at your DNS host and wait for SES to show Successful. Drift findings mean a CNAME was removed or changed — restore the records SES expects.
- Control mode unavailable
- The connection must be active in Control permissions mode, the project must be assigned that connection, the sender domain must be verified, and the workspace needs an active trial or paid plan.
- Email stuck in queue
- Check Overview for dead delivery jobs and Settings for AWS connection errors. Quota, suppression, or AssumeRole failures move jobs to dead letter rather than silent drop.
2. Configure a project
After the connection is active, open Projects, assign that exact AWS connection, and switch the project to Control when you want AllStackd to queue sends. Add the sender domain in Domains (or import the SES identity), wait for DKIM / SPF / DMARC health, then create a scoped API key. Secrets use the as_ prefix and are shown once. New keys default to email:send, template:read, and template:write — choose narrower scopes when minting a key for MCP or read-only tools.
Authorization: Bearer as_...
Idempotency-Key: a-stable-operation-id3. Publish a reusable message
Create templates in the dashboard from starters (welcome, verify-email, password-reset, magic-link, receipt) or raw HTML. Each template has a stable alias. Drafts cannot be sent — publish first. Use {{variables}} in subject and body; AllStackd fills them at send time so copy can change without a deploy.
GET /api/v1/templates— listPOST /api/v1/templates— create (HTML orstarterId)GET/PATCH /api/v1/templates/:idOrAlias— read / updatePOST .../:idOrAlias?action=publish|preview— publish or preview
curl -X POST https://allstackd.com/api/v1/templates \
-H "Authorization: Bearer $ALLSTACKD_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "starterId":"welcome", "publish":true }'4. Queue a transactional email
Pass either inline subject + html/text, or a published template reference. Prefer template: { alias, variables } so content lives in AllStackd. The API validates subscription, plan, project routing, AWS readiness, verified sender domain, suppressions, quota, and idempotency before storing encrypted content and creating a durable job. Up to 50 recipients per request.
curl -X POST https://allstackd.com/api/v1/emails \
-H "Authorization: Bearer $ALLSTACKD_API_KEY" \
-H "Idempotency-Key: welcome-user-42" \
-H "Content-Type: application/json" \
-d '{
"from":"hello@your-verified-domain.com",
"to":["customer@example.com"],
"template":{
"alias":"welcome",
"variables":{
"first_name":"Ada",
"product_name":"Acme",
"action_url":"https://app.acme.com/start"
}
}
}'curl -X POST https://allstackd.com/api/v1/emails \
-H "Authorization: Bearer $ALLSTACKD_API_KEY" \
-H "Idempotency-Key: order-123-welcome" \
-H "Content-Type: application/json" \
-d '{
"from":"hello@your-verified-domain.com",
"to":["customer@example.com"],
"subject":"Welcome",
"html":"<p>Welcome!</p>",
"text":"Welcome!"
}'5. Send from application code
Copy sdk/typescript/allstackd.ts into your app. Helpers cover send, message status, template CRUD, publish, and preview. Always pass an idempotency key for retries.
import { AllStackd } from "./allstackd";
const allstackd = new AllStackd({ apiKey: process.env.ALLSTACKD_API_KEY! });
await allstackd.createTemplate({ starterId: "welcome", publish: true });
await allstackd.send({
from: "Acme <hello@your-verified-domain.com>",
to: ["customer@example.com"],
template: {
alias: "welcome",
variables: {
first_name: "Ada",
product_name: "Acme",
action_url: "https://app.acme.com/start",
},
},
}, { idempotencyKey: "welcome-user-42" });6. Inspect status
A 202 means queued, not delivered. Poll the returned message ID or configure a signed event webhook. Raw bodies never appear in status responses and are removed no later than 24 hours.
{
"id": "...",
"status": "queued | submitted | delivered | bounced | complained | failed | unconfirmed",
"recipients": [{ "status": "delivered" }]
}Signed customer webhooks
Settings can create public HTTPS endpoints for send, delivery, bounce, complaint, and reject events. Verify allstackd-signature as HMAC-SHA256 over timestamp + "." + rawBody, compare in constant time, reject timestamps older than five minutes, and deduplicate on allstackd-event-id.
Errors and retries
202Durably queued
400Invalid request
401 / 403Key or entitlement denied
409 / 429 / 503Conflict, quota, or dependency
Draft templates return 409 template_not_published. Retry network errors and 5xx responses with the same Idempotency-Key. Do not automatically retry validation, authentication, suppression, or plan-limit errors. If a Control send times out after the SES request may have been accepted, the message status becomes unconfirmed and AllStackd will not resubmit it. Confirm delivery before sending a replacement with a new idempotency key; a later SES event can still advance the status.
MCP beta
API-key MCP: https://allstackd.com/api/mcp (Bearer as_…). OAuth MCP for ChatGPT / Codex: https://allstackd.com/mcp (Clerk sign-in). Claude Connectors Directory listing is paused (requires Anthropic Team/Enterprise).
| Tool | Purpose | Scope |
|---|---|---|
| list_projects | List the API key project | any |
| list_domains | List sender domains | any |
| list_templates | List draft and published templates | template:read or email:send |
| create_template | Create from HTML or starterId | template:write |
| update_template | Update by id or alias | template:write |
| publish_template | Make a draft sendable | template:write |
| preview_template | Render with sample variables | template:read or email:send |
| get_usage | Daily sending usage | analytics:read |
| send_email | Queue a send; supports template.alias | email:send |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "send_email",
"arguments": {
"from": "hello@your-verified-domain.com",
"to": ["customer@example.com"],
"template": {
"alias": "welcome",
"variables": { "first_name": "Ada", "product_name": "Acme", "action_url": "https://app.acme.com/start" }
}
}
}
}Agent plugins
The connector pack (manifests + skill + remote MCP client config) is public at github.com/kondasviktor/allstackd-plugin. It is not the AllStackd product source. Set ALLSTACKD_API_KEY after install.
| Surface | Status | How to use |
|---|---|---|
| Cursor | Live on cursor.directory | cursor.directory/plugins/allstackd or API-key MCP |
| Grok Build | Submitted to xAI plugin marketplace | grok mcp add --transport http allstackd https://allstackd.com/api/mcp until the catalog PR merges |
| Antigravity CLI | Install from path (no public catalog) | Clone the plugin repo, then agy plugin install …/antigravity |
| ChatGPT / Codex | OAuth MCP ready — submit via OpenAI plugin portal | https://allstackd.com/mcp |
| Claude Connectors | Paused | Directory portal requires Anthropic Team/Enterprise |
Need onboarding help? Email support@allstackd.com.