---
title: Development and production
description: Two environments, deliberately unlike each other.
---

import Callout from '../../../components/Callout.astro';


Every project starts with a **development** environment. You create
**production** when you are ready to have real users.

They share nothing: separate users, separate keys, separate signing keys,
separate organizations. A user who signs up in development does not exist in
production.

## What development does differently

**Email is captured, not delivered.** Sign-up confirmations, magic links and
password resets are stored and shown in the console's Sandbox instead of being
sent. You can build and test a whole sign-up flow without an inbox, and without
emailing a real person by accident during a seeding script.

**Limits are lower.** Development caps the number of users, which keeps a
runaway test loop from filling a table you will never look at again.

**The ZevAuth badge always shows.** "Secured by ZevAuth" cannot be removed in
development on any plan, so you never design against a screen that production
will not give you.

<Callout type="info">
Only production users count toward billing. A development environment full of
seed data costs you nothing. See [monthly active users](/api/) for how the
count works.
</Callout>

## Going live

Production requires a verified domain, because a publishable key is locked to
it. The console walks you through the DNS records and tells you what is
outstanding.

Once production exists, the two run side by side forever. You do not migrate
between them, and you do not promote one to the other.