# Your own magic-link email

Your app can send its own magic-link email instead of Jadpo's, at
level 4 or level 5 of [Built-in emails](built-in-emails.md). This topic is
how Jadpo fills and sends it. The checks are on the Identity page
([Magic links](magic-links.md)).

## Still one delivery

Whichever level you choose, asking for a link leaves the same outbox
row: `jadpo.MagicLinkEmail`, with the address, the locale and the
request's id. The link and the code are made as it is sent.

- **At level 4** that delivery fills your app's email from them, `to:`
  the address and `locale:` the request's, with `expires_in` worded as
  Jadpo words it. It renders the email as any of your app's emails is
  rendered, in its layout.
- **At level 5** the delivery runs your app's action instead, giving it
  a `MagicLinkRequest`.

A delivery whose request was used, replaced or has expired sends
nothing, at either level.

## Each attempt its own link and code

Your app's action is retried as a subscriber's is, with the default
retries and no `retry:` of its own
([Retries and giving up](retries-and-giving-up.md)).
Each attempt makes a new link and code, replacing the last, so a message
that went out before a failure can't sign anyone in once a later one
has. An outside call within one attempt is sent again with the same link
and code, as any call is.

## Only the email holds the code

The email `email:` names is never emitted. A `SignInCode` is never kept,
answered, put in a failure or an event, or written as JSON, and
`MagicLinkEmail`'s fields are copied only into an email. What your own
sending does with the link and the code is up to you, as with any value
you send a provider. In development that call is logged with its values,
as every provider call is
([Provider calls in development: `jadpo calls`](provider-calls-in-development-jadpo-calls.md)).
