Thanks Juraj. We had deployed the storage module in the admin app but not the live app, and that was the cause.
We also got an exception when the storage module ran in the live site, on the following line:
StorageHelper.MapStoragePath($"~/{Service.Resolve<ISiteService>().CurrentSite.SiteName}/Media/", mediaProvider);
CurentSite was null in this context, but it was fine in the admin context. We put a workaround in but it would be nice to know why that happens?