What it does
Deliveries
A delivery is one form and where its enquiries go, named for you, such as “Contact form → Shop inbox”. One form can have several. It is all on one page: New delivery, then each delivery’s own page with Send a test, Edit, Turn off and Delete.
Each enquiry goes to one or more addresses, with the form’s own field labels. Pressing Reply answers the person who sent it.
HubSpot
Each enquiry becomes a HubSpot form submission, so your HubSpot workflows and notifications run. Paste the form’s share link or embed code; no HubSpot key is stored. Form fields are matched to HubSpot fields from a list, automatically where the names make it obvious.
Zapier, Make, n8n or your own app
Each enquiry is sent as flat JSON, signed with Standard Webhooks headers and a secret for each delivery, so the app can check that it came from your site. A list of marks travels with it.
A delivery log
Who sent the enquiry, through which delivery and whether it arrived, with a Send again button. Editors, usually your client, can read it; only admins add or change deliveries. Enquiries from a form no delivery takes are kept, and one press adds the form to a delivery and sends them.
Retries
An enquiry that gets no answer is tried 8 times over about two days. When a service refuses one for a reason that would fail again, it is not retried: the page says in plain words what to fix, with the service’s own words beneath.
Alerts by email
To several addresses, with the site’s name first in the subject and each kind at most once a day: an enquiry could not be delivered, a form that usually gets enquiries has had none for 3 days, or retries are waiting because scheduled tasks are not running.
Marks, not filters
A possibly fake address, the same address again and possibly spam are marked in the log and at the top of each delivered email, and still sent. For each delivery you can hold repeats for 24 hours or 7 days, and hold possibly spam; a held enquiry is listed as Not sent, and Send again sends it.
Where it came from
The page address and UTM values travel with each enquiry when the form has fields for them, named page_url, utm_source, utm_medium, utm_campaign, utm_term or utm_content.
Send a test
A test is sent when you save a new delivery, and each delivery’s page has Send a test, so you know it works before a real enquiry arrives. For HubSpot only when you ask, because a test adds a contact. A dashboard widget shows the enquiries of the week.
Install
How to install a plugin on EmDash: the registry or npm
Install it from Registry in your EmDash admin, or add it in the site’s code, next to the official forms plugin, 0.2.11 or newer (earlier versions save a ticked consent box as unticked, so the enquiry arrives without consent):
npm install @moorage/plugin-lead-delivery// astro.config.mjs
import { formsPlugin } from "@emdash-cms/plugin-forms";
import leadDelivery from "@moorage/plugin-lead-delivery";
import emdash from "emdash/astro";
export default defineConfig({
integrations: [
emdash({
plugins: [formsPlugin(), leadDelivery],
}),
],
});Under plugins, beside the forms plugin, is the simplest. From 0.4.0 it also works under sandboxed, which is how the registry runs it; that needs a sandbox runner. It needs EmDash 1.3.0 or newer, and installed from the registry, sending email needs EmDash 1.4.0 or newer. Enquiries are sent by a scheduled run every minute, usually within a minute of arriving, and the same runs handle retries and alerts: on Cloudflare, a Cron Trigger every minute, which the EmDash templates already have.
Then open Lead delivery, under Marketing in the admin, and press + New delivery: choose the form and where to send, and a test is sent when you save.
EmDash’s form editor cannot yet be pointed at another plugin, so each form is connected once. After a form’s first delivery, Connect this form does it in one step where the site can call its own address; otherwise it shows the instructions for that form, written for your site, for whoever looks after the site’s code, and can email them.
Screenshots



What it does not do
- No Mailchimp yet.
- File attachments are not sent. The log says the enquiry has one, and the file stays in Forms > Submissions.
- It does not replace the Forms inbox: every enquiry is kept there whatever happens here.
- It does not block spam at the form: it marks possibly spam and can hold it. To stop bots at the form, turn on Turnstile in the form’s settings under Forms.
- No reports or charts, no routing rules, no syncing back from HubSpot and no HubSpot tracking cookie.
- Each form is connected once, until EmDash’s form editor can point a form at another plugin: in one step where the site can call its own address, otherwise by someone who looks after the site’s code, following the instructions it writes.
Permissions
It asks to send web requests to the addresses you enter (HubSpot and your apps), to send email (email deliveries and the alerts), and to read the forms’ notification emails to its own private address, which it then cancels so that nobody receives them. Enquiries go nowhere you have not chosen.
Questions
Is it free?
Yes, on any number of EmDash sites, your own or your clients’, with no account and no key. It is open source under the MIT License; the licence page says in plain words what you may do with it.
Doesn’t EmDash’s forms plugin already email enquiries?
It can email several addresses, but only if someone sets them through its API, and a failed email is only noted in the server log. Lead Delivery adds the settings in the admin, the log, retries, alerts, HubSpot and Zapier.
How do I send EmDash form submissions to HubSpot?
Install this plugin, open Lead delivery, press + New delivery, choose the form and HubSpot, and paste the HubSpot form’s share link or embed code. Each enquiry becomes a HubSpot form submission. The HubSpot form must have the fields you send, at least Email, and CAPTCHA must be off on it.
How do I connect EmDash forms to Zapier, Make or n8n?
In New delivery, choose “Another app” and paste the address the app gave you: in Zapier “Webhooks by Zapier” (a paid Zapier plan), in Make a Custom webhook, in n8n a Webhook node. Each request is signed, so the app can check that it came from your site.
How do I stop spam from EmDash forms?
To stop bots at the form, turn on Turnstile in the form’s settings under Forms. Lead Delivery marks what gets through as possibly spam; turn on “Don’t send possibly spam” on a delivery’s page to hold those. Held enquiries are listed as Not sent, and Send again sends one.
Does it lose enquiries?
Not from the moment one reaches it. Each enquiry is stored once and kept until all its deliveries are done, and every enquiry is also in Forms > Submissions. An enquiry from a form with no delivery is listed as Not sent. If a form stops reaching the plugin altogether, the quiet-form alert tells you after 3 days.
Why was a marked enquiry still sent?
Marks are a guess, so they never block on their own. Turn on “Don’t send possibly spam” or a repeat choice on the delivery’s page to hold those.
Why does HubSpot refuse every enquiry?
CAPTCHA may be on for that HubSpot form. HubSpot refuses enquiries sent from a website to a form that has CAPTCHA on.
Can my clients change it?
No. Editors see the counters, the deliveries and the log, and can press Send again; only admins add or change deliveries.
I set it up before 0.2.0. Do I need to do anything?
No. Each inbox, HubSpot form or app you set up becomes a delivery, so the log, retries, HubSpot matching, app secrets and connected forms keep working. Each delivery gets a new name, and the page says so once.
Is it in the EmDash registry?
Yes, as @moorage.dev/lead-delivery. Install it from Registry in your EmDash admin, or from npm in the site’s code, as shown under Install.
What is the line at the foot of the plugin’s page?
Only admins see it: “Help · More free plugins · by Moorage”. Help opens the plugin’s setup guide; editors never see the line. To hide it, switch on “Hide the help line at the foot of this page” under Settings for the whole site and press Save.
Where do I report a problem?
Open an issue on GitHub. If it is a security problem, write to security@moorage.dev instead.
Report a problem on GitHub: what happened, and your EmDash and plugin versions.
What should we make next?
Tell us the job you would like a plugin to do. We read every answer and use your email only to reply to it; release emails come only if you tick the box.