How to Synchronise from Withings to Garmin

This is a problem I've been typing into search engines for a while: how to sync data from Nokia Health/Withings to Garmin? It seems simple: take data from cloud a, shove it into cloud be, to save me from typing data I see with my eye balls into Garmin.

Why is this important?

All the virtual sports goal points that Garmin produces sooner or later involve the user's mass, as Garmin is all about quantifying our ability to move this mass against gravity, air and water resistance.

Why is this a problem?

Garmin, for all their engineering brilliance, are a bunch of tools sometimes. Here's the flow:

  1. I stand on scale.
  2. Scale quantifies me.
  3. Data is written over WiFi to Withings servers.
  4. Withings app on my phone - Health Mate - then writes this data to Apple Health (or Google Fit, either way).
  5. Garmin does not read from Apple Health, or Google Fit, despite being configured to do so.

Obviously this data going automatically to Garmin would be bad.  I imagine they block this for the following reasons:

  1. They want me to replace my scale with a Garmin scale. My scale works fine, and Garmin's scale hasn't got a new, magical way of giving me even better virtual sports points.
  2. Me having to open the app is good for Garmin: I'm opening the app at least once a day, at the same time a day to enter this data, which builds a habit around Garmin.

Another question that presents itself is why hasn't Withings created an automatic outbound connection? I can't think of a business case, and imagine that it's due to internal chaos. Still, it's a shame.

The Solution (2021)

Update 2021-07-23

I no longer use the solution described below, and pay $15/year for https://smartscalesync.com/. I switched due to the sync regularly not working, and me spending more time troubleshooting it than I would typing in the data manually.

Old Solution

Someone else's Python magic:

jaroslawhartman/withings-sync
Synchronisation of Withings weight. Contribute to jaroslawhartman/withings-sync development by creating an account on GitHub.

And I do mean magic. The kind of open source thing that works, makes a problem go away, all because someone with better Python that me was also annoyed.

I'm not in love with entering my Garmin password in plain text, but at the same time, this runs on my laptop, and I'm comfortable with the risk.

Here's to never manually entering my mass in Garmin again.

Addendum: implementation quirk

Garmin added some rules to their Cloudflare firewall that broke the script. The nice person who maintains it added in cloudscraper functionality to fix the problem. It mostly works: I 'fixed' it by wrapping the sync command in a while loop, which executes from a cron job.