Webhooks
Webhooks let DinkyTask send daily plan and submission events to other systems. You configure one webhook endpoint for the family, and DinkyTask automatically sends supported events to that endpoint. The receiver can branch on the top-level event field.
What are they useful for?
- triggering IFTTT Webhooks applets
- connecting Node-RED, Make, Zapier, or similar automation workflows
- calling your own backend, script, or notification service
Where to configure it
- Open the Profile page as a parent.
- Go to Advanced settings.
- Enable the family webhook.
- Enter the target URL.
- Choose the HTTP method: usually POST.
- If needed, enter auth headers as JSON, for example
{"Authorization":"Bearer ..."}or{"X-API-Key":"..."}.
The family webhook uses one shared endpoint: when the webhook is enabled, every supported event is delivered to that endpoint.
Events
plan.started— the daily plan started.plan.completed— all required tasks were approved and the plan succeeded.plan.failed— the plan did not succeed, for example because a required task failed, was missed, or the plan expired without pending parent reviews.plan.expired— the plan time window expired while at least one submission was still waiting for parent review; the technical status becomesreview_expired.submission.pending_review— a submission is waiting for parent review.submission.approved— a submission was approved, either automatically or by a parent.submission.rejected— a submission was rejected.
HTTP request behavior
- The configured method can be
POST,PUT, orPATCH. - The payload is sent as JSON.
- Each webhook call has a maximum timeout of 10 seconds.
- DinkyTask logs each family webhook call, including timestamp, payload, response status, duration, and success/failure, so support can inspect delivery problems later.
- Webhook delivery requires an active trial or premium subscription. If access expires, the saved configuration remains in place, but events are not sent again until access returns.
Payload documentation
Every event uses the same base payload structure. Your automation usually checks the event field first and then reads whichever detail it needs.
Root fields
eventstring
The event name. Possible values:plan.started,plan.completed,plan.failed,plan.expired,submission.pending_review,submission.approved,submission.rejected.plan.expiredis sent for review-expired plans (review_expired); ordinary unsuccessful expiry sendsplan.failed.modelstring
Payload model version, for exampleplan_bound_v2.occurred_atstring / ISO date
When the event happened according to the server.statusstring
The technical plan status, such asactive,completed, orfailed.display_statusstring
Parent/child-facing status. For example,partialmeans the plan technically failed, but at least one required task was completed.scorenumber or null
For plan events, the plan score. For submission events, the affected submission score.automation_keystring or null
Optional automation key from the plan. This can be used for routing in Home Assistant, Node-RED, or custom scripts.child_namestring or null
Convenience child name at the payload root.plan_titlestring
Convenience plan title at the payload root.familyobject
Family data. Currently includes at leastid.childobject
Child data:idandname.planobject
Plan data:id,title,name,automation_key,date,status,start_at,end_at,ordered,score_pct.summaryobject
Aggregated result data: required task counts, earned stars/diamonds, score, and task counts.tasksarray
All tasks in the plan with status, order, and reward information.completed_tasksarray
Approved tasks.failed_tasksarray
Failed required tasks.taskobject
For submission events, the affected task.submissionobject
For submission events, attempt/submission details:id,attempt_type,status,score_pct,submitted_at, andreviewed_at.
summary fields
required_completednumber
How many required tasks were completed.required_totalnumber
How many required tasks were in the plan.stars_earnednumber
How many ⭐ stars the child earned from approved required tasks.diamonds_earnednumber
How many 💎 diamonds the child earned from approved bonus tasks.score_pctnumber or null
The calculated plan score percentage when available.completed_countnumber
Total number of approved tasks.failed_required_countnumber
Number of required tasks in the payload that are not approved.
tasks[] fields
idstring
Task identifier.titlestring
Task title.typestring
Task type, such asquiz,matching,study,photo_proof,video, orhabit.positionnumber
Task position inside the plan.requiredboolean
True for required tasks.bonusboolean
True for bonus/optional tasks.statusstring or null
Latest submission status, such asapproved,rejected,pending_review, ornullif there is no submission yet.attempt_countnumber
How many attempts belong to the task.latest_attempt_statusstring or null
Latest attempt status, if available.latest_attempt_nonumber or null
Latest attempt number, if available.scorenumber or null
Latest evaluation score when available.reward_currencystringstarfor required tasks,diamondfor bonus tasks.reward_pointsnumber
Exact reward value for the task.
Full example payload
{
"event": "plan.failed",
"model": "plan_bound_v2",
"occurred_at": "2026-04-30T18:30:00",
"status": "failed",
"display_status": "partial",
"score": 37.5,
"automation_key": "homework_done",
"child_name": "Misi",
"plan_title": "Misi plan 2026-04-30",
"family": {
"id": "80a4cdcd-cd23-431e-81de-ff474f915238"
},
"child": {
"id": "child-user-id",
"name": "Misi"
},
"plan": {
"id": "plan-id",
"title": "Misi plan 2026-04-30",
"name": "Misi plan 2026-04-30",
"automation_key": "homework_done",
"date": "2026-04-30",
"status": "failed",
"start_at": "2026-04-30T17:00:00",
"end_at": "2026-04-30T18:30:00",
"ordered": true,
"score_pct": 37.5
},
"summary": {
"required_completed": 1,
"required_total": 2,
"stars_earned": 3,
"diamonds_earned": 2,
"score_pct": 37.5,
"completed_count": 2,
"failed_required_count": 1
},
"tasks": [
{
"id": "task-id-1",
"title": "Clean up",
"type": "photo_proof",
"position": 0,
"required": true,
"bonus": false,
"status": "approved",
"attempt_count": 1,
"latest_attempt_status": "approved",
"latest_attempt_no": 1,
"score": 100,
"reward_currency": "star",
"reward_points": 3
},
{
"id": "task-id-2",
"title": "Math quiz",
"type": "quiz",
"position": 1,
"required": true,
"bonus": false,
"status": "rejected",
"attempt_count": 1,
"latest_attempt_status": "rejected",
"latest_attempt_no": 1,
"score": 40,
"reward_currency": "star",
"reward_points": 5
},
{
"id": "task-id-3",
"title": "Extra drawing",
"type": "photo_proof",
"position": 2,
"required": false,
"bonus": true,
"status": "approved",
"attempt_count": 1,
"latest_attempt_status": "approved",
"latest_attempt_no": 1,
"score": 100,
"reward_currency": "diamond",
"reward_points": 2
}
],
"completed_tasks": [
{
"id": "task-id-1",
"title": "Clean up",
"type": "photo_proof",
"position": 0,
"required": true,
"bonus": false,
"status": "approved",
"attempt_count": 1,
"latest_attempt_status": "approved",
"latest_attempt_no": 1,
"score": 100,
"reward_currency": "star",
"reward_points": 3
},
{
"id": "task-id-3",
"title": "Extra drawing",
"type": "photo_proof",
"position": 2,
"required": false,
"bonus": true,
"status": "approved",
"attempt_count": 1,
"latest_attempt_status": "approved",
"latest_attempt_no": 1,
"score": 100,
"reward_currency": "diamond",
"reward_points": 2
}
],
"failed_tasks": [
{
"id": "task-id-2",
"title": "Math quiz",
"type": "quiz",
"position": 1,
"required": true,
"bonus": false,
"status": "rejected",
"attempt_count": 1,
"latest_attempt_status": "rejected",
"latest_attempt_no": 1,
"score": 40,
"reward_currency": "star",
"reward_points": 5
}
]
} Security tip
Only send webhook calls to systems you control or trust. If the receiving service supports secret tokens, unique paths, or API keys, use them.