> ## Documentation Index
> Fetch the complete documentation index at: https://docs.member.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Hub settings in the admin

> Change a hub's name, sign-up rules, domain, email sending, policies, redirect origins, and footer from its Settings page in the Membership.io admin.

A hub's **Settings** page is where you change how the hub looks, who can join it, what address it uses, what members must accept, and who its emails come from. To open it, select **Manage** on a hub's card on the **Hubs** page, then **Settings** in the hub sidebar. If you have not created a hub yet, start with [Getting started in the admin](/guides/admin-getting-started).

<Note>
  This Settings page is not live in production yet. Until it is turned on, your hub's **Settings** page shows a single **General settings** form instead of the sections below. [Create a hub](/guides/creating-a-hub#manage-a-hub) describes that form.
</Note>

## The Settings page

The page is titled **Settings**. It is one scrolling page of seven sections, each with its own heading and one-line description, and no separate pages to open. Under the title, a line says "Only what the API holds today. Most of it saves in one call; Domain and Email have their own verify and test steps."

| Section | What it is for |
| - | - |
| **Basics** | Hub title, slug, description, private or public, language, appearance. |
| **Sign-up** | How members register and sign in. |
| **Domain** | Custom domains, each with its own verify step. |
| **Email** | Sender identity, your own SMTP server, deliverability, blocked addresses. |
| **Policies** | Terms of Service and Privacy Policy. |
| **Tracking & footer** | Redirect origins, the Mio watermark, and custom CSS. |
| **Delete hub** | Members lose access; files stay in the Library. |

A link such as `/hubs/{hub}/settings/basics` opens the page scrolled to that section. The older addresses `/settings/email`, `/settings/privacy`, and `/settings/redirects` still work and scroll to **Email**, **Sign-up**, and **Tracking & footer**.

Most sections have **Save** and **Discard** buttons that appear once you change something. A confirmation, such as **Settings saved.**, appears after a save. Some switches, such as **Social sign-in**, **Enforce policies**, and **Mio watermark**, save as soon as you flip them. The **Registration** switch under **Sign-up** is different: it needs **Save**.

## Basics

| Field | What it does |
| - | - |
| **Hub name** | The hub's display name. Required. |
| **Slug** | The last part of the hub's web address. Use lowercase letters, numbers, and hyphens. Required. |
| **Description (optional)** | A short description of the hub. |
| **Visibility** | **Private** hubs are open only to members you invite. **Public** hubs are open to anyone. |
| **Language** | The language of the hub's buttons, menus, and automatic emails. Choose **English** or **German**. Your own content stays as you wrote it. |
| **Appearance** | **Auto** follows each member's device. Choose **Light** or **Dark** to fix the theme. |

Changing the slug changes the hub's address, so links that use the old slug stop working. If another hub already uses the slug, the field shows **That slug is already taken.** The admin does not add a suffix for you here, unlike when you [create a hub](/guides/admin-getting-started#slug-rules).

## Sign-up

