After migrating a workflow from n8n Cloud to a self-hosted instance in Docker (same n8n_data volume), a workflow with a Shopify Trigger node (topic orders/paid) appears as active both in the UI and in the database (workflow_entity.active = 1, triggerCount = 2), and has its corresponding row in webhook_entity with the expected path. However, incoming POST requests to that path are rejected:
Received request for unknown webhook: The requested webhook "POST 257536d8-dabd-4c1a-bc22-f97d64aa082b/webhook" is not registered.
Information on your n8n setup
n8n version: 2.39.6
Database (default: SQLite): SQLite
n8n EXECUTIONS_PROCESS setting (default: own, main): main (without QUEUE_*/EXECUTIONS_MODE configured, single process)
Running n8n via (Docker, npm, n8n cloud, desktop app): Docker (docker run, without docker-compose)
Operating system: Ubuntu (behind Apache as reverse proxy with TLS)
Yes, but let n8n recreate both records instead of manually editing webhook_entity. Unpublish the workflow, configure N8N_WEBHOOK_URL with the public HTTPS URL and N8N_PROXY_HOPS=1, restart the container, and republish it. As of n8n version 2.35, WEBHOOK_URL is deprecated.
Upon publishing, n8n should recreate the local route and the subscription in Shopify. Delete any old subscriptions that still point to n8n Cloud. If activation fails, check the container logs at that moment, as the reason for the failure will appear there.
Thanks everyone for your responses, I finally managed to fix it. It turns out that even though the credentials appeared to be connected and correct, they weren’t. I’m not sure if it was due to a restart/update, but after deleting and recreating the credentials, everything works correctly again.
Anshul’s fix addresses the route. What remains is the money part: orders paid while the webhook was down.
Shopify retries a failed delivery up to eight times over four hours, and if failures persist, it removes the subscription. That is, any orders/paid from more than a few hours before the fix won’t arrive via webhook, and if the subscription was deleted, republishing the workflow recreates it but doesn’t resend anything from the dead period.
Recovery in two steps:
Using the Admin API, fetch orders with financial_status=paid and updated_at from the moment of migration, and pass them through the same workflow path that the trigger would use (a Manual/Schedule trigger that calls the same subworkflow works).
Make that path idempotent by order id before replaying anything: if Shopify still retries a late delivery, or if you run the recovery twice, you don’t want the same order processed twice.
And a quick check in Shopify Admin > Notifications > Webhooks: if the subscription no longer appears there, the dead period started before the last failed retry, not at migration.