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

# Notifications

> Configure notification settings for your community site

export const PlanAvailability = ({feature = 'This feature', plan = 'enterprise', addon = false, plural = false, support = false, growth, momentum, enterprise, children}) => {
  const rank = {
    growth: 0,
    momentum: 1,
    enterprise: 2
  };
  const normalize = value => {
    if (value === true || value === 'included' || value === 'yes') {
      return 'included';
    }
    if (value === 'addon') {
      return 'addon';
    }
    return 'none';
  };
  const defaultStatus = p => {
    if (rank[p] < rank[plan]) {
      return 'none';
    }
    return addon ? 'addon' : 'included';
  };
  const overrides = {
    growth,
    momentum,
    enterprise
  };
  const status = p => overrides[p] === undefined ? defaultStatus(p) : normalize(overrides[p]);
  const plans = [{
    key: 'growth',
    label: 'Growth'
  }, {
    key: 'momentum',
    label: 'Momentum'
  }, {
    key: 'enterprise',
    label: 'Enterprise'
  }];
  const included = plans.filter(p => status(p.key) === 'included');
  const asAddon = plans.filter(p => status(p.key) === 'addon');
  const verb = plural ? 'are' : 'is';
  const srSentence = [feature, verb, 'available on:', included.map(p => `${p.label} plan`).join(', ') || 'no plans', asAddon.length > 0 ? `; as an add-on: ${asAddon.map(p => `${p.label} plan`).join(', ')}` : ''].join(' ');
  const statusCell = s => {
    if (s === 'included') {
      return <svg className="plan-availability-check" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="3" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true">
          <path d="M20 6 9 17l-5-5" />
        </svg>;
    }
    if (s === 'addon') {
      return <span className="plan-availability-addon">Add-on</span>;
    }
    return <span className="plan-availability-none">—</span>;
  };
  return <div className="plan-availability">
      <span className="plan-availability-sr">{srSentence}</span>
      <div className="plan-availability-content" aria-hidden="true">
        <div className="plan-availability-feature">{feature}</div>
        {(support || children) && <div className="plan-availability-body">
            {support && <>
                Contact <a href="mailto:support@tightknit.ai">Support</a> if you
                don't see this option or want to enable it for your community.
              </>}
            {children && <> {children}</>}
          </div>}
      </div>
      <div className="plan-availability-matrix" aria-hidden="true">
        {plans.map(p => <div className="plan-availability-plan" key={p.key}>
            <span className="plan-availability-plan-name">{p.label}</span>
            {statusCell(status(p.key))}
          </div>)}
      </div>
    </div>;
};

## Member Notifications

The **Member Notifications** toggle controls whether your members receive in-app notifications and emails from Tightknit. When disabled, no member-facing notifications (in-app or email) will be sent for activity in your community.

To manage this setting:

1. Navigate to **[Site > Notifications > General](https://studio.tightknit.ai/-/website/notifications/general)** in the Tightknit Admin Studio.
2. Toggle **Enable member notifications** on or off. Changes save automatically.

<Warning>
  Turning member notifications off will silence all member-facing in-app notifications and emails community-wide. Admin-facing Tightknit Hub channel notifications in Slack are unaffected.
</Warning>

## Email Digests

When email digests are enabled for your community, Tightknit groups multiple notification events into a single digest email instead of sending each one individually. This reduces inbox clutter while keeping members informed of community activity.

Digests work on a cooldown model: after a notification event occurs, Tightknit waits for a quiet period before sending the digest. If new events keep arriving, they are added to the same batch. A maximum wait cap ensures the digest is always delivered within a reasonable window, even during sustained activity.

<Note>In-app notifications are always delivered instantly, regardless of whether email digests are enabled.</Note>

## Custom Email Domain

<PlanAvailability feature="Custom email domains" plural />

You can configure a custom email domain so that authentication emails (like magic link logins) are sent from your own domain instead of the default Tightknit domain. This helps with brand recognition and email deliverability.

To set up a custom email domain:

1. Navigate to **[Site > Notifications > Email Domain](https://studio.tightknit.ai/-/website/notifications/domain)** in the Tightknit Admin Studio
2. Click **Configure**
3. Enter your desired email domain (e.g., `notify.yourdomain.com`)
4. Add the required DNS records to your domain provider (see the [DNS setup guide](/guides/custom-email-domain) for detailed instructions)
5. Click **Verify** to confirm the DNS records are set up correctly

Once verified, authentication emails will be sent from your custom domain (e.g., `community@notify.yourdomain.com`).

<Warning>
  DNS record propagation can take up to 48 hours. If verification fails, wait and try again later.
</Warning>


## Related topics

- [Overview](/community-site/overview.md)
- [Team Notifications](/slack/notification-settings.md)
- [Tutorial: Make Webhook → Slack notification](/events/tutorials/webhook-make-slack.md)
- [Agent Settings](/channels-and-feeds/agent-settings.md)
- [Tightknit Data Security & Privacy](/security/data.md)
