
Courier workspaces now support fully isolated custom environments. Name them whatever makes sense for your team (dev, staging, QA, production), give each one its own integrations and templates, and promote assets between them when you're ready.
Previously, you got two environments: Production and Test. That worked for simple setups, but it didn't reflect how most teams actually build software. If you had separate staging and QA phases, or multiple squads iterating on different messaging flows, you were cramming all of that into a single Test environment. That's over.
Each environment is a complete, isolated workspace. Templates, brands, tags, subscription topics, integrations, journeys, API keys, and logs all belong to that environment alone.
Nothing leaks between environments. Changes to templates in your dev environment don't touch staging. A new integration configuration in QA doesn't affect production. Journeys, notification logic, and provider configs are all scoped to the environment they belong to. Each environment has its own message logs and metrics, so you always know exactly what happened where.
Production stays Production. Everything else is yours to name. Rename the default Test environment to "Development," create a "Staging" environment, add "QA" for your testing team. The names map to your process, not ours.
Each environment gets its own integration configurations. Connect your staging SendGrid account to your staging environment and your production account to production. No more shared integrations with test overrides bolted on. Cleaner setup, fewer surprises.
Move templates and their dependencies (brands, tags, subscription topics) between any two environments. Promote from dev to staging, staging to production, or roll something back from production to QA for debugging. The migration flow copies all dependencies automatically so nothing breaks.
Each of these used to require workarounds: shared Test environments, naming conventions to avoid collisions, or separate Courier workspaces entirely. Now it's a first-class feature.
Custom environments are available today on all plans.
Or start with the docs to see the full details.
Already using Test and Production? Nothing changes for you unless you want it to. Your existing environments work exactly as before. You can rename your Test environment and create additional ones whenever you're ready.

React Native solved a problem nobody had. Use Flutter.
Shopify moved back to Swift and Kotlin because coding agents made two codebases affordable. That kills React Native's reason to exist. It does not touch Flutter's, and the canvas is why.

How to send Slack notifications from your app
Slack is where your customers already work, which makes it a product surface rather than only an internal alerting channel. Posting an approval request or a status change into a customer's own Slack means working in workspaces you don't own, addressing people by email rather than Slack ID, and holding a separate credential for every customer.

Your notification analytics are now available by API
If it's in the Courier dashboard, it's on the API. Analytics was one of the last screens where that wasn't true. GET /notifications/{id}/metrics returns sends, deliveries, opens, clicks, errors, and undeliverable counts per template as a time series, broken out by provider and channel, so the numbers can live in your own product or go straight to an agent.