Answer
Check whether the workflow uses the exact standard naming convention expected for the currency-rate-update integration — the scheduled task path for currency updates expects to find and invoke a specifically-named standard workflow, so a custom workflow built from scratch with a non-standard name can work fine when invoked directly (by button/projection action) but silently fail to be picked up by the scheduled mechanism, which is looking for that specific expected workflow rather than just any workflow wired to the same projection actions.