Automazioni: i tuoi dati, inviati a intervalli regolari
Marrow può inviare in POST un file con i tuoi dati di salute a qualsiasi URL tu scelga, con la cadenza che scegli, direttamente dal telefono. Questa pagina è il riferimento: come configurarne una, che aspetto ha ogni payload e come scrivere qualcosa che lo riceva.
Le configurazioni già pronte per n8n, Zapier, Make, Home Assistant, Google Sheets e InfluxDB sono in connessioni.
Tutte le guide di Marrow: MCP · Mirror self-hosted · Automazioni · File · Assistenza
Che cos'è un'automazione
Un lavoro salvato in Esporta, Automatico: un tipo di dati, un formato, un intervallo di date, un URL, una cadenza. Marrow crea il file dal suo archivio verificato e lo invia in POST all'URL con l'app chiusa, dopo ogni sincronizzazione e a ogni aggiornamento in background, ogni volta che la cadenza è trascorsa. Niente passa da noi: il telefono parla direttamente con il tuo endpoint.
Come configurarne una
- Scheda Esporta, Automatico: attivalo, poi Nuova automazione. Se creata dalla pagina di uno strumento (n8n, Zapier, Home Assistant e gli altri in connessioni), l'automazione porta il nome di quello strumento e accanto a ogni campo indica che cosa lo strumento vuole lì.
- Indirizzo: l'URL https a cui inviare in POST. Intestazioni: quelle che servono al tuo ricevitore (un token bearer
Authorization, unX-Gitlab-Token, qualsiasi cosa). Quando lo strumento non ne richiede, Aggiungi intestazione si trova in Altre opzioni. - Dati: Metriche di salute, Allenamenti, Registro forza, Diario alimentare, oppure Sintomi e umore, in JSON o CSV. Un'automazione porta un solo tipo, quindi ne crei una per ogni tipo che vuoi. Ognuna attiva conta come una connessione: il piano gratuito ne tiene attiva 1 alla volta, Marrow Pro fino a 10, IA e server compresi.
- Cadenza: ogni tot minuti, ore o giorni. L'intervallo di date, l'aggregazione e il timeout si trovano in Altre opzioni.
- Esegui ora invia un primo payload, così puoi controllare il ricevitore senza aspettare la pianificazione.
Intervalli di date
- Dall'ultima esecuzione (predefinito): tutto ciò che è successo dall'ultima esecuzione riuscita, meno una sovrapposizione di due giorni. HealthKit continua a completare un giorno anche dopo la sua fine, quindi la sovrapposizione reinvia i giorni appena conclusi. Tieni da parte tua l'ultimo valore per metrica e giorno e le ripetizioni sono innocue. Un ricevitore rimasto fuori uso per un po' riceve tutti i giorni persi alla prima esecuzione che va a buon fine.
- Oggi, Ultimi 7 / 30 / 90 giorni, Ultimo anno: finestre mobili fisse, reinviate per intero a ogni esecuzione. Scegli queste se preferisci un'istantanea che si autocorregge a un invio di sole differenze.
Forme dei payload
Metriche di salute (totali giornalieri, JSON)
La stessa struttura delle metriche di Health Auto Export (un elenco metrics di name, units e data con qty), quindi un ricevitore scritto per quell'app richiede solo piccole modifiche: qui le date sono semplici giorni, non timestamp, e i payload di allenamenti e forza qui sotto sono propri di Marrow. I valori sono nell'unità salvata indicata in units (kg, m, mL, degC, kcal, count). La frequenza cardiaca arriva come Avg, Min e Max di ogni giorno in bpm, e il sonno come ogni notte con le sue fasi in ore. Se vuoi le unità imperiali, converti da parte tua.
{"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"}]}
]}}
I campioni grezzi (il raggruppamento Campioni grezzi) inviano ogni campione con l'ora di inizio e di fine al posto di un totale giornaliero. Le metriche in CSV arrivano come la tabella larga descritta nella pagina dei file.
Allenamenti
{"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"}
]}}
Registro forza
Ogni serie di lavoro (il riscaldamento è escluso), più i progressi per esercizio e il volume per gruppo muscolare. I pesi sono nell'unità scelta in Impostazioni, Unità di misura. Il campo unit dice quale. Il set_type di ogni serie è work, failure o drop, e una serie porta anche rir quando hai registrato le ripetizioni in riserva. set_credits conta le serie attribuite a un gruppo muscolare, in frazioni quando un esercizio lavora più gruppi.
{"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}]
}}
Diario alimentare
{"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}}
]}
]}}
Scrivere un ricevitore
Va bene tutto ciò che accetta una POST HTTPS e risponde 2xx: un servizio webhook, una funzione serverless, uno script su un server di casa. Tre regole lo rendono robusto:
- Vince l'ultimo. Salva i valori con chiave (metrica, giorno) o con l'identità propria della voce e sovrascrivi se si ripetono. Le finestre si sovrappongono per scelta.
- Archivia prima il corpo grezzo. Poi analizzalo. Un errore del parser non deve mai costarti i dati.
- Rispondi in fretta. Marrow aspetta fino al timeout che imposti (60 s di default) e altrimenti segna l'esecuzione come fallita. Le esecuzioni fallite vengono riprovate al ciclo successivo di cadenza dall'ultima finestra riuscita.
Un ricevitore Python di dodici righe che archivia ogni invio:
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()
Mettilo dietro HTTPS (un Cloudflare Tunnel, Tailscale Funnel o qualsiasi reverse proxy) e punta l'automazione su di esso. Se quello che vuoi è una copia interrogabile e non una cartella di file, il mirror self-hosted è proprio quel ricevitore già scritto.
Da sapere
- Le automazioni girano solo quando iOS lascia girare l'app: dopo una sincronizzazione, all'aggiornamento in primo piano e durante l'aggiornamento in background. Un telefono che resta bloccato tutto il giorno invia al successivo sblocco. La finestra dall'ultima esecuzione copre il vuoto.
- Ogni esecuzione è registrata nel Registro attività dell'automazione (Altre opzioni) con il suo esito, così un URL configurato male si vede nell'app e non solo sul tuo server.
- Duplica un'automazione per riusarne le intestazioni con un altro tipo di dati.
Risoluzione dei problemi
Prova con Esegui ora. La riga sotto dice che cosa è successo, e Altre opzioni, Registro attività conserva le ultime 30 esecuzioni con la stessa riga. Attiva Notifica all'esecuzione (Altre opzioni) per ricevere una notifica a ogni esecuzione mentre controlli.
| Che cosa mostra Marrow | Che cosa fare |
|---|---|
Un riepilogo di ciò che è stato inviato, come 12 diary entries | Consegnato: il ricevitore ha risposto 2xx. Se dalla sua parte non compare niente, vedi le ultime righe qui sotto. |
Server answered 401 o 403 | Il ricevitore vuole un'intestazione, oppure quella che hai aggiunto è sbagliata. Controlla nome e valore, compreso Bearer e lo spazio dopo. |
Server answered 404 | Indirizzo sbagliato, oppure il ricevitore non è in ascolto. In n8n usa il Production URL e attiva il workflow. Controlla che non manchi un percorso in fondo. |
Server answered 405 | L'indirizzo non accetta una POST. Puntalo sull'endpoint pensato per i dati in ingresso. |
Server answered 413 | Il payload è troppo grande per il ricevitore. Scegli un intervallo di date più breve, meno metriche, oppure Totali giornalieri al posto di Campioni grezzi. |
Server answered 500 o un altro 5xx | Il ricevitore è andato in errore durante l'elaborazione. Guarda il suo registro. Archivia prima il corpo grezzo, poi analizzalo. |
| La richiesta è scaduta | Il ricevitore ha impiegato più del timeout. Rispondi prima e lavora dopo, oppure alza Timeout in Altre opzioni (fino a 300 s). |
| Il criterio App Transport Security richiede l'uso di una connessione sicura | L'indirizzo è in semplice http su internet. Usa https. iOS lascia usare a Marrow l'http semplice solo sulla tua rete. |
| Impossibile trovare un server con il nome host specificato | Un errore di battitura nell'indirizzo, oppure un nome che conosce solo la tua rete di casa. Controllalo in Safari sul telefono. |
No valid URL - set an https endpoint first | L'indirizzo è vuoto o non inizia con https:// (o http:// sulla tua rete). |
Nothing to export in this range | Nessun dato di quel tipo nell'intervallo di date. Scegli un intervallo più lungo in Altre opzioni, o registra prima qualcosa. |
- Consegnato, ma non arriva niente. Alcuni ricevitori rispondono 200 anche quando scartano i dati. Home Assistant lo fa con un id webhook sbagliato, e la ricetta di Apps Script con un
?key=sbagliato. Zapier e Make non mostrano niente finché non carichi un campione nel loro editor. Controlla la cronologia o il registro del ricevitore. - Le esecuzioni arrivano in ritardo o non arrivano. È iOS a scegliere il momento delle esecuzioni in background: dopo una sincronizzazione, quando apri Marrow e durante l'aggiornamento in background. Tieni attivo Aggiorna app in background per Marrow (Impostazioni, Generali, Aggiorna app in background). La modalità Risparmio energetico trattiene le esecuzioni in background, e un telefono che resta bloccato invia al successivo sblocco. Dall'ultima esecuzione si mette in pari alla prima esecuzione che riesce.
- Un ricevitore sulla tua rete di casa. Per raggiungerlo Marrow ha bisogno dell'accesso alla rete locale: Impostazioni, Privacy e sicurezza, Rete locale. Tocca Esegui ora una volta con Marrow aperto, così iOS può chiedertelo. In background iOS rifiuta senza chiedere finché non hai risposto.
- Chiusa dal selettore. Dopo che chiudi Marrow dal selettore di app, iOS potrebbe non riattivarla in background finché non la riapri.
- Gli stessi giorni arrivano due volte. È voluto: Dall'ultima esecuzione reinvia gli ultimi due giorni, perché Apple Health continua a completarli. Tieni l'ultimo valore per metrica e giorno.
- Non si attiva. Ogni automazione attiva conta come una connessione. Il piano gratuito ne tiene attiva 1 alla volta, Marrow Pro fino a 10: IA, server e automazioni insieme. Disattiva prima un'altra.
- Le unità sembrano sbagliate. Le metriche arrivano nelle unità salvate indicate in
units(kg, m, mL, degC, kcal). Le serie di forza seguono Impostazioni, Unità di misura, e il campounitdice quale.
Le soluzioni per ogni singolo strumento sono nella sua pagina: n8n, Zapier, Make, Home Assistant, Google Sheets, InfluxDB, qualsiasi URL.