Stores the customer's name, a new daily target, the time zone their days are counted in, and/or onboarding progress. The only way anything about the profile or onboarding state changes. Marked destructive because a new name or time zone replaces the previous one; targets are never overwritten, a new one starts from the day given. Profile fields are optional; only what is passed changes. A target is never overwritten: passing one adds a new target valid from today in the account's time zone when target.valid_from is omitted, otherwise from the day given (the customer's word, or YYYY-MM-DD only when they said the full date), and earlier days keep the target they had. At least one of kcal, protein_g, carb_g, fat_g is required in a target; each is an integer, grams for macros. Set only what the customer actually chose: never fill in a nutrient they did not mention and never calculate a target for them. onboarding_status is in_progress while setup continues, skipped when the customer chooses later, and completed only after first name, last name and a target exist. timezone is an IANA name such as Europe/Paris or Africa/Johannesburg, derived from the city the customer names; pass it when get_connected_account reports no time zone or when they say they moved. idempotency_key is generated once for this profile change and reused only if that exact call must be retried. Returns the profile and the target now in force. Example: update_profile { "first_name": "Seb", "target": { "valid_from": "2026-09-03", "kcal": 2000, "protein_g": 150 }, "idempotency_key": "profile-a3f9c1" } → relay the receipt: name stored, target 2000 kcal · P 150g from 2026-09-03.
statement is the customer-facing IZeat message. It begins with "IZeat ·" so customers can distinguish information returned by IZeat from the assistant's own response. For write operations, it also states whether the requested change was recorded in their IZeat account.
Account: Sam (review@izeat.app)