Build
Verification, reset, invitation and order emails sent for you. How many you can send on each plan, and how to send them from your own address.
Your service sends email for you: address verification, password reset, team invitations, order confirmations. It works with no setup. This page covers how many you can send and who they come from.
Out of the box
Emails come from noreply@ulabase.com, our address.
There is a daily limit:
| Plan | Emails a day | About |
|---|---|---|
Free |
200 |
6,000 a month |
Starter |
500, or your own SMTP, not capped |
15,000 a month |
Pro |
2,000, or your own SMTP, not capped |
60,000 a month |
Enterprise |
Your own SMTP, not capped |
The count resets at midnight UTC. The Email page shows how many you have sent today.
With your own mail server no limit applies: see below.
Send yourself a test
Check first that email works.
-
Console → your service → Email
-
Click Send test email
It goes to your account address, the same way a real one goes. If it fails, the page shows what the mail server said.
|
Tip
|
The test is a real email, so it counts against your daily allowance. |
Send from your own address
Available from the Starter plan.
Your customers see orders@yourshop.com in place of noreply@ulabase.com, and our daily limit no longer applies: the sending reputation at stake is your own.
1. Set up DNS first
|
Warning
|
Do this first. If your domain has not authorised your mail server, delivery gets worse: mail that used to arrive starts going to spam. |
You need two DNS records on your domain:
-
SPF: says your mail server may send for your domain.
-
DKIM: signs your messages so they cannot be forged.
Your mail provider gives you both. Add them, then wait for them to propagate.
2. Fill in the form
Console → your service → Email → Custom SMTP server.
| Field | Example |
|---|---|
From address |
|
From name |
|
SMTP server |
|
Port |
|
Username |
usually the full address |
Password |
never shown again |
Using Gmail
Gmail works with an app password; it refuses your account password.
-
Turn on 2-Step Verification on your Google account, if it is not already on. App passwords need it.
-
Go to myaccount.google.com/apppasswords and create one. Google shows it once: copy it now.
-
Fill the form in with:
| Field | Value |
|---|---|
From address |
your Gmail address |
SMTP server |
|
Port |
|
Username |
your Gmail address, in full |
Password |
the app password |
More detail: a guide to Gmail’s SMTP settings.
3. Test it
Click Send test email again. It now goes through your server.
If it fails, the page shows the mail server’s own message:
-
Connection refused: wrong host or port. -
Authentication failed: wrong username or password. -
Relay access denied: the server will not send for that From address.
Do it from the command line
The same settings, as configuration you keep in git, with ulabase:
import { defineSetup, step, fromEnv, isRedacted } from '@ulabase/cli';
const configured = (v: unknown) =>
isRedacted(v) || (typeof v === 'string' && v.length > 0);
export default defineSetup('Mail', [
step('mails feature installed', {
check: ({ admin, srvId }) => admin.isFeatureInstalled(srvId, 'mails'),
apply: ({ admin, srvId }) => admin.installFeature(srvId, 'mails'),
}),
step('sender configured', {
async check({ admin, srvId }) {
const c = await admin.getFeatureConfig(srvId, 'mails');
return c['smtp-hostname'] === 'smtp.yourprovider.com'
&& configured(c['smtp-password']);
},
async apply({ admin, srvId }) {
const current = await admin.getFeatureConfig(srvId, 'mails');
await admin.updateFeatureConfig(srvId, 'mails', {
...current,
'sender-email': 'orders@yourshop.com',
'sender-name': 'Your Shop',
'smtp-hostname': 'smtp.yourprovider.com',
'smtp-port': 465,
'smtp-username': 'orders@yourshop.com',
'smtp-password': configured(current['smtp-password'])
? current['smtp-password']
: fromEnv('SMTP_PASSWORD'),
});
},
}),
]);
A stored password reads back as bullets. Write the bullets back and the server keeps the password it has, so the apply above passes current through unchanged.
When something goes wrong
No email arrives, and there is no error. Check today’s count on the Email page. When it runs out, sending stops until midnight UTC.
The port is ignored. Enter it as a number: 587 works, while older versions silently dropped "587" written as text.
Mail goes to spam after switching to your own server. Your SPF and DKIM records are missing or wrong. This is the most common problem, and you fix it in DNS.
A webhook stopped sending. Webhook emails count too. A webhook with several recipients takes them all from your allowance or none: five addresses with three left sends nothing.
Related pages
-
Sign-up, login and invitations: the emails your users get when they register.
-
Stripe billing: order confirmation and refund emails.
-
Webhooks: email when something happens in your data.