Auth model
Installed plugin + outgoing / incoming webhooks + Synology Chat room config
NAS-native chat for operators who want the assistant close to self-hosted infrastructure.
Synology Chat setup for OpenClaw: plugin install, outgoing versus incoming webhook roles, DM policy, user-ID allowlists, SSL posture, verification, and multi-account webhook routing.
Auth model
Installed plugin + outgoing / incoming webhooks + Synology Chat room config
Safety stance
Treat the NAS and webhook boundary as one security surface, especially on home or small-business networks.
Verification ritual
Confirm outbound and inbound webhook paths separately before relying on room-level interactions.
Rollout mode
25–40 min setup
Synology Chat DM webhooks
The plugin bridges outgoing and incoming webhooks, recommends `allowlist` for production, and will not start the route if that allowlist is empty.
Watch the DM webhook
Webhook mismatch and NAS environment drift can make failures look like generic connectivity issues.
Synology Chat is a webhook-operated DM lane. The important operator distinction is that inbound trust, outbound delivery, and OpenClaw user policy are three different things, and you need all three aligned before the channel feels reliable.
Operator companion pages (read these alongside this channel dossier):
Synology Chat is a good fit when OpenClaw needs to live close to an existing NAS-centered environment instead of a public cloud chat platform.
That gives you a distinctive shape:
This is not a QR-login channel and not a tenant app-registration gauntlet. It is a routing-heavy integration, which means the operator work is less about “logging in” and more about getting the webhook topology right.
Use this dossier when you need to decide:
Most first-run issues come from mixing up the channel’s three control points.
The outgoing webhook in Synology Chat sends inbound messages to your Gateway.
By default, OpenClaw expects:
https://gateway-host/webhook/synologyYou can change that with channels.synology-chat.webhookPath, but then Synology must point to the same custom path.
Replies use the Synology Chat incoming webhook URL configured in incomingUrl.
If inbound routing works but outbound replies do not, the problem is often here rather than in DM policy.
The official docs make the intended production posture clear:
dmPolicy: "allowlist" is the recommended default,allowedUserIds holds Synology user IDs,open allows any sender,disabled blocks DMs,This distinction matters because a valid webhook does not mean an authorized sender, and an authorized sender does not help if the webhook route never started.
For a first real deployment, use:
dmPolicy: "allowlist",allowedUserIds list.{
channels: {
'synology-chat': {
enabled: true,
token: 'synology-outgoing-token',
incomingUrl: 'https://nas.example.com/webapi/entry.cgi?api=SYNO.Chat.External&method=incoming&version=2&token=...',
webhookPath: '/webhook/synology',
dmPolicy: 'allowlist',
allowedUserIds: ['123456'],
rateLimitPerMinute: 30,
allowInsecureSsl: false,
},
},
}
This is a good baseline because it keeps the route narrow and explicit:
Synology Chat is plugin-based rather than core.
Install from a local checkout with:
openclaw plugins install ./extensions/synology-chat
Then in Synology Chat integrations:
webhookPath.If you keep the default path, the outgoing webhook should target:
https://gateway-host/webhook/synology
The official docs list env vars for the default account:
SYNOLOGY_CHAT_TOKENSYNOLOGY_CHAT_INCOMING_URLSYNOLOGY_NAS_HOSTSYNOLOGY_ALLOWED_USER_IDSSYNOLOGY_RATE_LIMITOPENCLAW_BOT_NAMEConfig values override env vars.
That means env is useful for bootstrap, but config is usually the clearer long-term source of truth for webhook routing and account-specific behavior.
allowlist: recommended production defaultThis is the strongest general-purpose posture for internal or semi-internal deployments.
{
channels: {
'synology-chat': {
dmPolicy: 'allowlist',
allowedUserIds: ['123456', '789012'],
},
},
}
The official docs also make one operational rule explicit:
in
allowlistmode, an emptyallowedUserIdslist is treated as misconfiguration and the webhook route will not start.
That is a very useful property because it fails closed instead of silently becoming open.
open: only when any sender should reach the botopen is available, but it is the opposite of the documented recommended default.
Use it only when broad inbound access is intentional.
The docs include pairing commands for this channel:
openclaw pairing list synology-chat
openclaw pairing approve synology-chat <CODE>
If you want approval-based onboarding rather than a hard-coded allowlist, pairing is available, but the official production recommendation still leans toward allowlist.
allowInsecureSsl exists for a reason, but the docs are cautious about it.
Recommended posture:
allowInsecureSsl: false,true when you explicitly trust a self-signed local NAS certificate.This is a classic local-infrastructure tradeoff: convenience can mask certificate mistakes. Default strictness is the better habit.
Do not treat “one message seemed to work” as full validation. This lane is safest to verify in two halves.
webhookPath.The official docs provide a direct send test using numeric Synology Chat user IDs:
openclaw message send --channel synology-chat --target 123456 --text "Hello from OpenClaw"
openclaw message send --channel synology-chat --target synology-chat:123456 --text "Hello again"
If this works while inbound does not, your outbound webhook is probably fine and the problem is on the incoming route or token side.
The docs also note that media sends are supported through URL-based file delivery.
The official docs give enough to identify the common first failures without guessing.
If dmPolicy is allowlist and allowedUserIds is empty, the route is treated as misconfigured and does not start.
That is the first thing to inspect before chasing generic webhook failures.
If Synology points to /webhook/synology but your config changed webhookPath, inbound requests will miss the route.
This is one of the easiest mistakes to create during iterative setup.
If you are using a self-signed local NAS certificate, strict SSL can block delivery until you either trust the certificate properly or deliberately set allowInsecureSsl: true.
The docs recommend keeping that flag off unless you explicitly trust the environment.
The plugin verifies inbound webhook tokens and rate-limits per sender.
That is good for production, but it also means a copied URL alone is not enough if the token or sender expectations are wrong.
Synology Chat supports multiple accounts under channels.synology-chat.accounts.
That matters when you want to separate:
Example from the official docs:
{
channels: {
'synology-chat': {
enabled: true,
accounts: {
default: {
token: 'token-a',
incomingUrl: 'https://nas-a.example.com/...token=...',
},
alerts: {
token: 'token-b',
incomingUrl: 'https://nas-b.example.com/...token=...',
webhookPath: '/webhook/synology-alerts',
dmPolicy: 'allowlist',
allowedUserIds: ['987654'],
},
},
},
},
}
For operators, the main takeaway is simple: if you split accounts, give each one a webhook path and policy you can reason about independently.
A stable Synology Chat deployment usually means:
allowlist as the default trust model,This channel rewards disciplined webhook ownership more than improvisation.
Synology Chat is a strong fit for:
It is less compelling as a first public-facing assistant surface. Its strength is controlled routing, not broad consumer messaging ergonomics.
Verification & references
References