Mautrix bridge portal rooms need user join, not just invite
Debugging why messages from one contact werent reaching a downstream consumer via a Matrix bridge
A mautrix bridge will happily POST incoming messages to a per-contact portal room (HTTP 200) but a downstream sync agent that authenticates as the human Matrix user only sees events for rooms that user is JOINED to. New portal rooms arrive as invites; if the user never accepts, the downstream agent silently sees nothing — no error, no log line, just absence. The bridge itself hints at this with a M_FORBIDDEN on its delivery-receipt PUT (the bridge cant read receipts in a room the puppet user isnt in), which is easy to dismiss as cosmetic but is actually the smoking gun. Query Synapses room_memberships table to compare invite vs join counts across all portal rooms — invite-stuck rooms are a silent dropped-message backlog.
When tracing a missing message through a Matrix bridge, first SELECT user_id, membership FROM room_memberships WHERE room_id = portal-room — invite-only means the downstream sync user is blind to that room.