n8n's generic OAuth2 only refreshes a token reactively when an API returns HTTP 401, but services like Adobe Marketo return HTTP 200 with the error inside the response body, so the token silently goes stale and the integration breaks. Multiple builders independently want refresh driven by the token's own expires_in value inside the credential boundary, rather than trusting status codes.
The non-obvious bug is that 'token expired' is not the same as 'HTTP 401' for a meaningful set of enterprise APIs; refresh proactively off the token's expires_in (with a safety margin) instead of trusting the status code, and you fix a whole class of silent integration failures that status-code-based refresh can never catch.
landscape (2 existing solutions)
Automation tools assume an expired token surfaces as HTTP 401, but real-world APIs (Marketo and friends) return 200 with an error in the body, so refresh-on-401 fails silently. The unmet need is proactive refresh based on expires_in inside the credential, and n8n's maintainers closed the escalation as working-as-expected, leaving the demand open.