**Registration** controls whether anyone with the link can join the hub for free. Turn it off to make joining invite-only. While the hub is private, the switch has no effect until you make the hub public (see **Visibility** under [Basics](#basics)).

**Social sign-in** ("Let members sign in with an account they already have.") lists the sign-in providers set up for this hub, such as Google, each with a switch and a line that says "Members can sign in with it." or "Turned off." Turning a switch on lets members sign in with that account; turning it off hides it. A switch saves as soon as you flip it, and the admin confirms with a message such as `Google turned on.` If the hub has no providers, the section says **No social sign-in providers are set up for this hub.** The admin cannot add providers yet. To register one, see [Register external sign-in providers](/guides/external-login-admin).

For how members register and sign in, see [Member authentication](/guides/member-authentication).

## Domain

Every hub has a default address, `{slug}.membership.io`, which always works. The **Domain** section adds one **custom domain** of your own, such as `www.yourdomain.com`. A hub can have one live custom domain at a time.

1. Select **Add custom domain**, type the hostname, and select **Connect**. The admin confirms with "Custom domain added".
2. The domain shows a **Not verified** badge, and the **CNAME** and **TXT** records to create appear below it, each with a copy button. Add them where you bought the domain.
3. Select **Verify**. The **Verify** dialog repeats the records and says changes can take a few minutes to show up. When the records are found, the badge becomes **Connected** and the admin says "Domain verified".

A domain can also show **Disabled**, **Failed** (with the reason under it), or **Removing**. Select **Remove** to disconnect it. The dialog explains that members can still use the default address, and that you must delete the CNAME and TXT records at your DNS provider yourself. Failed attempts from the last 30 days are listed below, each with its own **Remove**.

The admin explains the common refusals: "That domain is already connected to another hub.", "This hub already has a custom domain.", and "Your team has too many domains waiting for verification. Verify or remove one first." Only the team or hub owner can manage custom domains, and where the feature is not switched on the section says "Custom domains are not available yet."

## Email

The **Email** section has four parts.

**Email** ("Who your hub's emails come from and where replies go.") sets the sender identity:

| Field | What it does |
| - | - |
| **From name** | Shown as the sender in members' inboxes. Leave it empty to use the Membership.io default. |
| **Reply-to email** | Where replies from members go. Leave it empty to send without a reply-to. |

**Sending** ("Your mail server") sends this hub's email through your own SMTP server instead of Membership.io. Sequences only run on Membership.io's sending, so they pause while this is on. A **Status** row shows **Not set up** until you save a server. Fill in **Server address**, **Port**, **Encryption** (**STARTTLS**, **SSL/TLS**, or **None**), **Username**, and **Password**, then the **Sender** group: **From name**, **From address**, and an optional **Reply-to address**. The password is stored encrypted and never shown again; leave the field empty to keep the saved one. Select **Test and turn on**. The admin sends a test email to your own address first and saves the server only if it goes through ("Mail server saved"). Once it is on, **Send test** sends another, and **Turn off** goes back to Membership.io's sending.

**Deliverability** shows the hub's sending **Status** (**Sending normally**, **Warned**, **Slowed down**, **Suspended**, or **Not sending yet**) and, for the last 24 hours, **Sent**, **Delivered**, **Bounced** (with hard and soft counts), **Spam reports**, **Unsubscribes**, **Hard bounce rate**, and **Spam report rate**.

**Blocked addresses** lists the addresses your hub never emails: unsubscribes, spam reports, and addresses you block. **Block address** asks for an **Email address** and the admin confirms with "Address blocked". Each row says why the address is blocked. A block you added (**Blocked by you**) can be lifted with **Remove block**. The others (unsubscribes, spam reports, bounces, or a block by Membership.io) cannot be removed here, and the row says what to do. With none, the list says **No blocked addresses**.

Sending and Blocked addresses are for the team owner. Anyone else sees "Only the team owner can manage ..." and "Ask the owner of this team if something here needs to change."

## Policies

**Enforce policies** decides whether members see the Terms of Service and Privacy Policy and must accept them to join. It saves as soon as you flip it.

* On a **private** hub, switching it on makes members accept the policies.
* On a **public** hub, the Terms and Privacy Policy always show. The switch takes effect if you later make the hub private.

Below the switch, **Terms of Service** and **Privacy Policy** each have a text box:

* Write the text in Markdown. Raw HTML is not allowed.
* The text cannot be empty and can be at most 64 KB.
* Select **Save** to publish it. The saved text is the version members see.
* The box's options menu has **Preview**, which opens the public page in a new tab, and **Reset to default**, which asks you to confirm and then replaces your text with the standard one.

The Terms form also has **Ask members to accept the Terms again**. It applies to that one edit only: members are asked to accept the new version. Because it rides on an edit, you must change the Terms text before saving with it on. Otherwise the admin shows **Edit the Terms before asking members to accept them again.** The switch turns off again after each save. The Privacy Policy has no such switch.

## Tracking & footer

This section holds **Magic-link redirect origins**, the **Mio watermark**, and **Custom CSS**.

### Redirect origins

When a member signs in with a magic link, the hub can send them back to a site you list here, such as your own website. This list is the allowlist: a redirect to any other site is rejected. A new hub has none, so the section says "No redirect origins yet. Magic-link redirects are rejected until you add one."

An **origin** is the scheme, host, and optional port of a site, like `https://yourwebsite.com`. To add one, type it into **Add an origin** and select **Add origin**. To remove one, select the remove button on its row. Each add or remove saves right away.

The rules for an origin:

* It must start with `https://`. Plain `http://` is allowed only for `localhost`, `127.0.0.1`, and `[::1]`.
* Give only the origin: no path, query, or fragment. A single trailing `/` is fine.
* No username or password, so nothing before an `@`.
* No wildcards, and no spaces or control characters.
* A port is kept as you type it, including `:80` and `:443`. It must be a number from 0 to 65535.
* The host must be a plain ASCII domain name. For a Unicode domain, enter its punycode form, like `https://xn--bcher-kva.example`.
* At most 512 characters.
* An origin already in the list is not added twice.

The list holds at most 50 origins. At the limit the form is replaced by **You've reached the limit of 50 origins. Remove one to add another.** If an origin breaks a rule, the admin shows the reason under the field.

### Watermark and custom CSS

**Mio watermark** ("Shows a small Made with Mio badge in the footer of every hub page.") is a switch that saves as soon as you flip it. **Custom CSS** is loaded on every hub page after your theme, for small tweaks the editor cannot make. Select **Save** to apply it.

## Delete hub

**Delete hub** removes the hub: members lose access and the files stay in the Library. It works as described in [Delete a hub](/guides/creating-a-hub#delete-a-hub).

## Google Tag Manager through the API

The admin has no Google Tag Manager field yet, but a hub already stores its GTM container ID at `settings.tracking.gtm_container_id`, and you can set it with the Admin API. The accepted value is `GTM-` followed by 1–20 uppercase ASCII letters or digits, for example `GTM-1A2BCDEFG`. Send a JSON:API `PATCH` to the hub:

```bash theme={null}
curl --request PATCH 'https://api.member.dev/api/v1/teams/<team_id>/hubs/<hub_id>' \
  --header 'Authorization: Bearer <team_token>' \
  --header 'Content-Type: application/vnd.api+json' \
  --data '{
    "data": {
      "type": "hubs",
      "attributes": {
        "settings": {
          "tracking": {
            "gtm_container_id": "GTM-1A2BCDEFG"
          }
        }
      }
    }
  }'
```

The request must pass the usual hub edit and team-scope checks, and a successful response returns the value unchanged. The `PATCH` preserves the hub's other settings, so omit `tracking` when you are changing something else. To leave the container ID as it is, omit `settings` or `settings.tracking`. If you include `tracking`, send the `gtm_container_id` leaf: an empty object such as `{"tracking": {}}` is invalid. To clear the setting, send an explicit `null`; the hub then reads back `null`, which means no container is configured.

The `tracking` value must be an object containing only `gtm_container_id`. The API answers `422` to a `null` or non-object `tracking` value, an empty object, extra keys, an empty or malformed ID, lowercase characters, and suffixes longer than 20 characters. Errors point at the invalid setting with `source.pointer`, for example `/data/attributes/settings/tracking/gtm_container_id`. Validation happens before the update, so a rejected value is never saved. The API stores the ID only; it does not make any analytics request itself.

## Not available yet

These settings are not in the admin yet:

* Google Tag Manager, analytics, and pixel fields. The GTM container ID can be set [through the API](#google-tag-manager-through-the-api).
* Adding a social sign-in provider (see [Register external sign-in providers](/guides/external-login-admin)).

## Related guides

* [Create a hub](/guides/creating-a-hub): create, manage, and delete a hub.
* [Register external sign-in providers](/guides/external-login-admin): the providers behind **Social sign-in**.
* [Member authentication](/guides/member-authentication): registration and magic links.
* [Login with your hub](/guides/login-with-hub): use a hub as an identity provider for your own apps.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.