> For the complete documentation index, see [llms.txt](https://docs.themeupstudio.com/crimson/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.themeupstudio.com/crimson/custom-pages/sign-up.md).

# Sign Up

The **Sign up** page is the dedicated place where visitors can create a Ghost member account on your site — either via **Ghost Portal** (overlay) or via a **custom inline sign-up form**, depending on your theme setting.

<figure><img src="/files/Yn7qNdQ1OEOgr1kZB5js" alt=""><figcaption><p>Sign Up page in Crimson</p></figcaption></figure>

### How to create the Sign Up page in Crimson? <a href="#how-to-create-the-sign-in-page-in-crimson" id="how-to-create-the-sign-in-page-in-crimson"></a>

To create Sign Up page, you do not need to create anything inside Ghost. Just upload the `routes.yaml` file and Crimson will create the custom Sign Up page.

{% hint style="success" %}
Read more about `routes.yaml` file at [Upload routes.yaml file](https://docs.themeupstudio.com/crimson/getting-started/upload-routes.yaml-file)
{% endhint %}

***

### URL and route setup <a href="#url-and-route-setup" id="url-and-route-setup"></a>

For Sign Up page, we have following `routes.yaml` configuration.

```yaml
routes:
  /signup/:
    template: signup
```

This tells Ghost: when someone opens **`/signup/`**, render **`signup.hbs`**.

{% hint style="warning" %}
If you see a 404 on `/signup/`, the route is either missing, your `routes.yaml` hasn’t been uploaded, or Ghost hasn’t reloaded routes yet.
{% endhint %}

***

### Settings that control the page behavior

#### A) Crimson setting: `use_portal_links`

This is your theme toggle that decides *how* people sign up:

* **ON** → open **Ghost Portal** sign-up (overlay) using Portal links (`#/portal/signup/` or `data-portal="signup"`). Portal link behavior is supported directly by Ghost.
* **OFF** → show a **custom inline sign-up form** that Ghost handles via `data-members-form="signup"`.

{% hint style="success" %}
Read more about `use_portal_links` site wide setting in [Site-wide Settings](/crimson/custom-settings/site-wide-settings.md)
{% endhint %}

#### B) Ghost Admin setting: “Who should be able to subscribe to your site?”

In Ghost Admin → **Settings → Membership → Access**, Ghost lets you choose:

1. **Anyone can sign up**
2. **Paid-members only**
3. **Invite-only**
4. **Nobody**

<figure><img src="/files/wMDNDoTFzYdiyDZx4UnO" alt=""><figcaption><p>Ghost Admin settings to control Membership Access</p></figcaption></figure>

Ghost exposes this to themes via:

* `@site.members_enabled` → true if access is **not** set to “Nobody”
* `@site.members_invite_only` → true if access is set to “Only people I invite”

***

### Behavior summary <a href="#behavior-summary" id="behavior-summary"></a>

The Sign up template has 4 main branches:

#### 1) If visitor is already logged in (`@member`)

✅ **Redirect to Account page**

* Portal account if `use_portal_links` is ON → `/account/#/portal/account/`
* Normal account if OFF → `/account/`

This ensures members never see a sign-up page again.

***

#### 2) If site is invite-only (`@site.members_invite_only`)

<figure><img src="/files/SN2eU5oO4fnWKSL6JCkv" alt=""><figcaption><p>Membership access is set to Invite-only</p></figcaption></figure>

✅ Show an **invite-only message**:

<figure><img src="/files/F3BQ0pVhoaW0oecF5JX5" alt=""><figcaption><p>Sign Up page when membership access is set to Invite-only</p></figcaption></figure>

…and provide a **Sign in** link (which opens Portal Sign in if `use_portal_links` is ON, via `data-portal="signin"`). Portal links + `data-portal` are a standard Ghost feature.

{% hint style="warning" %}
Invite-only prevents public sign-ups, but imported/invited members can still log in.
{% endhint %}

***

#### 3) If memberships are enabled (`@site.members_enabled`)

This means access is either:

* **Anyone can sign up**, or
* **Paid-members only**

<figure><img src="/files/AMhWldN8iBJNta02Hq9w" alt=""><figcaption><p>Membership enabled in Ghost settings</p></figcaption></figure>

Now `use_portal_links` decides the experience:

**If `use_portal_links` is ON (Portal mode)**

* The template sets: `window.location.hash = '/portal/signup/'`
* Then it renders a simple page with a Sign up button that includes `data-portal="signup"`

**Result:** the Portal sign-up overlay opens on `/signup/` using the Portal route pattern Ghost documents.

<figure><img src="/files/sfdnXP58e44xZ48YK91D" alt=""><figcaption><p>Sign Up portal popup when <code>use_portal_links</code> is turned on</p></figcaption></figure>

{% hint style="success" %}
Portal can be customized from Ghost Admin (plans shown at signup, terms notice, requiring agreement, etc.)
{% endhint %}

**If `use_portal_links` is OFF (Custom form mode)**

The template shows an inline form:

```html
<form data-members-form="signup"> … </form>
```

<figure><img src="/files/ad7yPOePeEZiZTCNYpad" alt=""><figcaption><p>Sign Up page when membership access is enabled</p></figcaption></figure>

Ghost handles this form automatically:

* `data-members-form="signup"` sends a **signup email** for new members, and if the email already exists, Ghost sends a **signin email instead**.

{% hint style="warning" %}

#### For "Paid-members only" - Custom pages show FREE plan too

In Ghost, we do not have a setting/helper/flag to differentiate between "Anyone can signup" and "Paid-members only" for "Who should be able to subscribe to your site?" setting in Membership Access.

Due to this, the Membership page will continue to show the FREE plan too.

If this causes issues with your membership flow, please `use_portal_links` and handle the membership via Ghost provided Portal links.
{% endhint %}

***

#### 4) If memberships are disabled (`@site.members_enabled` is false)

This corresponds to Ghost Admin access = **Nobody**.

<figure><img src="/files/Q8j9xu6EWIN70v0XLGDO" alt=""><figcaption><p>Ghost Admin Setting disabling membership access</p></figcaption></figure>

Sign Up page will **not** render a sign-up UI. Instead it redirects:

* Portal sign-in hash if `use_portal_links` ON
* Otherwise `/signin/`
