Automationen: deine Daten, nach Zeitplan gesendet
Marrow kann eine Datei mit deinen Gesundheitsdaten per POST an eine beliebige URL senden, in dem Takt, den du wählst, direkt vom Handy aus. Diese Seite ist die Referenz: wie du eine einrichtest, wie jede Payload aussieht und wie du etwas schreibst, das sie empfängt.
Fertige Einrichtungen für n8n, Zapier, Make, Home Assistant, Google Sheets und InfluxDB findest du unter Verbindungen.
Alle Marrow-Anleitungen: MCP · Selbst gehosteter Spiegel · Automationen · Dateien · Support
Was eine Automation ist
Ein gespeicherter Auftrag unter Exportieren, Automatisiert: eine Art von Daten, ein Format, ein Zeitraum, eine URL, ein Takt. Marrow baut die Datei aus seinem geprüften Speicher und sendet sie bei geschlossener App per POST an die URL, nach jeder Synchronisierung und bei jeder Hintergrundaktualisierung, sobald der Takt abgelaufen ist. Nichts läuft über uns: Das Handy spricht direkt mit deinem Endpunkt.
Eine einrichten
- Tab „Exportieren“, Automatisiert: Schalte es ein und tippe dann auf Neue Automation. Wenn du sie von der Seite eines Tools aus anlegst (n8n, Zapier, Home Assistant und die übrigen unter Verbindungen), trägt die Automation den Namen dieses Tools und sagt bei jedem Feld, was das Tool dort erwartet.
- Adresse: die https-URL, an die gesendet werden soll. Header: alle, die dein Empfänger braucht (ein
Authorization-Bearer-Token, einX-Gitlab-Token, was auch immer). Braucht das Tool keine, findest du „Header hinzufügen“ unter „Weitere Optionen“. - Daten: Gesundheitsmetriken, Trainings, Kraft-Protokoll, Ernährungstagebuch oder Symptome und Stimmung, als JSON oder CSV. Eine Automation trägt eine Art, also lege pro gewünschter Art eine an. Jede, die eingeschaltet ist, zählt als Verbindung: Kostenlos erlaubt 1 Verbindung gleichzeitig, Marrow Pro bis zu 10, KIs und Server eingeschlossen.
- Takt: alle so und so viele Minuten, Stunden oder Tage. Zeitraum, Aggregation und Timeout findest du unter Weitere Optionen.
- Jetzt ausführen sendet eine erste Payload, damit du den Empfänger prüfen kannst, bevor der Zeitplan greift.
Zeiträume
- Seit dem letzten Lauf (Standard): alles seit dem letzten erfolgreichen Lauf, abzüglich einer Überlappung von zwei Tagen. HealthKit füllt einen Tag auch nach seinem Ende weiter auf, deshalb sendet die Überlappung kürzlich abgeschlossene Tage erneut. Behalte auf deiner Seite den neuesten Wert pro Metrik und Tag, dann sind die Wiederholungen harmlos. Ein Empfänger, der eine Weile ausgefallen war, bekommt beim ersten erfolgreichen Lauf jeden verpassten Tag.
- Heute, Letzte 7 / 30 / 90 Tage, Letztes Jahr: feste gleitende Zeiträume, bei jedem Lauf vollständig neu gesendet. Wähle sie, wenn dir ein selbstheilender Schnappschuss lieber ist als ein Delta.
Aufbau der Payloads
Gesundheitsmetriken (Tagessummen, JSON)
Dieselbe Struktur wie die Metriken von Health Auto Export (eine metrics-Liste mit name, units und data mit qty), ein für diese App geschriebener Empfänger braucht also nur kleine Änderungen: Die Datumsangaben sind hier reine Tage, keine Zeitstempel, und die Payloads für Trainings und Kraft weiter unten sind Marrows eigene. Die Werte stehen in der gespeicherten Einheit aus units (kg, m, mL, degC, kcal, count). Die Herzfrequenz kommt als Avg, Min und Max jedes Tages in bpm, der Schlaf als jede Nacht mit ihren Phasen in Stunden. Rechne auf deiner Seite um, wenn du imperiale Einheiten willst.
{"data": {"metrics": [
{"name": "body_mass", "units": "kg",
"data": [{"date": "2026-09-11", "qty": 81.3}]},
{"name": "step_count", "units": "count",
"data": [{"date": "2026-09-11", "qty": 8746}]},
{"name": "heart_rate", "units": "bpm",
"data": [{"date": "2026-09-11", "Avg": 71, "Min": 52, "Max": 148}]},
{"name": "sleep_analysis", "units": "h",
"data": [{"date": "2026-09-11", "totalSleep": 7.2, "asleep": 7.2, "deep": 1.1, "rem": 1.6, "core": 4.3, "awake": 0.2,
"sleepStart": "2026-09-10 23:36:00 -0400", "sleepEnd": "2026-09-11 07:02:00 -0400"}]}
]}}
Rohdaten (die Gruppierung Rohdaten) senden jeden Messwert mit Start- und Endzeit statt einer Tagessumme. CSV-Metriken kommen als die breite Tabelle, die auf der Seite zu den Dateien beschrieben ist.
Trainings
{"data": {"workouts": [
{"activity": "Running", "start": "2026-09-11T18:43:41Z", "end": "2026-09-11T19:13:53Z",
"duration_min": 30.2, "kcal": 512, "distance_mi": 3.06, "avg_hr": 174, "source": "Apple Watch"}
]}}
Kraft-Protokoll
Jeder Arbeitssatz (Aufwärmsätze bleiben draußen), dazu der Fortschritt pro Übung und das Volumen pro Muskelgruppe. Die Gewichte sind in der Einheit angegeben, die du unter Einstellungen, Einheiten gewählt hast. Das Feld unit sagt, welche. Der set_type jedes Satzes ist work, failure oder drop, und ein Satz enthält auch rir, wenn du Wiederholungen in Reserve eingetragen hast. set_credits zählt die Sätze, die einer Muskelgruppe gutgeschrieben werden, in Bruchteilen, wenn eine Übung mehrere Gruppen trainiert.
{"data": {"unit": "lb",
"sets": [{"time": "2026-09-11T17:02:00Z", "session": "Push day", "exercise": "Bench Press",
"set": 1, "weight": 185, "reps": 8, "est_1rm": 229.6, "set_type": "work"}],
"exercises": [{"exercise": "Bench Press", "best_est_1rm": 229.6,
"sessions": [{"date": "2026-09-11T17:02:00Z", "sets": 3, "top_weight": 185, "top_reps": 8, "est_1rm": 229.6, "volume": 3885}]}],
"muscle_groups": [{"group": "Chest", "volume": 3108.0, "set_credits": 2.4}]
}}
Ernährungstagebuch
{"data": {"days": [
{"day": "2026-09-11", "entries": [
{"meal": "breakfast", "name": "Oatmeal", "grams": 250, "kcal": 300,
"protein_g": 10, "carbs_g": 54, "fat_g": 5, "logged_at": "2026-09-11T12:10:00Z",
"nutrients": {"dietary_fiber": 8.0, "dietary_sugar": 1.2}}
]}
]}}
Einen Empfänger schreiben
Alles, was einen HTTPS-POST akzeptiert und mit 2xx antwortet, funktioniert: ein Webhook-Dienst, eine Serverless-Funktion, ein Skript auf einem Heimserver. Drei Regeln halten ihn robust:
- Der neueste Wert gewinnt. Speichere Werte mit (Metrik, Tag) oder der eigenen Identität des Eintrags als Schlüssel und überschreibe sie bei Wiederholung. Die Zeiträume überlappen sich absichtlich.
- Archiviere zuerst den rohen Body. Dann parse ihn. Ein Fehler im Parser sollte dich nie die Daten kosten.
- Antworte schnell. Marrow wartet bis zum eingestellten Timeout (standardmäßig 60 s) und markiert den Lauf sonst als fehlgeschlagen. Fehlgeschlagene Läufe werden beim nächsten Takt ab dem letzten erfolgreichen Zeitraum wiederholt.
Ein Python-Empfänger mit zwölf Zeilen, der jeden Post archiviert:
from http.server import BaseHTTPRequestHandler, HTTPServer
import time
class H(BaseHTTPRequestHandler):
def do_POST(self):
body = self.rfile.read(int(self.headers.get("Content-Length", 0)))
with open(f"marrow-{int(time.time())}.json", "wb") as f:
f.write(body)
self.send_response(200)
self.end_headers()
HTTPServer(("0.0.0.0", 8798), H).serve_forever()
Stelle ihn hinter HTTPS (einen Cloudflare Tunnel, Tailscale Funnel oder einen beliebigen Reverse-Proxy) und richte die Automation darauf aus. Wenn du eine abfragbare Kopie statt eines Ordners voller Dateien willst: Der selbst gehostete Spiegel ist dieser Empfänger, schon fertig geschrieben.
Gut zu wissen
- Automationen laufen nur, wenn iOS der App das Laufen erlaubt: nach einer Synchronisierung, beim Aktualisieren im Vordergrund und bei der Hintergrundaktualisierung. Ein Handy, das den ganzen Tag gesperrt bleibt, sendet beim nächsten Entsperren. Der Zeitraum „Seit dem letzten Lauf“ deckt die Lücke ab.
- Jeder Lauf wird im Aktivitätsprotokoll der Automation (Weitere Optionen) mit seinem Ergebnis festgehalten, sodass eine falsch eingestellte URL in der App sichtbar ist und nicht nur auf deinem Server.
- Dupliziere eine Automation, um ihre Header für eine andere Art wiederzuverwenden.
Fehlerbehebung
Teste mit Jetzt ausführen. Die Zeile darunter sagt, was passiert ist, und unter Weitere Optionen, Aktivitätsprotokoll stehen die letzten 30 Läufe mit derselben Zeile. Schalte Beim Ausführen benachrichtigen (Weitere Optionen) ein, um bei jedem Lauf eine Benachrichtigung zu bekommen, während du prüfst.
| Was Marrow anzeigt | Was du tun kannst |
|---|---|
Eine Zusammenfassung dessen, was gesendet wurde, etwa 12 diary entries | Zugestellt: Der Empfänger hat mit 2xx geantwortet. Wenn bei ihm nichts auftaucht, siehe die letzten Zeilen unten. |
Server answered 401 oder 403 | Der Empfänger verlangt einen Header, oder der von dir hinzugefügte ist falsch. Prüfe Namen und Wert, einschließlich Bearer und des Leerzeichens danach. |
Server answered 404 | Falsche Adresse, oder der Empfänger hört nicht zu. Nutze in n8n die Production URL und aktiviere den Workflow. Prüfe, ob am Ende ein Pfad fehlt. |
Server answered 405 | Die Adresse nimmt keinen POST an. Richte sie auf den Endpunkt aus, der für eingehende Daten gedacht ist. |
Server answered 413 | Die Payload ist zu groß für den Empfänger. Wähle einen kürzeren Zeitraum, weniger Metriken oder Tagessummen statt Rohdaten. |
Server answered 500 oder ein anderer 5xx | Der Empfänger ist bei der Verarbeitung gescheitert. Sieh in sein eigenes Log. Archiviere zuerst den rohen Body, dann parse ihn. |
| Zeitüberschreitung bei der Anforderung | Der Empfänger hat länger gebraucht als das Timeout. Antworte zuerst und arbeite danach, oder erhöhe Timeout unter Weitere Optionen (bis 300 s). |
| Die App Transport Security-Richtlinie erfordert die Verwendung einer sicheren Verbindung | Die Adresse ist reines http im Internet. Nutze https. iOS erlaubt Marrow reines http nur in deinem eigenen Netzwerk. |
| Es konnte kein Server mit dem angegebenen Hostnamen gefunden werden | Ein Tippfehler in der Adresse, oder ein Name, den nur dein Heimnetz kennt. Prüfe sie in Safari auf dem Handy. |
No valid URL - set an https endpoint first | Die Adresse ist leer oder beginnt nicht mit https:// (oder http:// in deinem eigenen Netzwerk). |
Nothing to export in this range | Keine Daten dieser Art im Zeitraum. Wähle unter Weitere Optionen einen längeren Zeitraum oder trage zuerst etwas ein. |
- Zugestellt, aber nichts kommt an. Manche Empfänger antworten mit 200, auch wenn sie die Daten verwerfen. Home Assistant tut das bei einer falschen Webhook-ID, und das Apps-Script-Rezept bei einem falschen
?key=. Zapier und Make zeigen nichts an, bis du in ihrem Editor ein Beispiel lädst. Sieh im Verlauf oder Log des Empfängers nach. - Läufe kommen spät oder gar nicht. iOS bestimmt den Zeitpunkt für Läufe im Hintergrund: nach einer Synchronisierung, wenn du Marrow öffnest, und bei der Hintergrundaktualisierung. Lass die Hintergrundaktualisierung für Marrow eingeschaltet (Einstellungen, Allgemein, Hintergrundaktualisierung). Der Stromsparmodus hält Läufe im Hintergrund zurück, und ein Handy, das gesperrt bleibt, sendet beim nächsten Entsperren. „Seit dem letzten Lauf“ holt beim nächsten erfolgreichen Lauf alles nach.
- Ein Empfänger in deinem Heimnetz. Marrow braucht dafür Zugriff auf das lokale Netzwerk: Einstellungen, Datenschutz & Sicherheit, Lokales Netzwerk. Tippe einmal bei geöffnetem Marrow auf „Jetzt ausführen“, damit iOS fragen kann. Im Hintergrund lehnt iOS ohne Nachfrage ab, bis du geantwortet hast.
- Weggewischt. Wenn du Marrow im App-Umschalter wegwischst, weckt iOS die App im Hintergrund möglicherweise erst wieder, wenn du sie erneut öffnest.
- Dieselben Tage kommen doppelt an. Absicht: „Seit dem letzten Lauf“ sendet die letzten zwei Tage erneut, weil Apple Health sie weiter auffüllt. Behalte den neuesten Wert pro Metrik und Tag.
- Sie lässt sich nicht einschalten. Jede eingeschaltete Automation zählt als Verbindung. Kostenlos erlaubt 1 Verbindung gleichzeitig, Marrow Pro bis zu 10: KIs, Server und Automationen zusammen. Schalte zuerst eine andere aus.
- Die Einheiten sehen falsch aus. Metriken kommen in den gespeicherten Einheiten aus
units(kg, m, mL, degC, kcal). Kraftsätze folgen Einstellungen, Einheiten, und das Feldunitsagt, welche.
Lösungen für jedes Tool einzeln stehen auf seiner Seite: n8n, Zapier, Make, Home Assistant, Google Sheets, InfluxDB, beliebige URL.