Advanced

Contact form

Add a working contact form to Signal's Contact page with a Formspree (or any JSON) endpoint, reason chips, and a graceful mailto fallback when JavaScript is off.

Signal's Contact page pairs your own "reasons to get in touch" with a working message form. Create a page slugged contact (see Page templates); the page body becomes the left column, and the form sits on the right.

Set the form endpoint

The form posts to a JSON form endpoint — Formspree works well — that you provide via a meta tag in the Contact page's Code Injection. It's never hardcoded in the theme.

Create your form endpoint (e.g. a new Formspree form) and copy its URL.

Open the Contact page in Ghost, go to Page settings → Code injection, and add this to Page header:

<meta name="signal-contact-form" content="https://formspree.io/f/XXXXXXXX">

Save the page. The form now submits to your endpoint, with an inline success or error message — no page reload.

The Contact page form

Contact page - Editor view

Contact page - Editor view

Contact page - Code injection

Contact page - Code injection

Reason chips

The form includes quick reason chips so messages arrive pre-labelled: Pitch a guest (the default), Sponsorship, Press, and General. The chosen reason is sent along with the message.

The mailto fallback

The left column is your page body — write it as a few "reasons" with email links (Ghost's product or button cards work well). If a visitor has JavaScript off, or you haven't set an endpoint yet, the form simply doesn't intercept and those email links remain the way to reach you.

Straight quotes only

Paste the meta tag into a plain-text field (or Ghost's Code Injection box directly). If an editor turns the quotes into "smart quotes", HTML won't read the tag.