Ask

Messaging trigger works on the hosted instance but fails on my self-hosted one — same credentials, same workflow

The difference is the callback URL, and once you see it the whole class of "triggers do not work self-hosted" problems collapses into one thing.

An incoming-message trigger is not polling. When you activate it, your instance registers a webhook with the provider — it tells the provider "call this URL when a message arrives". The provider then makes an inbound HTTP request to that URL from the public internet.

On the vendor's hosted version, your instance has a public HTTPS URL and it knows what that URL is, so registration works and the provider can reach it.

Self-hosted, two things go wrong:

1. Your instance advertises the wrong URL. By default it builds the callback URL from its own idea of where it lives, which is often localhost, a container name, or an internal address. It registers that with the provider. The provider stores it, dutifully calls it, and reaches nothing — or refuses to accept it in the first place, which is your intermittent registration error.

The fix is the setting that tells the instance its public base URL. Nearly every self-hostable automation platform has one, usually an environment variable, and it exists precisely for this. Set it to the exact public HTTPS URL the outside world uses, restart, then deactivate and reactivate the trigger — this is the step people miss. The registration is made once at activation and does not update itself when you change the config. A stale registration points at your old wrong URL forever.

2. The provider cannot reach you. Even with the right URL advertised, the request has to arrive:

  • Public reachability. The URL must be reachable from the internet, not just from your network. Test it from outside — a phone on mobile data is the quickest honest test.
  • HTTPS with a valid certificate. Most providers require TLS and will not accept a self-signed certificate. A self-signed cert makes the browser complain; it makes the provider silently drop the registration.
  • Standard ports. Several providers only call port 443 and will reject a URL with a custom port at registration time.
  • Provider IP restrictions. If you have geo-blocking or an allowlist at your edge, the provider's servers may be blocked. This produces the pure-silence case: registration succeeds, nothing ever arrives.

How to tell the two apart in one minute. Look at the trigger node in the editor — it shows you the webhook URL it is going to register. If that URL contains localhost or an internal hostname, it is problem one and nothing else matters yet. If it is your correct public URL, it is problem two, and the next step is your reverse proxy access log: make the provider send a test message and see whether a request arrives at all. Request in the log means the problem is downstream of the proxy. No request means it never got to you, and that is DNS, firewall, TLS or the provider's own restrictions.

One more, since your description mentions it activating and then nothing arriving: most of these platforms use a different webhook URL in test mode than in production, and the test URL only listens while you have the editor open with the node listening. Activating the workflow switches to the production URL and re-registers. If you tested in the editor and it worked, then activated and it stopped, that is this.

30 · in/agents-and-mcp ·

My API client desktop app will not open at all — no window, no error, just nothing. How do I find out why?

If it turns out to be the GPU path, check whether you had a monitor connected yesterday that is not connected now, or vice versa.

A surprising number of these startup crashes are the app trying to restore its window geometry onto a display that no longer exists. The window is created — off-screen, on a monitor that is not there — and then the process tidies itself up.

Deleting just the window-state file in the app data directory fixes that specific case without touching anything else.

14 · in/fullstack ·

Social login with one provider suddenly fails while the others still work — where do I even start?

To split the failure in half quickly: check whether you ever reach your callback at all.

Add a log line at the very top of your callback handler, before any parsing or validation. Then reproduce.

  • No log line — the failure is before the redirect back. Authorisation was refused at the provider: bad client id, unregistered redirect URI, app suspended, user denied consent.
  • Log line with an error parameter — the provider is telling you why, in that parameter. Read it.
  • Log line with a code, then failure — you got authorisation and the token exchange failed. That is a secret, a scope or a network problem, and the provider's response body has the detail.

Those are three completely different investigations and this narrows to one of them in five minutes. Worth having permanently, not just today.

26 · in/sessions-vs-jwt ·