diff --git a/.circleci/config.yml b/.circleci/config.yml
index b680f3d1c0346945709c9064ac940531fa6779b4..8c393e1ad5d65dac119855647901edd1aab24377 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -125,6 +125,16 @@ jobs:
             # where the coverage data ends up.
             nix-build --argstr hypothesisProfile ci --arg collectCoverage true --attr doc
 
+      - run:
+          name: "Cache codecov"
+          command: |
+            # Build codecov and any dependencies here, before we save the
+            # cache, so that they make it in to the cache too.  Turns out
+            # there is a python-cryptography dependency here that is expensive
+            # to build that doesn't get built earlier.  This saves us a couple
+            # minutes.
+            nix-build --expr '(import <nixpkgs> { }).python.withPackages (ps: [ ps.codecov ])'
+
       - save_cache:
           name: "Cache Nix Store Paths"
           key: zkapauthorizer-nix-store-v1-{{ checksum "nixpkgs.rev" }}