The bot joins but never speaks (HMAC mismatch)
Symptom: the bot joins the call (or the bridge connects), then nothing: no greeting, no response, no error in your plugin logs. ThesharedSecret (OpenClaw) / shared_secret (Hermes) must byte-match the secret set in your
StandIn dashboard. A mismatch fails the HMAC handshake silently - the bridge simply drops the
connection, so both sides look “up” while no audio flows. This is the #1 first-call issue.
Fix:
- Re-paste the secret on both sides. Watch for a trailing newline or whitespace picked up when
copying, and for shell quoting that swallows characters like
$or!. - If the secret lives in
.env, confirm the variable actually resolves (Hermes:hermes teams-voice status). - Rotate the secret in the StandIn dashboard and set the new value in the plugin config, then retry.
Bot does not join: “agent is not reachable”
Symptom: the call never gets a bot, and the sandbox console shows “Bot could not join… agent is not reachable”. StandIn connects to your plugin from the internet. If it cannot reach yourwss:// endpoint,
the bot has nothing to bridge to and does not join.
Fix, in order:
- Is the plugin running? Start it (
openclaw gateway run/hermes teams-voice serve --handler realtime) and confirm it is listening on its port. - Is the tunnel up? If you expose the endpoint via a tunnel (e.g. Tailscale), a dropped tunnel is the most common cause. Restart it and test the public URL from outside your network.
- Is the bind reachable? A loopback-only bind (
127.0.0.1) is invisible from the internet unless a tunnel forwards to it - bind0.0.0.0or keep the tunnel in front. - Does the registered URL match? The URL in your StandIn dashboard must point at the live endpoint, including port and path (see below).
Community tier: bot leaves or will not join (daily budget)
The community tier is metered: 5 minutes of bot time per day, per room, and up to 5 new rooms per day per account. When a room’s budget runs out, the bot leaves and returns the next day; once the room cap is hit, new rooms fail until tomorrow. Reusing an existing room does not count toward the room cap. If you need more time or inbound calls to your own identity, use the standard setup in the Quickstart with your own Teams bot.Wrong port or path (and callId confusion)
The two runtimes listen on different default ports but the same path:| Runtime | Default port | Path |
|---|---|---|
| OpenClaw | 9442 | /voice/msteams/stream |
| Hermes | 8443 | /voice/msteams/stream |
ws://<host>:9442/voice/msteams/stream for OpenClaw or
ws://<host>:8443/voice/msteams/stream for Hermes.
Each call carries its own
callId, and the HMAC handshake signs it per call - you never configure
a callId yourself. If logs show signature failures for a specific callId, that is the shared
secret (see above), not the id.ClawHub install fails (listing pending)
openclaw plugins install clawhub:@komaa/msteams-voice fails because the ClawHub listing is still
publishing. Until it lands, install from npm instead:
@komaa/msteams-voice;
see the plugin README for the full steps.