Ulabase

Build

Email

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.

The Email page: today’s count against the daily limit

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.

  1. Console → your service → Email

  2. 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

orders@yourshop.com

From name

Your Shop

SMTP server

smtp.yourprovider.com

Port

465 for implicit TLS, 587 for STARTTLS

Username

usually the full address

Password

never shown again

Using Gmail

Gmail works with an app password; it refuses your account password.

  1. Turn on 2-Step Verification on your Google account, if it is not already on. App passwords need it.

  2. Go to myaccount.google.com/apppasswords and create one. Google shows it once: copy it now.

  3. Fill the form in with:

Field Value

From address

your Gmail address

SMTP server

smtp.gmail.com

Port

465, or 587 for STARTTLS

Username

your Gmail address, in full

Password

the app password

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.