> Lettrove docs 1.x · https://docs.lettrove.com/docs/going-live/troubleshooting

# Troubleshooting

The editor never leaves an empty box: when it cannot open, the box says why, with a code. Your
`createEditor` call rejects with the same code (`error.code`), and `@lettrove/node` throws a
`LettroveApiError` with it. Find the code below, or start from what you see.

## By what you see

### The box is empty, or stays on its loading shimmer

- **The container has no height.** The editor fills its element; give it one (`height: 720px` or
  `100vh`).
- **`createEditor` was never called**, or threw before it ran: check your browser console.

### The box says `frame_blocked`

The editor's frame did not answer. In order of likelihood:

1. **Your site is not on the project's list** for this key's environment. Settings → Embed → Sites.
   (A test key allows `localhost` already.)
2. **The publishable key is wrong**, revoked, or from another project.
3. **Your page's Content-Security-Policy** blocks the frame: add `frame-src https://lettrove-embed.com`.
   When this is the cause, the message names the rule.
4. **The `release` you asked for does not exist**, or is a release candidate opened with a live key.

### The box says `token_invalid`

Your `getToken` did not give the editor a token. Look at **your server's** log for the token request:
its answer has the real code (`key_invalid`, `origin_not_allowed`…). Also check `getToken` resolves
with the `token` **string**, not the whole JSON answer.

### The box says `origin_not_allowed`

The token was minted for another site than the page showing the editor. Mint it with the page's own
origin: the `Origin` header of the request your page made.

### The box says `key_invalid`

The publishable key in your page and the secret key on your server belong to **different projects**
(or one is test and the other live). Use the pair from the same project and environment.

### Edits are not saved

The editor saves as your user works and fires `design:saved`. If it stops: check your browser's
network tab for `/api/embed/v1/editor` requests. A `token_expired` answer is normal and renewed
automatically through `getToken`; if `getToken` fails then, saving stops until it works again.

### A webhook does not arrive

Settings → Embed → your project → **Webhooks** → **Deliveries** shows every attempt and your
server's answer. Usually: the address is not reachable from the internet (`localhost` never is),
your server answered something other than `2xx`, or took longer than 10 seconds.

### An exported email shows `{{…}}`

A merge tag was not filled. Check `mergeTags` in the export: fill those through `merge`, or with
your email service. See [Merge tags](/docs/editor/merge-tags).

## Every error code

The full list, with what each means and what to do, is in [Error codes](/docs/api/errors).

## Still stuck

Write to support@lettrove.com with the `requestId` from the error (every API refusal has one): it
lets us find exactly what happened.
