What's a webhook?
A webhook is just a web address (a URL) that's set up to receive data instead of show a page. When you give Liftaroo that URL, the app automatically sends a copy of your latest data to it, on a schedule you pick, formatted as JSON (a simple, structured text format that almost any tool understands).
You don't write any code to use a webhook. You just need something on the other end that's ready to catch the data. The options below take a few minutes and most are free.
The easiest ways to get a webhook URL
Zapier
Create a Zap with a "Webhooks by Zapier" trigger. It hands you a URL. Paste it into Liftaroo, then send the data on to Google Sheets, Notion, Airtable, or email. 6,000+ apps.
Make.com
Add a "Custom webhook" module, copy the URL it generates, paste it into Liftaroo. Then route the data wherever you want. Generous free plan.
Pipedream / n8n
Both give you a webhook trigger and let you transform the data with a little code if you want. n8n can even be self-hosted so the data never leaves your own server.
Google Apps Script
A free script attached to a Google Sheet can act as a webhook and write each sync into rows. Best option if you just want everything landing in a spreadsheet. (The AI prompt below can write this for you.)
How to connect it in Liftaroo
- Open Liftaroo and go to Settings → Data → Auto Export.
- Tap Add Destination.
- Paste your Webhook URL (it must start with
https://). - If your service gave you a secret or token, paste it into Auth token. It's stored only on your phone, never on Liftaroo's servers. Leave it blank if you don't have one.
- Pick what to send (weigh-ins, daily metrics, workouts) and how often, then tap Test connection. Green means it's working.
What the data looks like
When you tap Test connection, your endpoint receives a tiny ping so you can confirm it's reachable:
{ "test": true, "ts": "2026-06-03T14:00:00.000Z" }
A real sync sends a JSON body like this (any list can be empty depending on what you enabled and what data you have):
{
"schema": "liftaroo-auto-export-v1",
"sender": { "app": "Liftaroo", "version": "3.0.0", "userId": "your-id" },
"synced_at": "2026-06-03T04:00:00.000Z",
"since": "2026-05-04T04:00:00.000Z",
"data": {
"weighIns": [
{ "measured_at": "2026-06-02T07:10:00Z", "weight_lb": 184.2,
"fat_pct": null, "muscle_lb": null, "water_pct": null,
"bone_lb": null, "bmi": null, "source": "Apple Health",
"external_id": "weight_2026-06-02" }
],
"daily": [
{ "date": "2026-06-02", "steps": 8421, "resting_hr_bpm": 58,
"hrv_ms": 62, "vo2_max": 47.3, "sleep_hours": 7.4,
"sleep_stages": { "deep_min": 73, "rem_min": 95, "awake_min": 18 } }
],
"workouts": [
{ "started_at": "2026-06-02T17:30:00Z", "ended_at": "2026-06-02T18:22:00Z",
"type": "Strength Training", "duration_min": 52, "distance_mi": null,
"calories_kcal": 312, "avg_hr_bpm": null, "max_hr_bpm": null,
"external_id": "abc123" }
]
}
}
Three things worth knowing: the app only sends new data since the last successful sync (the first sync backfills about 90 days), it never includes today (only complete days), and it doesn't resend rows, so use external_id (weigh-ins/workouts) and date (daily) as the unique key on your end.
Copy-paste AI prompt
Want a custom receiver and don't want to figure it out yourself? Paste the prompt below into Claude, ChatGPT, or any AI assistant. It contains everything the AI needs to build you a working webhook. Just tell it where you want the data to land (a Google Sheet, Notion, a database, etc.).
I use a fitness app called Liftaroo that can export my workout and health data to a webhook. I want you to build the receiving endpoint for me. WHERE I WANT THE DATA TO GO: [Describe it here, e.g. "a Google Sheet with one tab per data type", "a Notion database", "a Postgres table", "just log it so I can see it". If you're not sure, recommend the simplest free option and build that.] REQUIREMENTS FOR THE ENDPOINT: - It accepts an HTTP POST request over HTTPS with a JSON body. - It must return HTTP status 200 on success. (Liftaroo treats any 4xx as "misconfigured" and shows me an error; it retries on 5xx.) - It should optionally check an "Authorization: Bearer" header. Let me set the expected token in config. If I don't set one, skip the check. - Handle a connection-test ping, which looks exactly like this: { "test": true, "ts": "2026-06-03T14:00:00.000Z" } Just return 200 for that; don't try to store it. THE REAL DATA PAYLOAD (schema string is "liftaroo-auto-export-v1"): { "schema": "liftaroo-auto-export-v1", "sender": { "app": "Liftaroo", "version": "3.0.0", "userId": "string" }, "synced_at": "ISO-8601 timestamp", "since": "ISO-8601 timestamp", "data": { "weighIns": [ { "measured_at": "ISO-8601", "weight_lb": number|null, "fat_pct": number|null, "muscle_lb": number|null, "water_pct": number|null, "bone_lb": number|null, "bmi": number|null, "source": "string", "external_id": "string" } ], "daily": [ { "date": "YYYY-MM-DD", "steps": number|null, "resting_hr_bpm": number|null, "hrv_ms": number|null, "vo2_max": number|null, "sleep_hours": number|null, "sleep_stages": { "deep_min": number, "rem_min": number, "awake_min": number } | null } ], "workouts": [ { "started_at": "ISO-8601", "ended_at": "ISO-8601", "type": "string", "duration_min": number, "distance_mi": number|null, "calories_kcal": number|null, "avg_hr_bpm": number|null, "max_hr_bpm": number|null, "external_id": "string" } ] } } IMPORTANT BEHAVIOR: - Any of the three arrays (weighIns, daily, workouts) can be empty. - Many fields can be null; store them as empty, don't crash. - Liftaroo only sends NEW data since the last successful sync, and never resends rows. De-duplicate using external_id for weighIns and workouts, and using date for daily rows (one row per calendar day). Please write the complete code, tell me exactly how to deploy it, and give me the final webhook URL format I should paste into Liftaroo. Keep it as simple as possible and explain each step like I'm not a developer.
If a sync fails
401 / "unauthorized"
Your endpoint requires a token and the Auth token field in Liftaroo is empty or wrong. Paste the token in, tap Save, re-open the destination to confirm it stuck, then Test connection. Watch for a stray space if you pasted it on your phone.
Test connection works but Sync now fails
Your receiver returns 200 for the little test ping but errors on the real payload. Open the destination's Recent attempts log in the app to see the actual status, and make sure your code handles empty arrays and null fields.
Sync is green but nothing shows up
Either every metric is toggled off for that destination, or the health data never reached the app: on iOS check Settings → Privacy & Security → Health → Liftaroo, on Android check that Health Connect is installed and permissions are granted. Also remember the first sync only goes back ~90 days and never includes today.