novu-manage-preferences について
Novuの通知設定をワークフローとサブスクライバー向けに構成する開発者用スキルです。チャネルの既定値や個別設定が配信とUIにどう反映されるかを説明します。
主な機能
- 01ワークフローのチャネル既定値設定
- 02サブスクライバー設定の取得と更新
- 03全体またはワークフロー単位の上書き
- 04設定の優先順位の説明
- 05Reactへの設定UIの組み込み
活用シーン
- 01マーケティングチャネルの配信停止を可能にする
- 02チャネルの既定の有効状態を設定する
- 03ワークフロー横断でメール設定を管理する
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ novuhq/ skills --skill novu-manage-preferencesインストール後、Claude Code で/novu-manage-preferencesを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/preferences-ui-examples.mdsubscriber-preferences-examples.mdworkflow-preferences-examples.md詳細
設定の管理
Novu には 2 段階の設定システムがあります。
- ワークフローのデフォルト設定 — UI ベースのワークフローではダッシュボードで、フレームワークベースのワークフローではコードで設定し、すべてのサブスクライバーに適用されます。
- サブスクライバーによる上書き設定 — エンドユーザーが設定し、ワークフローのデフォルト設定を上書きします。
ワークフローレベルの設定
@novu/framework でワークフローを定義する際に、デフォルト設定を行います。
import { workflow } from "@novu/framework";
const alertWorkflow = workflow("system-alert", execute, {
preferences: {
all: { enabled: true, readOnly: false },
channels: {
email: { enabled: true },
sms: { enabled: false },
push: { enabled: true },
chat: { enabled: false },
inApp: { enabled: true },
},
},
});
コードでワークフローを作成していますか?Framework のセットアップ、Bridge Endpoint、ステップの制御、デプロイの詳細については、
framework-integrationを参照してください。
チャネルの種類
| チャネル | 説明 |
|---|---|
email | メール通知 |
sms | SMS テキストメッセージ |
push | モバイル/ウェブのプッシュ通知 |
chat | Slack、Discord、Teams など |
inApp | アプリ内受信トレイ通知 |
読み取り専用の設定
readOnly: true を設定すると、ワークフローのチャネルが設定 UI に表示されなくなり、サブスクライバーはオン/オフを切り替えられません。
const criticalAlertWorkflow = workflow("critical-alert", execute, {
preferences: {
all: { enabled: true, readOnly: true }, // subscriber CANNOT disable
},
});
readOnly と critical の違い — 適切な方を選ぶ
これらは異なる保証を持つ別々の仕組みです。全体の比較については、design-workflow/references/severity-and-critical.md を参照してください。
| フラグ | 動作 |
|---|---|
preferences.all.readOnly: true | UI のみ。 ワークフローを設定 UI に表示しないため、サブスクライバーは切り替えられません。 |
critical: true (ワークフローレベル) | 実行時。 サブスクライバーの設定を無視し、ダイジェストをスキップして、遅延なしで実行します。 |
通知を必ず配信する必要がある場合(アカウントの停止、セキュリティアラート、パスワードのリセットなど)は、critical: true を設定してください。readOnly: true だけでは、実行時に既存のサブスクライバーによる上書き設定は無視されません。
任意の設定(サブスクライバーによる編集が可能)
const marketingWorkflow = workflow("weekly-newsletter", execute, {
preferences: {
all: { enabled: true, readOnly: false }, // subscriber CAN disable
channels: {
email: { enabled: true },
sms: { enabled: false }, // off by default, subscriber can enable
},
},
});
サブスクライバーレベルの設定
サブスクライバーは、ワークフローのデフォルト設定を上書きできます(readOnly: true の場合を除く)。
サブスクライバーの設定を取得する
import { Novu } from "@novu/api";
const novu = new Novu({
secretKey: process.env.NOVU_SECRET_KEY,
});
const preferences = await novu.subscribers.preferences.list({
subscriberId: "subscriber-123",
});
サブスクライバーの設定を更新する
await novu.subscribers.preferences.update(
{
workflowId: "weekly-newsletter",
channels: {
email: false, // opt out of email
inApp: true, // keep in-app
},
},
"subscriber-123"
);
グローバル設定
workflowId を省略すると、すべてのワークフローの設定を更新できます。
await novu.subscribers.preferences.update(
{
channels: {
sms: false, // disable SMS for all workflows
},
},
"subscriber-123"
);
設定の適用順序
Novu が通知を配信するかどうかを判断する際、次の順序で設定を確認します。
- サブスクライバーのワークフロー設定(最も具体的) — 特定のワークフローに対するサブスクライバーの上書き設定
- サブスクライバーのグローバル設定 — すべてのワークフローに適用されるサブスクライバーのデフォルト設定
- ワークフローのデフォルト設定 — 開発者がコードで定義したデフォルト設定
- システムのデフォルト設定 — すべてのチャネルが有効
最も具体的な設定が優先されます。特定のワークフローでサブスクライバーがメールを無効にしている場合、グローバルのメール設定が有効でも、ワークフローの設定が優先されます。
設定 UI コンポーネント
React
import { Inbox } from "@novu/react";
function App() {
return (
<Inbox
applicationIdentifier="YOUR_NOVU_APP_ID"
subscriberId="subscriber-123"
subscriberHash="HMAC_HASH"
>
{/* The Preferences panel is built into the Inbox */}
</Inbox>
);
}
<Inbox /> コンポーネントには、設定アイコンからアクセスできる設定パネルが組み込まれています。
単独の設定コンポーネント
<Preferences /> コンポーネントを単独で使用します。
import { Inbox, Preferences } from "@novu/react";
function PreferencesPage() {
return (
<Inbox
applicationIdentifier="YOUR_NOVU_APP_ID"
subscriberId="subscriber-123"
>
<Preferences />
</Inbox>
);
}
よくあるパターン
重要なアラート(常に有効)
preferences: {
all: { enabled: true, readOnly: true },
}
サブスクライバーはオプトアウトできません。セキュリティアラート、支払い通知、法的通知に使用します。
マーケティング(オプトアウトしやすい設定)
preferences: {
all: { enabled: true, readOnly: false },
channels: {
email: { enabled: true },
sms: { enabled: false },
},
}
サブスクライバーはチャネルを切り替えられます。SMS はデフォルトでオフです。
デフォルトではアプリ内通知のみ
preferences: {
all: { enabled: false },
channels: {
inApp: { enabled: true },
},
}
アプリ内通知のみが有効です。サブスクライバーは必要に応じて、ほかのチャネルを有効にできます。
よくある落とし穴
readOnly: trueはチャネル単位ではなく、ワークフロー単位です —allレベルでreadOnlyを設定します。個々のチャネルはこれを継承します。- サブスクライバーの上書き設定は、
readOnlyのワークフローには適用されません — ワークフローが読み取り専用の場合、サブスクライバーの設定は無視されます。 - ワークフローのデフォルトで
enabled: falseにすると、チャネルはオフになります — サブスクライバーは引き続きチャネルを有効にできます(readOnly: trueの場合を除きます)。 - Preferences UI には、読み取り専用ではないワークフローのみが表示されます — 読み取り専用のワークフローは、サブスクライバーの設定パネルに表示されません。
- グローバル設定は、読み取り専用ではないすべてのワークフローに適用されます — 「すべてのメールを無効にする」設定として便利ですが、ワークフロー固有の設定が優先されます。