Menu

Webhooks

Events

The events a webhook can subscribe to, with the full envelope your server receives. In “IDs only” mode (thin), data carries only the ids.

CRM

crm.lead.created

A new lead entered the CRM

Fires once per new lead, whatever the entry path: a lead source (webhook, form, Meta ads, booking), a first WhatsApp message, the API or a prospect created by hand. Carries the person and the prospect or deal the lead became, plus the source. It also fires for a person already in the CRM when the lead creates a new prospect or deal for them. It does not fire when nothing new is created: the same lead again, a source that discards duplicates, or a lead that goes to the prospect or deal the person already had. A social media message or comment from a profile already linked to a person does not fire it yet; a deal created by hand fires crm.deal.created instead. Leads that come from Google Ads, TikTok or LinkedIn (their forms, and TikTok messages) do not fire it: those platforms' terms do not allow sending their data to a webhook.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "crm.lead.created",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "person": {
      "id": "pe_4hT1",
      "first_name": "Mariana",
      "last_name": "López",
      "full_name": "Mariana López",
      "email": "mariana@clinicanorte.com",
      "emails": [
        "mariana@clinicanorte.com"
      ],
      "phone": "+5491155550123",
      "phones": [
        "+5491155550123"
      ],
      "job_title": "Directora de Marketing",
      "company_ids": [
        "co_2mN8"
      ],
      "primary_company_id": "co_2mN8",
      "company_name": "Clínica Norte",
      "owner_id": "u_7KpQ2",
      "label_ids": [],
      "custom_fields": {},
      "do_not_contact": false,
      "created_at": 1761996400000,
      "updated_at": 1762000000000
    },
    "prospect": {
      "id": "pr_9sD2",
      "title": "Mariana López — Clínica Norte",
      "status": "new",
      "person_id": "pe_4hT1",
      "company_id": "co_2mN8",
      "owner_id": "u_7KpQ2",
      "label_ids": [],
      "custom_fields": {},
      "created_at": 1762000000000,
      "updated_at": 1762000000000
    },
    "source": {
      "id": "ls_web_form",
      "name": "Formulario del sitio",
      "type": "generic"
    },
    "origin": "source",
    "actor": {
      "uid": "system:lead-ingestion",
      "name": "Formulario del sitio",
      "kind": "system"
    }
  }
}
crm.deal.created

A deal was created

Fires when a deal is created by hand, by the API, by converting a prospect (from the screen, the API or the AI setter) or by a lead source that sends leads straight to a pipeline. Carries the deal with its pipeline and stage names.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "crm.deal.created",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "deal": {
      "id": "dl_8f3kQ2mZpV0bT7xL1aR9",
      "title": "Rediseño del sitio — Clínica Norte",
      "value": 4800,
      "currency": "USD",
      "pipeline_id": "pp_default",
      "stage_id": "qualified",
      "status": "open",
      "owner_id": "u_7KpQ2",
      "owner_name": "Valentina Ríos",
      "company_id": "co_2mN8",
      "company_name": "Clínica Norte",
      "person_ids": [
        "pe_4hT1"
      ],
      "primary_person_id": "pe_4hT1",
      "primary_person_name": "Mariana López",
      "label_ids": [],
      "custom_fields": {
        "origen_campana": "google-ads-marzo"
      },
      "is_archived": false,
      "created_at": 1761913600000,
      "updated_at": 1762000000000
    },
    "pipeline": {
      "id": "pp_default",
      "name": "Ventas"
    },
    "stage": {
      "id": "qualified",
      "name": "Calificado"
    },
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
crm.deal.stage_changed

A deal moved to another stage or pipeline

Fires on every stage or pipeline move that goes through the deal core: the screen (one by one or in bulk), the API, a sequence step, winning or reopening a deal. previous has the stage and pipeline the deal came from, with their names. Moves written by a merge or by deleting a stage do not fire it.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "crm.deal.stage_changed",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "deal": {
      "id": "dl_8f3kQ2mZpV0bT7xL1aR9",
      "title": "Rediseño del sitio — Clínica Norte",
      "value": 4800,
      "currency": "USD",
      "pipeline_id": "pp_default",
      "stage_id": "proposal",
      "status": "open",
      "owner_id": "u_7KpQ2",
      "owner_name": "Valentina Ríos",
      "company_id": "co_2mN8",
      "company_name": "Clínica Norte",
      "person_ids": [
        "pe_4hT1"
      ],
      "primary_person_id": "pe_4hT1",
      "primary_person_name": "Mariana López",
      "label_ids": [],
      "custom_fields": {
        "origen_campana": "google-ads-marzo"
      },
      "is_archived": false,
      "created_at": 1761913600000,
      "updated_at": 1762000000000
    },
    "pipeline": {
      "id": "pp_default",
      "name": "Ventas"
    },
    "stage": {
      "id": "proposal",
      "name": "Propuesta"
    },
    "previous": {
      "pipeline": {
        "id": "pp_default",
        "name": "Ventas"
      },
      "stage": {
        "id": "qualified",
        "name": "Calificado"
      }
    },
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
crm.deal.won

A deal was marked as won

Fires when a deal's status becomes won. deal.won_at and deal.value are the figures Performance counts.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "crm.deal.won",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "deal": {
      "id": "dl_8f3kQ2mZpV0bT7xL1aR9",
      "title": "Rediseño del sitio — Clínica Norte",
      "value": 4800,
      "currency": "USD",
      "pipeline_id": "pp_default",
      "stage_id": "qualified",
      "status": "won",
      "owner_id": "u_7KpQ2",
      "owner_name": "Valentina Ríos",
      "company_id": "co_2mN8",
      "company_name": "Clínica Norte",
      "person_ids": [
        "pe_4hT1"
      ],
      "primary_person_id": "pe_4hT1",
      "primary_person_name": "Mariana López",
      "label_ids": [],
      "custom_fields": {
        "origen_campana": "google-ads-marzo"
      },
      "is_archived": false,
      "created_at": 1761913600000,
      "updated_at": 1762000000000,
      "won_at": 1762000000000
    },
    "pipeline": {
      "id": "pp_default",
      "name": "Ventas"
    },
    "stage": {
      "id": "won",
      "name": "Ganado"
    },
    "previous_status": "open",
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
crm.deal.lost

A deal was marked as lost

Fires when a deal's status becomes lost, with the lost reason when the person picked one.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "crm.deal.lost",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "deal": {
      "id": "dl_8f3kQ2mZpV0bT7xL1aR9",
      "title": "Rediseño del sitio — Clínica Norte",
      "value": 4800,
      "currency": "USD",
      "pipeline_id": "pp_default",
      "stage_id": "qualified",
      "status": "lost",
      "owner_id": "u_7KpQ2",
      "owner_name": "Valentina Ríos",
      "company_id": "co_2mN8",
      "company_name": "Clínica Norte",
      "person_ids": [
        "pe_4hT1"
      ],
      "primary_person_id": "pe_4hT1",
      "primary_person_name": "Mariana López",
      "label_ids": [],
      "custom_fields": {
        "origen_campana": "google-ads-marzo"
      },
      "is_archived": false,
      "created_at": 1761913600000,
      "updated_at": 1762000000000,
      "lost_at": 1762000000000
    },
    "pipeline": {
      "id": "pp_default",
      "name": "Ventas"
    },
    "stage": {
      "id": "qualified",
      "name": "Calificado"
    },
    "previous_status": "open",
    "lost_reason": {
      "id": "price",
      "name": "Precio"
    },
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
crm.deal.reopened

A closed deal was reopened

Fires when a won or lost deal goes back to open, from the screen, the API or an agent. previous_status says which closed state it came from.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "crm.deal.reopened",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "deal": {
      "id": "dl_8f3kQ2mZpV0bT7xL1aR9",
      "title": "Rediseño del sitio — Clínica Norte",
      "value": 4800,
      "currency": "USD",
      "pipeline_id": "pp_default",
      "stage_id": "qualified",
      "status": "open",
      "owner_id": "u_7KpQ2",
      "owner_name": "Valentina Ríos",
      "company_id": "co_2mN8",
      "company_name": "Clínica Norte",
      "person_ids": [
        "pe_4hT1"
      ],
      "primary_person_id": "pe_4hT1",
      "primary_person_name": "Mariana López",
      "label_ids": [],
      "custom_fields": {
        "origen_campana": "google-ads-marzo"
      },
      "is_archived": false,
      "created_at": 1761913600000,
      "updated_at": 1762000000000
    },
    "pipeline": {
      "id": "pp_default",
      "name": "Ventas"
    },
    "stage": {
      "id": "qualified",
      "name": "Calificado"
    },
    "previous_status": "lost",
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
crm.deal.archived

A deal was archived or unarchived

Fires when a deal is archived (archived: true, it leaves every aggregate) or unarchived (archived: false) from its own record or by the API. Archiving is a state of the record, not a deletion. Archiving in cascade from a person or company does not fire it yet.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "crm.deal.archived",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "deal": {
      "id": "dl_8f3kQ2mZpV0bT7xL1aR9",
      "title": "Rediseño del sitio — Clínica Norte",
      "value": 4800,
      "currency": "USD",
      "pipeline_id": "pp_default",
      "stage_id": "qualified",
      "status": "open",
      "owner_id": "u_7KpQ2",
      "owner_name": "Valentina Ríos",
      "company_id": "co_2mN8",
      "company_name": "Clínica Norte",
      "person_ids": [
        "pe_4hT1"
      ],
      "primary_person_id": "pe_4hT1",
      "primary_person_name": "Mariana López",
      "label_ids": [],
      "custom_fields": {
        "origen_campana": "google-ads-marzo"
      },
      "is_archived": true,
      "created_at": 1761913600000,
      "updated_at": 1762000000000
    },
    "pipeline": {
      "id": "pp_default",
      "name": "Ventas"
    },
    "stage": {
      "id": "qualified",
      "name": "Calificado"
    },
    "archived": true,
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
crm.deal.updated

A deal's fields changed

Fires on edits to one deal that are not a lifecycle change (title, value, owner, company, labels, custom fields, quote…). changed_fields lists the public field names that changed. Stage moves, wins, losses, reopenings and archiving fire their own event instead; bulk label or owner changes do not fire it yet.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "crm.deal.updated",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "deal": {
      "id": "dl_8f3kQ2mZpV0bT7xL1aR9",
      "title": "Rediseño del sitio — Clínica Norte",
      "value": 5200,
      "currency": "USD",
      "pipeline_id": "pp_default",
      "stage_id": "qualified",
      "status": "open",
      "owner_id": "u_7KpQ2",
      "owner_name": "Valentina Ríos",
      "company_id": "co_2mN8",
      "company_name": "Clínica Norte",
      "person_ids": [
        "pe_4hT1"
      ],
      "primary_person_id": "pe_4hT1",
      "primary_person_name": "Mariana López",
      "label_ids": [],
      "custom_fields": {
        "origen_campana": "google-ads-marzo"
      },
      "is_archived": false,
      "created_at": 1761913600000,
      "updated_at": 1762000000000
    },
    "changed_fields": [
      "value"
    ],
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
crm.deal.deleted

A deal was deleted

Fires when a deal is deleted one by one or in bulk. The deal is the last copy before deletion; it stays 30 days in the trash, where an owner or admin can restore it. Deleting with linked records (cascade) and merges do not fire it yet.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "crm.deal.deleted",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "deal": {
      "id": "dl_8f3kQ2mZpV0bT7xL1aR9",
      "title": "Rediseño del sitio — Clínica Norte",
      "value": 4800,
      "currency": "USD",
      "pipeline_id": "pp_default",
      "stage_id": "qualified",
      "status": "open",
      "owner_id": "u_7KpQ2",
      "owner_name": "Valentina Ríos",
      "company_id": "co_2mN8",
      "company_name": "Clínica Norte",
      "person_ids": [
        "pe_4hT1"
      ],
      "primary_person_id": "pe_4hT1",
      "primary_person_name": "Mariana López",
      "label_ids": [],
      "custom_fields": {
        "origen_campana": "google-ads-marzo"
      },
      "is_archived": false,
      "created_at": 1761913600000,
      "updated_at": 1762000000000
    },
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
crm.person.created

A person was created

Fires when a person is created from the People screen or by the API. A person created by a lead source arrives inside crm.lead.created instead; imports do not fire it yet.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "crm.person.created",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "person": {
      "id": "pe_4hT1",
      "first_name": "Mariana",
      "last_name": "López",
      "full_name": "Mariana López",
      "email": "mariana@clinicanorte.com",
      "emails": [
        "mariana@clinicanorte.com"
      ],
      "phone": "+5491155550123",
      "phones": [
        "+5491155550123"
      ],
      "job_title": "Directora de Marketing",
      "company_ids": [
        "co_2mN8"
      ],
      "primary_company_id": "co_2mN8",
      "company_name": "Clínica Norte",
      "owner_id": "u_7KpQ2",
      "label_ids": [],
      "custom_fields": {},
      "do_not_contact": false,
      "created_at": 1761996400000,
      "updated_at": 1762000000000
    },
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
crm.person.updated

A person's fields changed

Fires on edits to one person's record (name, emails, phones, company, owner, labels, custom fields…). changed_fields lists the public field names that changed. Bulk changes, do-not-contact switches and company links do not fire it yet.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "crm.person.updated",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "person": {
      "id": "pe_4hT1",
      "first_name": "Mariana",
      "last_name": "López",
      "full_name": "Mariana López",
      "email": "mariana@clinicanorte.com",
      "emails": [
        "mariana@clinicanorte.com"
      ],
      "phone": "+5491155550123",
      "phones": [
        "+5491155550123"
      ],
      "job_title": "CMO",
      "company_ids": [
        "co_2mN8"
      ],
      "primary_company_id": "co_2mN8",
      "company_name": "Clínica Norte",
      "owner_id": "u_7KpQ2",
      "label_ids": [],
      "custom_fields": {},
      "do_not_contact": false,
      "created_at": 1761996400000,
      "updated_at": 1762000000000
    },
    "changed_fields": [
      "job_title"
    ],
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
crm.person.deleted

A person was deleted

Fires when a person is deleted one by one or in bulk. The person is the last copy before deletion; it stays 30 days in the trash. Deleting with linked records (cascade) and merges do not fire it yet.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "crm.person.deleted",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "person": {
      "id": "pe_4hT1",
      "first_name": "Mariana",
      "last_name": "López",
      "full_name": "Mariana López",
      "email": "mariana@clinicanorte.com",
      "emails": [
        "mariana@clinicanorte.com"
      ],
      "phone": "+5491155550123",
      "phones": [
        "+5491155550123"
      ],
      "job_title": "Directora de Marketing",
      "company_ids": [
        "co_2mN8"
      ],
      "primary_company_id": "co_2mN8",
      "company_name": "Clínica Norte",
      "owner_id": "u_7KpQ2",
      "label_ids": [],
      "custom_fields": {},
      "do_not_contact": false,
      "created_at": 1761996400000,
      "updated_at": 1762000000000
    },
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
crm.company.created

A company was created

Fires when a company is created from the Companies screen or by the API. Companies created by a lead source or an import do not fire it yet.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "crm.company.created",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "company": {
      "id": "co_2mN8",
      "name": "Clínica Norte",
      "domain": "clinicanorte.com",
      "industry": "Salud",
      "website": "https://clinicanorte.com",
      "country": "AR",
      "owner_id": "u_7KpQ2",
      "label_ids": [],
      "custom_fields": {},
      "created_at": 1761992800000,
      "updated_at": 1762000000000
    },
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
crm.company.updated

A company's fields changed

Fires on edits to one company's record. changed_fields lists the public field names that changed. Bulk changes do not fire it yet.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "crm.company.updated",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "company": {
      "id": "co_2mN8",
      "name": "Clínica Norte",
      "domain": "clinicanorte.com",
      "industry": "Salud privada",
      "website": "https://clinicanorte.com",
      "country": "AR",
      "owner_id": "u_7KpQ2",
      "label_ids": [],
      "custom_fields": {},
      "created_at": 1761992800000,
      "updated_at": 1762000000000
    },
    "changed_fields": [
      "industry"
    ],
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
crm.company.deleted

A company was deleted

Fires when a company is deleted one by one or in bulk. The company is the last copy before deletion; it stays 30 days in the trash. Deleting with linked records (cascade) and merges do not fire it yet.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "crm.company.deleted",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "company": {
      "id": "co_2mN8",
      "name": "Clínica Norte",
      "domain": "clinicanorte.com",
      "industry": "Salud",
      "website": "https://clinicanorte.com",
      "country": "AR",
      "owner_id": "u_7KpQ2",
      "label_ids": [],
      "custom_fields": {},
      "created_at": 1761992800000,
      "updated_at": 1762000000000
    },
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
crm.activity.created

An activity was created

Fires when a note, task, call, meeting or reply is created on a deal, person, company or prospect from the screen or the API. Emails synced from a mailbox, WhatsApp or social messages, and activities written by sequences, the dialer or the AI team do not fire it yet.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "crm.activity.created",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "activity": {
      "id": "ac_1pL6",
      "type": "note",
      "subject": "Llamada de descubrimiento",
      "content_plain_text": "Quieren lanzar el sitio nuevo antes de junio.",
      "deal_ids": [
        "dl_8f3kQ2mZpV0bT7xL1aR9"
      ],
      "person_ids": [
        "pe_4hT1"
      ],
      "company_ids": [],
      "prospect_ids": [],
      "owner_id": "u_7KpQ2",
      "created_at": 1762000000000,
      "updated_at": 1762000000000
    },
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}

Platform

job.completed

A background job finished

Fires once when an export or an import started through the API or the MCP (crm.exports.create, crm.imports.create), or an import started from the app's CSV import wizard (it shows as crm.imports.create too), finishes: status done, or failed with its error.code. Carries the job with its type, progress and result counters (rows exported; persons, deals and companies created by an import), but never the download link: fetch the job with GET /v1/jobs/{job_id} to get a fresh signed URL. Jobs and their files are kept 7 days.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "job.completed",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "job": {
      "id": "job_0q3x9k2a1Bc4De5Fg6Hi7Jk",
      "type": "export",
      "operation_id": "crm.exports.create",
      "status": "done",
      "progress": {
        "done": 1250,
        "total": 1250
      },
      "result": {
        "count": 1250,
        "file_name": "crm-deals-2026-11-03.csv",
        "content_type": "text/csv",
        "bytes": 412233,
        "expires_at": 1762604800000
      },
      "created_at": 1761999960000,
      "finished_at": 1762000000000
    },
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}

Monitors

monitors.monitor.assigned

A monitor was assigned to a platform

Fires when a platform tab of the organization's Monitors page gets a monitor, or changes to another one: from the screen, the API or the MCP. Carries the platform, the monitor template (its own, inherited from the workspace or a system one) and the one it replaced, if any. Assigning the same monitor again does not fire.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "monitors.monitor.assigned",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "assignment": {
      "platform_id": "google_ads",
      "template": {
        "id": "mon_8Hq2LmXo1",
        "title": "Google Ads Leads",
        "source": "SYSTEM",
        "source_org_id": null
      },
      "previous_template_id": null,
      "assigned_at": 1762000000000
    },
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
monitors.monitor.unassigned

A monitor was removed from a platform

Fires when the monitor of a platform tab is removed (the tab goes back to the monitor picker). Carries the platform and the template that was assigned. Removing from a tab with no monitor does not fire.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "monitors.monitor.unassigned",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "assignment": {
      "platform_id": "meta_ads",
      "template_id": "mon_3Fk9QpZr7",
      "template_title": "Meta Ads Leads",
      "unassigned_at": 1762000000000
    },
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
monitors.template.published

A monitor template was published

Fires when one of the organization's monitor templates goes from draft to published (moving it back to draft does not fire): from then on it can be assigned to its platform's tab and, for a workspace, its accounts can use it as an inherited monitor. Carries the template with its platform and counts.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "monitors.template.published",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "template": {
      "id": "mon_Agency01",
      "title": "Google Ads — revisión diaria",
      "description": null,
      "platform": "google_ads",
      "supported_platforms": [
        "google_ads"
      ],
      "page_count": 1,
      "widget_count": 9,
      "published_at": 1762000000000
    },
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}

Dashboards

dashboards.dashboard.created

A dashboard was created

Fires when a dashboard is created from a template: from the screen, the API, the MCP or a bulk deployment from the workspace (one event per account, in that account). Carries the dashboard with its template reference and platforms; widget data is not included.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "dashboards.dashboard.created",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "dashboard": {
      "id": "dash_8Hq2LmXo1",
      "title": "Performance mensual — Google Ads",
      "description": "Inversión, conversiones y CPA por campaña.",
      "kind": "linked",
      "template": {
        "id": "tpl_GA01",
        "source": "SYSTEM"
      },
      "platforms": [
        "google_ads"
      ],
      "created_at": 1762000000000,
      "created_by": "u_7KpQ2"
    },
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
dashboards.dashboard.deleted

A dashboard was deleted

Fires when a dashboard is deleted (it stays 30 days in the trash and can be restored). Carries its id, title and kind.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "dashboards.dashboard.deleted",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "dashboard": {
      "id": "dash_8Hq2LmXo1",
      "title": "Performance mensual — Google Ads",
      "kind": "linked",
      "deleted_at": 1762000000000
    },
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
dashboards.dashboard.exported

A dashboard was exported to PDF

Fires when a dashboard is exported to PDF, from the screen or the API. Carries the dashboard and the file's name, size and expiry. The download link is NOT included (it is a bearer link): it goes only to whoever exported.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "dashboards.dashboard.exported",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "dashboard": {
      "id": "dash_8Hq2LmXo1",
      "title": "Performance mensual — Google Ads"
    },
    "file": {
      "name": "Performance mensual  Google Ads.pdf",
      "size_bytes": 482311,
      "format": "pdf",
      "expires_at": 1762086400000
    },
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
dashboards.template.published

A dashboard template was published

Fires when one of the organization's dashboard templates goes from draft to published (moving it back to draft does not fire). A workspace's published templates are offered to its accounts and to bulk deployment. Carries the template with its data source slots and counts.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "dashboards.template.published",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "template": {
      "id": "tpl_Agency01",
      "title": "Reporte mensual de la agencia",
      "description": null,
      "supported_platforms": [
        "google_ads",
        "meta_ads"
      ],
      "data_source_slots": [
        {
          "id": "slot_google_ads",
          "name": "Google Ads",
          "platform": "google_ads"
        },
        {
          "id": "slot_meta_ads",
          "name": "Meta Ads",
          "platform": "meta_ads"
        }
      ],
      "page_count": 2,
      "widget_count": 14,
      "published_at": 1762000000000
    },
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}

Reports

reports.instance.generated

A report instance was generated from a template

Fires when a report instance is created from a template: from the Reports screen, by the API or MCP (reports.instances.generate), or by a recurring delivery that freezes a new instance on schedule. The instance is a draft until its PDF is exported. Blank instances (reports.instances.create) and duplicates do not fire it.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "reports.instance.generated",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "instance": {
      "id": "Rk3VYq8mZ1wTn5Hc2aLp",
      "title": "Google Ads — Leads",
      "status": "draft",
      "target_org_id": "PRVPFY1iy0AzAe3eF7DZ",
      "target_org_name": "Nissan Capital",
      "template": {
        "id": "tpl_google_ads_leads",
        "source": "SYSTEM",
        "title": "Google Ads — Leads"
      },
      "date_range": {
        "preset": "last_month",
        "label": "1 sep – 30 sep 2026"
      },
      "created_from_delivery": false,
      "ai_block_count": 2,
      "ai_blocks_generated": 2,
      "published_to_portal": false,
      "has_pdf": false,
      "created_by": "u_7KpQ2",
      "created_at": 1762000000000,
      "updated_at": 1762000000000
    },
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
reports.instance.finalized

A report instance was finalized (locked)

Fires when a draft report instance becomes final and read-only: when its first PDF is generated (reports.instances.export_pdf or the screen) or when it is finalized explicitly (reports.instances.finalize). Instances finalized by sending a delivery (manual or scheduled) do not fire it yet.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "reports.instance.finalized",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "instance": {
      "id": "Rk3VYq8mZ1wTn5Hc2aLp",
      "title": "Google Ads — Leads",
      "status": "finalized",
      "target_org_id": "PRVPFY1iy0AzAe3eF7DZ",
      "target_org_name": "Nissan Capital",
      "template": {
        "id": "tpl_google_ads_leads",
        "source": "SYSTEM",
        "title": "Google Ads — Leads"
      },
      "date_range": {
        "preset": "last_month",
        "label": "1 sep – 30 sep 2026"
      },
      "created_from_delivery": false,
      "ai_block_count": 2,
      "ai_blocks_generated": 2,
      "published_to_portal": false,
      "has_pdf": true,
      "created_by": "u_7KpQ2",
      "created_at": 1762000000000,
      "updated_at": 1762000000000
    },
    "finalized_at": 1762000000000,
    "finalized_by": "u_7KpQ2",
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
reports.instance.published

A finalized report was published to the account's client portal

Fires when a finalized report instance of an account is published to that account's Client Portal, from the screen or with reports.instances.publish_to_portal. Unpublishing does not fire an event.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "reports.instance.published",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "instance": {
      "id": "Rk3VYq8mZ1wTn5Hc2aLp",
      "title": "Google Ads — Leads",
      "status": "finalized",
      "target_org_id": "PRVPFY1iy0AzAe3eF7DZ",
      "target_org_name": "Nissan Capital",
      "template": {
        "id": "tpl_google_ads_leads",
        "source": "SYSTEM",
        "title": "Google Ads — Leads"
      },
      "date_range": {
        "preset": "last_month",
        "label": "1 sep – 30 sep 2026"
      },
      "created_from_delivery": false,
      "ai_block_count": 2,
      "ai_blocks_generated": 2,
      "published_to_portal": true,
      "has_pdf": true,
      "created_by": "u_7KpQ2",
      "created_at": 1762000000000,
      "updated_at": 1762000000000
    },
    "published_at": 1762000000000,
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
reports.pdf.ready

The PDF of a report instance is ready

Fires when the background job started by reports.instances.export_pdf (or the screen's «Generate PDF») finishes and the file is stored. The payload does not carry the file: download it with reports.instances.pdf_url, which returns a short-lived signed link. Ad hoc PDFs and the PDFs attached to deliveries do not fire it.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "reports.pdf.ready",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "instance": {
      "id": "Rk3VYq8mZ1wTn5Hc2aLp",
      "title": "Google Ads — Leads",
      "status": "finalized",
      "target_org_id": "PRVPFY1iy0AzAe3eF7DZ",
      "target_org_name": "Nissan Capital",
      "template": {
        "id": "tpl_google_ads_leads",
        "source": "SYSTEM",
        "title": "Google Ads — Leads"
      },
      "date_range": {
        "preset": "last_month",
        "label": "1 sep – 30 sep 2026"
      },
      "created_from_delivery": false,
      "ai_block_count": 2,
      "ai_blocks_generated": 2,
      "published_to_portal": false,
      "has_pdf": true,
      "created_by": "u_7KpQ2",
      "created_at": 1762000000000,
      "updated_at": 1762000000000
    },
    "pdf": {
      "generated_at": 1762000000000,
      "file_name": "Google Ads — Leads.pdf"
    },
    "requested_by": "u_7KpQ2",
    "actor": {
      "uid": "system:report-pdf",
      "name": "MB Suite",
      "kind": "system"
    }
  }
}
reports.pdf.failed

The PDF of a report instance could not be generated

Fires when the background PDF job of a report instance fails (the render service returned an error) or is abandoned after five minutes without finishing. The instance stays as it was; run reports.instances.export_pdf again to retry.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "reports.pdf.failed",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "instance": {
      "id": "Rk3VYq8mZ1wTn5Hc2aLp",
      "title": "Google Ads — Leads",
      "target_org_id": "PRVPFY1iy0AzAe3eF7DZ"
    },
    "error": {
      "message": "La generación del PDF tardó demasiado. Intenta de nuevo."
    },
    "requested_by": "u_7KpQ2",
    "actor": {
      "uid": "system:report-pdf",
      "name": "MB Suite",
      "kind": "system"
    }
  }
}
reports.template.published

A report template of the organization was published

Fires when an organization's report template goes from draft to published (from the template list, the template editor or reports.templates.publish). Published templates are the ones its accounts see as inherited and the ones offered when generating a report. Templates created already published by «Save as template» do not fire it.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "reports.template.published",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "template": {
      "id": "tpl_8sYw2",
      "title": "Monthly performance",
      "description": "Paid media and web analytics for the monthly client review.",
      "status": "published",
      "version": 7,
      "supported_platforms": [
        "google_ads",
        "meta_ads",
        "google_analytics"
      ],
      "data_source_slots": [
        {
          "id": "ds_1",
          "name": "google_ads ds_1",
          "platform": "google_ads"
        }
      ],
      "updated_at": 1762000000000
    },
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}

Alerts

alerts.alert.created

A metric alert was created

Fires when an alert is created, from the Alerts screen, the API, the MCP or MIA. Carries the alert as it was saved (condition, watched organization, platform account, metric, recipient ids, cooldown). Recipient emails never travel in webhooks: read the alert with alerts.alerts.get if you need them.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "alerts.alert.created",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "alert": {
      "id": "al_8Hq2LmZpV0bT7xL1aR9c",
      "name": "Avg. CPC +20% Google Ads - Clínica Norte",
      "target_org_id": "org_Cl1n1c4N0rt3",
      "target_org_name": "Clínica Norte",
      "platform": "google_ads",
      "account_id": "1234567890",
      "account_name": "Clínica Norte — Search",
      "metric": "cpc",
      "metric_label": "Avg. CPC",
      "metric_format": "currency",
      "condition": {
        "operator": "increased_by",
        "threshold": 20,
        "threshold_type": "percentage",
        "period": "7d",
        "comparison": "vs_previous_period"
      },
      "recipients": [
        "u_7KpQ2",
        "u_3bTz8"
      ],
      "cooldown_hours": 24,
      "enabled": true,
      "template_id": "gads_cpc_increase",
      "last_evaluated_at": 1761996400000,
      "last_triggered_at": null,
      "last_value": 1.42,
      "last_delta": 6.3,
      "consecutive_errors": 0,
      "last_error": null,
      "created_at": 1761395200000,
      "created_by_id": "u_7KpQ2",
      "updated_at": 1761996400000,
      "updated_by_id": "u_7KpQ2"
    },
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
alerts.alert.updated

A metric alert changed

Fires when an alert is edited or turned on or off, from the screen, the API, the MCP or MIA. changed_fields lists the public names of what changed (for example enabled, condition, recipients). Saving without changes does not fire it. The hourly evaluation updating last_value or last_evaluated_at does not fire it either (see alerts.alert.triggered and alerts.alert.auto_disabled).

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "alerts.alert.updated",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "alert": {
      "id": "al_8Hq2LmZpV0bT7xL1aR9c",
      "name": "Avg. CPC +20% Google Ads - Clínica Norte",
      "target_org_id": "org_Cl1n1c4N0rt3",
      "target_org_name": "Clínica Norte",
      "platform": "google_ads",
      "account_id": "1234567890",
      "account_name": "Clínica Norte — Search",
      "metric": "cpc",
      "metric_label": "Avg. CPC",
      "metric_format": "currency",
      "condition": {
        "operator": "increased_by",
        "threshold": 30,
        "threshold_type": "percentage",
        "period": "7d",
        "comparison": "vs_previous_period"
      },
      "recipients": [
        "u_7KpQ2",
        "u_3bTz8"
      ],
      "cooldown_hours": 24,
      "enabled": true,
      "template_id": "gads_cpc_increase",
      "last_evaluated_at": 1761996400000,
      "last_triggered_at": null,
      "last_value": 1.42,
      "last_delta": 6.3,
      "consecutive_errors": 0,
      "last_error": null,
      "created_at": 1761395200000,
      "created_by_id": "u_7KpQ2",
      "updated_at": 1761996400000,
      "updated_by_id": "u_7KpQ2"
    },
    "changed_fields": [
      "condition"
    ],
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
alerts.alert.deleted

A metric alert was deleted

Fires when an alert is deleted, from the screen, the API, the MCP or MIA. The alert is the last copy before deletion; it stays 30 days in the trash, and its trigger history is kept.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "alerts.alert.deleted",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "alert": {
      "id": "al_8Hq2LmZpV0bT7xL1aR9c",
      "name": "Avg. CPC +20% Google Ads - Clínica Norte",
      "target_org_id": "org_Cl1n1c4N0rt3",
      "target_org_name": "Clínica Norte",
      "platform": "google_ads",
      "account_id": "1234567890",
      "account_name": "Clínica Norte — Search",
      "metric": "cpc",
      "metric_label": "Avg. CPC",
      "metric_format": "currency",
      "condition": {
        "operator": "increased_by",
        "threshold": 20,
        "threshold_type": "percentage",
        "period": "7d",
        "comparison": "vs_previous_period"
      },
      "recipients": [
        "u_7KpQ2",
        "u_3bTz8"
      ],
      "cooldown_hours": 24,
      "enabled": true,
      "template_id": "gads_cpc_increase",
      "last_evaluated_at": 1761996400000,
      "last_triggered_at": null,
      "last_value": 1.42,
      "last_delta": 6.3,
      "consecutive_errors": 0,
      "last_error": null,
      "created_at": 1761395200000,
      "created_by_id": "u_7KpQ2",
      "updated_at": 1761996400000,
      "updated_by_id": "u_7KpQ2"
    },
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
alerts.alert.triggered

A metric alert triggered

Fires when the hourly evaluation finds an alert's condition met, once per trigger (afterwards the alert waits its cooldown_hours). Carries the alert with its new state, the evaluation (current_value, previous_value, delta_absolute, delta_percent, severity info/warning/critical, the compared date ranges as YYYY-MM-DD, evaluated_at) and history_entry_id, the entry in alerts.history.list. The emails to the recipients go out in the same run. The actor is the system (system:cron-alerts).

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "alerts.alert.triggered",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "alert": {
      "id": "al_8Hq2LmZpV0bT7xL1aR9c",
      "name": "Avg. CPC +20% Google Ads - Clínica Norte",
      "target_org_id": "org_Cl1n1c4N0rt3",
      "target_org_name": "Clínica Norte",
      "platform": "google_ads",
      "account_id": "1234567890",
      "account_name": "Clínica Norte — Search",
      "metric": "cpc",
      "metric_label": "Avg. CPC",
      "metric_format": "currency",
      "condition": {
        "operator": "increased_by",
        "threshold": 20,
        "threshold_type": "percentage",
        "period": "7d",
        "comparison": "vs_previous_period"
      },
      "recipients": [
        "u_7KpQ2",
        "u_3bTz8"
      ],
      "cooldown_hours": 24,
      "enabled": true,
      "template_id": "gads_cpc_increase",
      "last_evaluated_at": 1762000000000,
      "last_triggered_at": 1762000000000,
      "last_value": 1.81,
      "last_delta": 27.5,
      "consecutive_errors": 0,
      "last_error": null,
      "created_at": 1761395200000,
      "created_by_id": "u_7KpQ2",
      "updated_at": 1761996400000,
      "updated_by_id": "u_7KpQ2"
    },
    "evaluation": {
      "current_value": 1.81,
      "previous_value": 1.42,
      "delta_absolute": 0.39,
      "delta_percent": 27.5,
      "severity": "info",
      "date_range": {
        "current": {
          "from": "2026-10-26",
          "to": "2026-11-01"
        },
        "previous": {
          "from": "2026-10-19",
          "to": "2026-10-25"
        }
      },
      "evaluated_at": 1762000000000
    },
    "history_entry_id": "ah_4Rk9TzQ1mW7pL2xV5nYc",
    "actor": {
      "uid": "system:cron-alerts",
      "name": "Sistema de Alertas",
      "kind": "system"
    }
  }
}
alerts.alert.auto_disabled

A metric alert was turned off after repeated errors

Fires when the hourly evaluation turns an alert off after 5 failed evaluations in a row (the platform connection expired, the account lost access, the metric is not available). Carries the alert (enabled false), consecutive_errors and last_error. Turn it back on with alerts.alerts.toggle once the connection is fixed. The actor is the system (system:cron-alerts).

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "alerts.alert.auto_disabled",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "alert": {
      "id": "al_8Hq2LmZpV0bT7xL1aR9c",
      "name": "Avg. CPC +20% Google Ads - Clínica Norte",
      "target_org_id": "org_Cl1n1c4N0rt3",
      "target_org_name": "Clínica Norte",
      "platform": "google_ads",
      "account_id": "1234567890",
      "account_name": "Clínica Norte — Search",
      "metric": "cpc",
      "metric_label": "Avg. CPC",
      "metric_format": "currency",
      "condition": {
        "operator": "increased_by",
        "threshold": 20,
        "threshold_type": "percentage",
        "period": "7d",
        "comparison": "vs_previous_period"
      },
      "recipients": [
        "u_7KpQ2",
        "u_3bTz8"
      ],
      "cooldown_hours": 24,
      "enabled": false,
      "template_id": "gads_cpc_increase",
      "last_evaluated_at": 1761996400000,
      "last_triggered_at": null,
      "last_value": 1.42,
      "last_delta": 6.3,
      "consecutive_errors": 5,
      "last_error": "Sin acceso a la cuenta 1234567890",
      "created_at": 1761395200000,
      "created_by_id": "u_7KpQ2",
      "updated_at": 1761996400000,
      "updated_by_id": "u_7KpQ2"
    },
    "consecutive_errors": 5,
    "last_error": "Sin acceso a la cuenta 1234567890",
    "actor": {
      "uid": "system:cron-alerts",
      "name": "Sistema de Alertas",
      "kind": "system"
    }
  }
}

Deliveries

deliveries.delivery.sent

A delivery's email went out

Fires every time a delivery's email is accepted by Amazon SES and recorded in its send history: a manual send (deliveries.deliveries.send_now, from the screen, the API or an agent; actor = who sent it) or a scheduled one (actor = the delivery scheduler, kind system). Carries the delivery (target account, type, subject as configured: a recurring one may contain {{periodo}}) and the send: when, trigger, recipients (To), the data period, the report PDFs with signed download links valid 7 days, and the dashboard links. A send whose report PDFs could not be rendered still fires it with fewer pdfs.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "deliveries.delivery.sent",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "delivery": {
      "id": "Qm4xT8vRk2LpZ7nWc1Yd",
      "target_org_id": "aB3dE9fGh1JkL2mN4pQr",
      "target_org_name": "Clínica Norte",
      "delivery_type": "report",
      "email_mode": "compose",
      "subject": "Reporte mensual — {{periodo}}",
      "schedule_type": "recurring",
      "platforms": [
        "google_analytics",
        "meta_ads"
      ]
    },
    "send": {
      "id": "s7HkP2qWx9ZtR4mN8vBc",
      "sent_at": 1762000000000,
      "trigger": "scheduled",
      "status": "sent",
      "recipients": [
        "gerencia@clinicanorte.com",
        "marketing@clinicanorte.com"
      ],
      "date_range": {
        "from": "2026-09-01",
        "to": "2026-09-30"
      },
      "pdfs": [
        {
          "template_id": "tpl_8sK2mQ",
          "title": "Performance mensual",
          "version": 4,
          "url": "https://files.mb-suite.com/exports/deliveries/aB3dE9fGh1JkL2mN4pQr/2f6c….pdf?X-Amz-Signature=…"
        }
      ],
      "dashboards": [
        {
          "dashboard_id": "db_3Lp9Xw",
          "title": "Google Ads — Resumen",
          "url": "https://clinicanorte.portal.mb-suite.com/analytics/dashboards/db_3Lp9Xw?from=2026-09-01&to=2026-09-30"
        }
      ],
      "errors": []
    },
    "actor": {
      "uid": "system:deliveries-scheduler",
      "name": "Delivery scheduler",
      "kind": "system"
    }
  }
}
deliveries.delivery.failed

A delivery's email could not be sent

Fires when a send attempt of a delivery is recorded in its history as failed: Amazon SES rejected the email (send.errors says why). Same shape as deliveries.delivery.sent. A scheduled delivery keeps its schedule (a recurring one retries on its next run; a one-shot stays failed). An attempt that crashed before reaching the history does not fire it.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "deliveries.delivery.failed",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "delivery": {
      "id": "Qm4xT8vRk2LpZ7nWc1Yd",
      "target_org_id": "aB3dE9fGh1JkL2mN4pQr",
      "target_org_name": "Clínica Norte",
      "delivery_type": "report",
      "email_mode": "compose",
      "subject": "Reporte mensual — {{periodo}}",
      "schedule_type": "recurring",
      "platforms": [
        "google_analytics",
        "meta_ads"
      ]
    },
    "send": {
      "id": "s7HkP2qWx9ZtR4mN8vBc",
      "sent_at": 1762000000000,
      "trigger": "scheduled",
      "status": "failed",
      "recipients": [
        "gerencia@clinicanorte.com",
        "marketing@clinicanorte.com"
      ],
      "date_range": {
        "from": "2026-09-01",
        "to": "2026-09-30"
      },
      "pdfs": [],
      "dashboards": [],
      "errors": [
        {
          "recipient": "gerencia@clinicanorte.com, marketing@clinicanorte.com",
          "error": "Email address is not verified."
        }
      ]
    },
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
deliveries.delivery.scheduled

A delivery was scheduled

Fires when a delivery is scheduled or rescheduled (deliveries.deliveries.schedule, or created with a schedule): one_shot on a date (send_at) or recurring (frequency, day, hour, timezone), with next_run_at, the first time the scheduler will send it.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "deliveries.delivery.scheduled",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "delivery": {
      "id": "Qm4xT8vRk2LpZ7nWc1Yd",
      "target_org_id": "aB3dE9fGh1JkL2mN4pQr",
      "target_org_name": "Clínica Norte",
      "delivery_type": "report",
      "email_mode": "compose",
      "subject": "Reporte mensual — {{periodo}}",
      "schedule_type": "recurring",
      "platforms": [
        "google_analytics",
        "meta_ads"
      ]
    },
    "schedule": {
      "type": "recurring",
      "send_at": null,
      "frequency": "monthly",
      "day_of_week": null,
      "day_of_month": 1,
      "hour": 9,
      "minute": 0,
      "timezone": "America/Argentina/Buenos_Aires",
      "next_run_at": 1763814400000
    },
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
deliveries.delivery.schedule_cancelled

A delivery's schedule was cancelled

Fires when the schedule of a scheduled or recurring delivery is cancelled (deliveries.deliveries.cancel_schedule): no more automatic sends; the delivery goes back to draft. previous_schedule is the schedule it had. Deleting a scheduled delivery does not fire it.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "deliveries.delivery.schedule_cancelled",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "delivery": {
      "id": "Qm4xT8vRk2LpZ7nWc1Yd",
      "target_org_id": "aB3dE9fGh1JkL2mN4pQr",
      "target_org_name": "Clínica Norte",
      "delivery_type": "report",
      "email_mode": "compose",
      "subject": "Reporte mensual — {{periodo}}",
      "schedule_type": null,
      "platforms": [
        "google_analytics",
        "meta_ads"
      ]
    },
    "previous_schedule": {
      "type": "recurring",
      "send_at": null,
      "frequency": "monthly",
      "day_of_week": null,
      "day_of_month": 1,
      "hour": 9,
      "minute": 0,
      "timezone": "America/Argentina/Buenos_Aires",
      "next_run_at": 1763814400000
    },
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}

Phones

crm_phones.line.purchased

A phone number was bought

Fires when the organization buys a phone number on the Phones screen, once it is charged and ready to use: the line with its number, country, type, capabilities, destination (crm by default; it can be moved to another destination afterwards), monthly list price and who pays it. Numbers are only bought on the screen; numbers set up by MB Suite staff for internal use do not fire it.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "crm_phones.line.purchased",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "line": {
      "id": "PN3f2b8c0e9a1d4f6b7c8d9e0f1a2b3c4d",
      "phone_number": "+541152630190",
      "friendly_name": "Ventas Buenos Aires",
      "country_iso": "AR",
      "type": "local",
      "capabilities": [
        "voice",
        "sms"
      ],
      "status": "active",
      "destination": "crm",
      "monthly_cost_usd_cents": 1200,
      "billing_mode": "own_subscription",
      "purchased_at": 1762000000000,
      "cancel_at": null,
      "release_scheduled_at": null,
      "inbound_receivers": [],
      "inbound_timeout_sec": 30,
      "voicemail_enabled": true,
      "voicemail_greeting": null,
      "recording_enabled": false,
      "recording_enabled_at": null,
      "recording_notice_ack_version": null,
      "whatsapp_locked": false,
      "whatsapp_phone_number_id": null,
      "sort_order": null,
      "created_by_id": "u_7KpQ2",
      "created_at": 1762000000000,
      "updated_at": 1762000000000
    },
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
crm_phones.sms.sent

An SMS was sent from a phone line

Fires when an SMS leaves one of the organization's lines, from the screen, the API or an agent (crm_phones.sms.send): the stored message (body, from, to, segments, the CRM person with that number, who sent it, what it cost the Phones balance) and the line. status is the first one the network reported (usually queued or sent); delivery confirmations do not fire another event. A message the network rejected is not stored and does not fire it.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "crm_phones.sms.sent",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "message": {
      "id": "SM8a1c3e5f7b9d2f4a6c8e0b1d3f5a7c9e",
      "line_id": "PN3f2b8c0e9a1d4f6b7c8d9e0f1a2b3c4d",
      "line_phone_number": "+13055550142",
      "direction": "outbound",
      "from": "+13055550142",
      "to": "+13055550187",
      "body": "Hola Mariana, te confirmo la visita del jueves a las 10. ¡Gracias!",
      "num_segments": 1,
      "status": "queued",
      "error_code": null,
      "error_message": null,
      "person_id": "pe_4hT1",
      "sent_by_user_id": "u_7KpQ2",
      "client_cost_cents": 2,
      "created_at": 1762000000000,
      "updated_at": 1762000000000
    },
    "line": {
      "id": "PN3f2b8c0e9a1d4f6b7c8d9e0f1a2b3c4d",
      "phone_number": "+13055550142"
    },
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
crm_phones.sms.received

An SMS arrived on a phone line

Fires once per SMS that arrives on one of the organization's lines, after it is stored: body, who sent it (from), the line it reached (to), segments, the CRM person with that number (person_id, when there is one) and what receiving it cost the Phones balance. Messages to an organization whose account is blocked for billing are dropped and do not fire it. One-time verification codes never arrive (the phone network filters them).

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "crm_phones.sms.received",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "message": {
      "id": "SM2b4d6f8a0c1e3a5c7e9b0d2f4a6c8e1b",
      "line_id": "PN3f2b8c0e9a1d4f6b7c8d9e0f1a2b3c4d",
      "line_phone_number": "+13055550142",
      "direction": "inbound",
      "from": "+13055550187",
      "to": "+13055550142",
      "body": "Perfecto, nos vemos el jueves.",
      "num_segments": 1,
      "status": "received",
      "error_code": null,
      "error_message": null,
      "person_id": "pe_4hT1",
      "sent_by_user_id": null,
      "client_cost_cents": 1,
      "created_at": 1762000000000,
      "updated_at": 1762000000000
    },
    "line": {
      "id": "PN3f2b8c0e9a1d4f6b7c8d9e0f1a2b3c4d",
      "phone_number": "+13055550142"
    },
    "actor": {
      "uid": "system:phones",
      "name": "Phones",
      "kind": "system"
    }
  }
}
crm_phones.wallet.recharged

The Phones balance was topped up

Fires when a top-up of the Phones balance (the prepaid balance that pays calls and SMS) is paid and credited: by hand from the screen or by auto-recharge (transaction.auto_recharge). Carries the new balance, the previous one and the transaction (amount in USD cents, invoice number). A top-up whose charge fails does not fire it, and neither do credits or refunds made by MB Suite support.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "crm_phones.wallet.recharged",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "wallet": {
      "balance_cents": 5420,
      "previous_balance_cents": 420,
      "auto_recharge_enabled": true
    },
    "transaction": {
      "id": "topup_inv_in_1Q2w3E4r5T6y7U8i",
      "type": "topup",
      "amount_cents": 5000,
      "description": "Recarga automática",
      "auto_recharge": true,
      "invoice_number": "F6OXNXBO-0003",
      "created_at": 1762000000000
    },
    "actor": {
      "uid": "system:phones",
      "name": "Phones",
      "kind": "system"
    }
  }
}
crm_phones.wallet.low_balance

The Phones balance fell below its low mark

Fires when a charge (a call, an SMS, a line or a support adjustment) takes the Phones balance from at or above its low mark to below it: the auto-recharge threshold when auto-recharge is on, USD 10.00 otherwise (the mark the Phones screen shows). It fires once per crossing, not on every charge below the mark; with auto-recharge on, the top-up follows on its own (crm_phones.wallet.recharged). Carries the new balance, the previous one, the mark and the charge that crossed it. Calls and SMS stop when the balance cannot cover them.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "crm_phones.wallet.low_balance",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "wallet": {
      "balance_cents": 940,
      "previous_balance_cents": 1012,
      "low_balance_mark_cents": 1000,
      "auto_recharge_enabled": false
    },
    "transaction": {
      "id": "call_CA9f8e7d6c5b4a39281706f5e4d3c2b1a0",
      "type": "call_charge",
      "amount_cents": -72,
      "description": "Llamada a +13055550187 (6 min)",
      "auto_recharge": false,
      "invoice_number": null,
      "created_at": 1762000000000
    },
    "actor": {
      "uid": "system:phones",
      "name": "Phones",
      "kind": "system"
    }
  }
}

Inbox

social_inbox.item.received

A new comment, direct message or mention arrived in the Social Inbox

A new incoming item (a comment, a direct message or a mention from Instagram or Facebook; those from LinkedIn and TikTok don't fire it: their terms don't allow sending their data to a webhook) entered the Social Inbox, by real-time webhook or by the periodic sync. Emitted once per item, before any automatic rule or AI reply. It does not fire for the brand's own messages, for direct messages that belong to the CRM (they live in CRM → Messages), for items classified as spam on arrival, or for history older than 24 hours brought in by a backfill. The attachments MB Suite keeps come as links signed for one hour from the moment the event was built (url_expires_at); a delivery retried later may carry an expired link: get the item (social_inbox.items.get) for a fresh one.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "social_inbox.item.received",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "item": {
      "id": "8f4c2a91d0b7e6f35a1c9e2d4b7a8f60c3e1d2b5a4f9c8e7d6b5a4c3e2f1d0a9",
      "source": "ig_comment",
      "platform": "instagram",
      "conversation_type": "comment",
      "source_item_id": "17923456781234567",
      "source_account_id": "17841400000000000",
      "account_name": "cafe.delpuerto",
      "root_resource_id": "18012345678901234",
      "thread_id": "2b9f7c0e5d4a3b2c1d0e9f8a7b6c5d4e3f2a1b0c9d8e7f6a5b4c3d2e1f0a9b8c",
      "author": {
        "name": "lucia.mendez",
        "username": "lucia.mendez",
        "external_id": "17841455555555555"
      },
      "text": "¿Tienen opciones sin TACC en el menú de la semana?",
      "language": "es",
      "sentiment": "neutral",
      "is_spam": false,
      "state": "unread",
      "received_at": 1761999940000,
      "label_ids": [],
      "external_url": "https://www.instagram.com/p/DExample123/",
      "can_reply": true,
      "created_at": 1762000000000,
      "updated_at": 1762000000000
    },
    "actor": {
      "uid": "system:inbox-sync",
      "name": "MB Suite",
      "kind": "system"
    }
  }
}
social_inbox.reply.sent

A reply from the Social Inbox went out on the network

The network accepted a reply to an inbox item: written by a person (screen, API or MCP), by a rule with a saved reply, or by an AI Community Manager. item is the item as it was when the reply went out; reply carries the text, the channel (public, or private: a comment answered by direct message), sent_at, the network's id for it, automated (true for rules and AI, also for a reply sent with an API key marked as an AI agent's, whose actor comes with kind ai) and rule_id when a rule answered. Replies written natively on the network are not emitted. The attachments MB Suite keeps come as links signed for one hour from the moment the event was built (url_expires_at); a delivery retried later may carry an expired link: get the item (social_inbox.items.get) for a fresh one.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "social_inbox.reply.sent",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "item": {
      "id": "8f4c2a91d0b7e6f35a1c9e2d4b7a8f60c3e1d2b5a4f9c8e7d6b5a4c3e2f1d0a9",
      "source": "ig_comment",
      "platform": "instagram",
      "conversation_type": "comment",
      "source_item_id": "17923456781234567",
      "source_account_id": "17841400000000000",
      "account_name": "cafe.delpuerto",
      "root_resource_id": "18012345678901234",
      "thread_id": "2b9f7c0e5d4a3b2c1d0e9f8a7b6c5d4e3f2a1b0c9d8e7f6a5b4c3d2e1f0a9b8c",
      "author": {
        "name": "lucia.mendez",
        "username": "lucia.mendez",
        "external_id": "17841455555555555"
      },
      "text": "¿Tienen opciones sin TACC en el menú de la semana?",
      "language": "es",
      "sentiment": "neutral",
      "is_spam": false,
      "state": "unread",
      "received_at": 1761999940000,
      "label_ids": [],
      "external_url": "https://www.instagram.com/p/DExample123/",
      "can_reply": true,
      "created_at": 1762000000000,
      "updated_at": 1762000000000
    },
    "reply": {
      "text": "¡Hola Lucía! Sí: todos los días hay dos platos sin TACC. Te esperamos 🙌",
      "channel": "public",
      "sent_at": 1762000000000,
      "external_reply_id": "17999999999999999",
      "automated": false,
      "rule_id": null
    },
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
social_inbox.item.escalated

The AI team handed an inbox item to a person

An AI Community Manager did not answer and left the item in Needs attention for a person. reason says why: complaint (negative sentiment, with the Sentiment Analyst on; since 2026-10-12, in a private message, asking to talk to a person with no specific complaint does not count), ai_signal (the AI found a configured escalation: prices, personal data, an unknown language; or, in a private message, the person asked to talk to someone and there is no contact channel loaded, or the request came with a complaint the Analyst missed), ai_reply_cap (too many AI replies in the same private conversation within 24 hours) or, since 2026-10-17, ai_no_answer (in a private message, the AI returned an empty response twice and the conversation goes to a person instead of staying unanswered). The attachments MB Suite keeps come as links signed for one hour from the moment the event was built (url_expires_at); a delivery retried later may carry an expired link: get the item (social_inbox.items.get) for a fresh one.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "social_inbox.item.escalated",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "item": {
      "id": "8f4c2a91d0b7e6f35a1c9e2d4b7a8f60c3e1d2b5a4f9c8e7d6b5a4c3e2f1d0a9",
      "source": "ig_comment",
      "platform": "instagram",
      "conversation_type": "comment",
      "source_item_id": "17923456781234567",
      "source_account_id": "17841400000000000",
      "account_name": "cafe.delpuerto",
      "root_resource_id": "18012345678901234",
      "thread_id": "2b9f7c0e5d4a3b2c1d0e9f8a7b6c5d4e3f2a1b0c9d8e7f6a5b4c3d2e1f0a9b8c",
      "author": {
        "name": "lucia.mendez",
        "username": "lucia.mendez",
        "external_id": "17841455555555555"
      },
      "text": "¿Tienen opciones sin TACC en el menú de la semana?",
      "language": "es",
      "sentiment": "negative",
      "is_spam": false,
      "state": "needs_attention",
      "received_at": 1761999940000,
      "label_ids": [],
      "external_url": "https://www.instagram.com/p/DExample123/",
      "can_reply": true,
      "created_at": 1762000000000,
      "updated_at": 1762000000000
    },
    "reason": "complaint",
    "actor": {
      "uid": "system:inbox-auto",
      "name": "Automatización Social Inbox",
      "kind": "system"
    }
  }
}
social_inbox.item.resolved

An inbox item was marked as resolved

A person marked an inbox item as resolved, from the screen (one item or «mark all as resolved» on a post), the API or the MCP. Emitted only when the item was not resolved already; reopening it does not emit. The attachments MB Suite keeps come as links signed for one hour from the moment the event was built (url_expires_at); a delivery retried later may carry an expired link: get the item (social_inbox.items.get) for a fresh one.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "social_inbox.item.resolved",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "item": {
      "id": "8f4c2a91d0b7e6f35a1c9e2d4b7a8f60c3e1d2b5a4f9c8e7d6b5a4c3e2f1d0a9",
      "source": "ig_comment",
      "platform": "instagram",
      "conversation_type": "comment",
      "source_item_id": "17923456781234567",
      "source_account_id": "17841400000000000",
      "account_name": "cafe.delpuerto",
      "root_resource_id": "18012345678901234",
      "thread_id": "2b9f7c0e5d4a3b2c1d0e9f8a7b6c5d4e3f2a1b0c9d8e7f6a5b4c3d2e1f0a9b8c",
      "author": {
        "name": "lucia.mendez",
        "username": "lucia.mendez",
        "external_id": "17841455555555555"
      },
      "text": "¿Tienen opciones sin TACC en el menú de la semana?",
      "language": "es",
      "sentiment": "neutral",
      "is_spam": false,
      "state": "resolved",
      "received_at": 1761999940000,
      "label_ids": [],
      "external_url": "https://www.instagram.com/p/DExample123/",
      "can_reply": true,
      "created_at": 1762000000000,
      "updated_at": 1762000000000
    },
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}

Social Planner

social_planner.post.created

A post was created in the Social Planner

A new post was created in the Social Planner: from the composer, a content plan (MIA or an import), a duplicate, the API, or a push from Content Studio. It carries the post as it was saved (status, networks, format, text, media, scheduled date). Posts synced from the networks do not emit it.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "social_planner.post.created",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "post": {
      "id": "sp_4Qm9xT2bK7",
      "origin": "mb_suite",
      "status": "draft",
      "format": "carousel",
      "platforms": [
        "instagram",
        "facebook"
      ],
      "master_content": "Tres errores que frenan tu campaña de fin de año (y cómo evitarlos) 👇",
      "master_media": [
        {
          "id": "md_1",
          "url": "https://mb-suite.com/api/v1/storage/resolve?key=organizations/org_1/media/carrusel-1.png",
          "type": "image"
        }
      ],
      "scheduled_date": 1762172800000,
      "timezone": "America/Argentina/Buenos_Aires",
      "label_ids": [
        "lb_campana_q4"
      ],
      "tags": [],
      "publish_mode": "manual",
      "created_by": "u_7KpQ2",
      "created_at": 1762000000000,
      "updated_at": 1762000000000
    },
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
social_planner.post.scheduled

A post was scheduled to be published

A post was queued to be published on its networks at scheduled_at (one publish job per network, or per location for Google Business Profile). Rescheduling to another time emits it again. The publication itself arrives later as social_planner.post.published, social_planner.post.partially_published or social_planner.post.failed.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "social_planner.post.scheduled",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "post": {
      "id": "sp_4Qm9xT2bK7",
      "origin": "mb_suite",
      "status": "scheduled",
      "format": "carousel",
      "platforms": [
        "instagram",
        "facebook"
      ],
      "master_content": "Tres errores que frenan tu campaña de fin de año (y cómo evitarlos) 👇",
      "master_media": [
        {
          "id": "md_1",
          "url": "https://mb-suite.com/api/v1/storage/resolve?key=organizations/org_1/media/carrusel-1.png",
          "type": "image"
        }
      ],
      "scheduled_date": 1762172800000,
      "timezone": "America/Argentina/Buenos_Aires",
      "label_ids": [
        "lb_campana_q4"
      ],
      "tags": [],
      "publish_mode": "scheduled",
      "created_by": "u_7KpQ2",
      "created_at": 1762000000000,
      "updated_at": 1762000000000
    },
    "scheduled_at": 1762172800000,
    "platforms": [
      "instagram",
      "facebook"
    ],
    "job_count": 2,
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
social_planner.post.published

A post was published on all its networks

Every network of the post published it (a story with several frames counts when all frames are up). Emitted once per outcome by the publishing pipeline, whether the post went out now or at its scheduled time; external_url is the permalink when the network gives one.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "social_planner.post.published",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "post": {
      "id": "sp_4Qm9xT2bK7",
      "origin": "mb_suite",
      "status": "published",
      "format": "carousel",
      "platforms": [
        "instagram",
        "facebook"
      ],
      "master_content": "Tres errores que frenan tu campaña de fin de año (y cómo evitarlos) 👇",
      "master_media": [
        {
          "id": "md_1",
          "url": "https://mb-suite.com/api/v1/storage/resolve?key=organizations/org_1/media/carrusel-1.png",
          "type": "image"
        }
      ],
      "scheduled_date": 1762172800000,
      "timezone": "America/Argentina/Buenos_Aires",
      "label_ids": [
        "lb_campana_q4"
      ],
      "tags": [],
      "publish_mode": "scheduled",
      "created_by": "u_7KpQ2",
      "created_at": 1762000000000,
      "updated_at": 1762000000000,
      "published_at": 1762172800000,
      "published_platforms": [
        "instagram",
        "facebook"
      ],
      "external_url": "https://www.instagram.com/p/DExample123/"
    },
    "published_platforms": [
      "instagram",
      "facebook"
    ],
    "actor": {
      "uid": "system:social-publish",
      "name": "MB Suite",
      "kind": "system"
    }
  }
}
social_planner.post.partially_published

A post was published on some networks and failed on others

The post went out on at least one network and failed on another (or a story sequence stopped halfway). reason is the dominant classified cause (credentials_expired, permissions_missing, account_restricted, media_invalid, content_invalid, rate_limited, platform_error, polling_timeout, unknown) and by_platform the cause per failed network. The post can be retried from the planner or with social_planner.posts.retry.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "social_planner.post.partially_published",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "post": {
      "id": "sp_4Qm9xT2bK7",
      "origin": "mb_suite",
      "status": "partially_published",
      "format": "carousel",
      "platforms": [
        "instagram",
        "facebook"
      ],
      "master_content": "Tres errores que frenan tu campaña de fin de año (y cómo evitarlos) 👇",
      "master_media": [
        {
          "id": "md_1",
          "url": "https://mb-suite.com/api/v1/storage/resolve?key=organizations/org_1/media/carrusel-1.png",
          "type": "image"
        }
      ],
      "scheduled_date": 1762172800000,
      "timezone": "America/Argentina/Buenos_Aires",
      "label_ids": [
        "lb_campana_q4"
      ],
      "tags": [],
      "publish_mode": "scheduled",
      "created_by": "u_7KpQ2",
      "created_at": 1762000000000,
      "updated_at": 1762000000000,
      "published_platforms": [
        "facebook"
      ],
      "failed_platforms": [
        "instagram"
      ]
    },
    "published_platforms": [
      "facebook"
    ],
    "failed_platforms": [
      "instagram"
    ],
    "reason": "credentials_expired",
    "by_platform": [
      {
        "platform": "instagram",
        "reason": "credentials_expired"
      }
    ],
    "actor": {
      "uid": "system:social-publish",
      "name": "MB Suite",
      "kind": "system"
    }
  }
}
social_planner.post.failed

A post could not be published on any network

Publishing failed on every network after the automatic retries (or the network kept processing past the time limit: reason polling_timeout). reason is the dominant classified cause and by_platform the cause per network. A post deleted while publishing does not emit it.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "social_planner.post.failed",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "post": {
      "id": "sp_4Qm9xT2bK7",
      "origin": "mb_suite",
      "status": "failed",
      "format": "carousel",
      "platforms": [
        "instagram",
        "facebook"
      ],
      "master_content": "Tres errores que frenan tu campaña de fin de año (y cómo evitarlos) 👇",
      "master_media": [
        {
          "id": "md_1",
          "url": "https://mb-suite.com/api/v1/storage/resolve?key=organizations/org_1/media/carrusel-1.png",
          "type": "image"
        }
      ],
      "scheduled_date": 1762172800000,
      "timezone": "America/Argentina/Buenos_Aires",
      "label_ids": [
        "lb_campana_q4"
      ],
      "tags": [],
      "publish_mode": "scheduled",
      "created_by": "u_7KpQ2",
      "created_at": 1762000000000,
      "updated_at": 1762000000000,
      "failed_platforms": [
        "instagram",
        "facebook"
      ]
    },
    "failed_platforms": [
      "instagram",
      "facebook"
    ],
    "reason": "media_invalid",
    "by_platform": [
      {
        "platform": "instagram",
        "reason": "media_invalid"
      },
      {
        "platform": "facebook",
        "reason": "media_invalid"
      }
    ],
    "actor": {
      "uid": "system:social-publish",
      "name": "MB Suite",
      "kind": "system"
    }
  }
}

Content Studio

social_content_studio.series.generated

A Content Studio series finished generating

A generation run of a Content Studio social series ended with at least one post generated: status review (every post ready to review and approve) or partial (some posts failed; failed_count says how many). A generated post can still come without copy: when there were no AI credits left to write it, or the AI could not write it, its image is done, it counts as generated and its copies_error says why (social_content_studio.series.get). Emitted once per run, whether it ran directly or through the background batch; when a direct run leaves posts failed for capacity reasons they are retried in the background and that run emits again when it settles. Read the plan and the posts with social_content_studio.series.get. requested_by is the user who started the generation.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "social_content_studio.series.generated",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "series": {
      "id": "cs_8Fh2LmQ0",
      "name": "Lanzamiento colección otoño",
      "status": "review",
      "topic": "Tres looks de la nueva colección para la oficina",
      "platforms": [
        "instagram",
        "facebook"
      ],
      "post_count": 5,
      "art_mode": "ai",
      "created_via": "wizard",
      "created_by": "u_7KpQ2",
      "created_at": 1761999400000,
      "updated_at": 1762000000000
    },
    "generated_count": 5,
    "failed_count": 0,
    "generation_mode": "sync",
    "requested_by": "u_7KpQ2",
    "actor": {
      "uid": "system:content-studio",
      "name": "MB Suite",
      "kind": "system"
    }
  }
}
social_content_studio.series.generation_failed

A Content Studio series generation produced nothing

A generation run of a Content Studio social series ended without generating any post (status failed, or partial when the series kept posts from an earlier run and the background batch failed entirely). Image credits of what was not generated are refunded; the user can retry from the series. A run that never started (no credits left when queuing) does not emit it.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "social_content_studio.series.generation_failed",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "series": {
      "id": "cs_8Fh2LmQ0",
      "name": "Lanzamiento colección otoño",
      "status": "failed",
      "topic": "Tres looks de la nueva colección para la oficina",
      "platforms": [
        "instagram",
        "facebook"
      ],
      "post_count": 5,
      "art_mode": "ai",
      "created_via": "wizard",
      "created_by": "u_7KpQ2",
      "created_at": 1761999400000,
      "updated_at": 1762000000000
    },
    "generated_count": 0,
    "failed_count": 5,
    "generation_mode": "batch",
    "requested_by": "u_7KpQ2",
    "actor": {
      "uid": "system:content-studio",
      "name": "MB Suite",
      "kind": "system"
    }
  }
}
social_content_studio.photo_session.completed

A photo session finished generating

A product photo session finished generating with at least one image: status completed (every image came out) or partial (failed_image_count did not; their credits are refunded). The images are already in the session (social_content_studio.photo_sessions.get) and in the organization's Media Library, in the session's folder. Emitted once per run.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "social_content_studio.photo_session.completed",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "photo_session": {
      "id": "ps_3Rk9VbW1",
      "name": "Zapatillas — estudio",
      "status": "completed",
      "session_type": "studio",
      "mode": "multi",
      "formats": [
        "feed",
        "story"
      ],
      "product_count": 3,
      "created_by": "u_7KpQ2",
      "created_at": 1761999100000,
      "updated_at": 1762000000000
    },
    "image_count": 6,
    "failed_image_count": 0,
    "generation_mode": "batch",
    "requested_by": "u_7KpQ2",
    "actor": {
      "uid": "system:content-studio",
      "name": "MB Suite",
      "kind": "system"
    }
  }
}
social_content_studio.photo_session.failed

A photo session generation produced no images

A photo session generation ended without any image: the session goes back to draft so it can be generated again, and its credits are refunded (or never charged). A run that never started (no credits or no storage quota when queuing) does not emit it.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "social_content_studio.photo_session.failed",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "photo_session": {
      "id": "ps_3Rk9VbW1",
      "name": "Zapatillas — estudio",
      "status": "draft",
      "session_type": "studio",
      "mode": "multi",
      "formats": [
        "feed",
        "story"
      ],
      "product_count": 3,
      "created_by": "u_7KpQ2",
      "created_at": 1761999100000,
      "updated_at": 1762000000000
    },
    "image_count": 0,
    "failed_image_count": 6,
    "generation_mode": "batch",
    "requested_by": "u_7KpQ2",
    "actor": {
      "uid": "system:content-studio",
      "name": "MB Suite",
      "kind": "system"
    }
  }
}

Brand Voice

social_brand_voice.profile.updated

The brand voice changed

Fires when the organization's Brand Voice changes: saved from the screen, updated through the API or the MCP, or reset (then profile is null and reset is true). Carries the whole profile as it was saved (tones, vocabulary, format, audience, per-network adjustments and ai_summary) and changed_fields with the public names of the fields that changed. Saving the same values does not fire it, and neither does restoring a reset profile from the trash.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "social_brand_voice.profile.updated",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "profile": {
      "tones": [
        "friendly",
        "educational"
      ],
      "custom_tone_note": "Cercana y clara, como una nutricionista que explica sin tecnicismos.",
      "communication_style": "conversational",
      "preferred_words": [
        "bienestar",
        "hábitos",
        "paso a paso"
      ],
      "avoided_words": [
        "dieta milagro",
        "detox"
      ],
      "jargon_level": "avoid",
      "emoji_usage": "minimal",
      "hashtag_usage": "per_platform",
      "post_structure": "Pregunta que engancha → dato útil → llamado a la acción",
      "audience_persona": "Mujeres de 28 a 45 años que trabajan y quieren comer mejor sin complicarse.",
      "platform_adjustments": {
        "instagram": {
          "tone_note": "Más visual, con emojis puntuales.",
          "max_caption_length": 2200,
          "include_hashtags": true
        },
        "linkedin": {
          "tone_note": "Más profesional, con datos y fuentes.",
          "max_caption_length": 3000,
          "include_hashtags": false
        }
      },
      "ai_summary": "Una voz cercana y educativa que explica la nutrición sin tecnicismos, con pocos emojis y hashtags pensados para cada red. Habla a mujeres que trabajan y quieren comer mejor sin complicarse.",
      "updated_at": 1762000000000,
      "updated_by": "u_7KpQ2"
    },
    "changed_fields": [
      "tones",
      "preferred_words"
    ],
    "reset": false,
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
social_brand_voice.document.processed

A brand voice document finished processing

Fires when MB Suite finishes processing a document uploaded to Brand Voice: its text was extracted and indexed for the AI (status ready; embedding_status says whether the indexing worked and chunk_count how many fragments it has) or the extraction failed (status error, with error_message). Without AI credits for a step, error_message or embedding_error carries the code ai_credits_exhausted, ai_personal_limit or payment_required. It fires again after each retry. It carries no text, URL or storage path (read the text with social_brand_voice.documents.get). The organization profile's general context documents do not fire it.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "social_brand_voice.document.processed",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "document": {
      "id": "Hk3pQ9vXr2LmT8sWz1yB",
      "file_name": "Manual de marca 2026.pdf",
      "mime_type": "application/pdf",
      "size_bytes": 2456789,
      "status": "ready",
      "embedding_status": "ready",
      "chunk_count": 24,
      "uploaded_by": "u_7KpQ2",
      "uploaded_at": 1761999880000,
      "updated_at": 1762000000000
    },
    "actor": {
      "uid": "system:brand-voice",
      "name": "Brand Voice",
      "kind": "system"
    }
  }
}

Competitors

social_competitors.competitor.created

A competitor started being tracked

Fires when a competitor is added (from the screen, the API, the MCP or an agent): its name, color, order and the tracked profiles per platform (Instagram username, Facebook page, YouTube channel). Its first metrics arrive afterwards, each as social_competitors.snapshot.created. A competitor restored from the trash does not fire it.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "social_competitors.competitor.created",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "competitor": {
      "id": "Qm7XoR2vT9sLp4KcZa1W",
      "name": "Clínica Sur",
      "order": 2,
      "color": "#8b5cf6",
      "profiles": {
        "instagram": {
          "username": "clinicasur"
        },
        "facebook": {
          "page_id": "104523987612345",
          "page_name": "Clínica Sur"
        },
        "youtube": {
          "channel_id": "UCq3Xb9vYH2mR8kT1aLw0pZg",
          "handle": "clinicasur",
          "channel_title": "Clínica Sur",
          "thumbnail_url": "https://yt3.ggpht.com/ytc/clinicasur=s240"
        }
      },
      "profile_meta": {
        "instagram": {
          "display_name": "Clínica Sur",
          "external_url": "https://www.instagram.com/clinicasur/",
          "website": "https://clinicasur.com"
        }
      },
      "last_fetched_at": 1761996400000,
      "last_fetch_error": null,
      "created_at": 1759408000000,
      "updated_at": 1762000000000,
      "created_by": "u_7KpQ2"
    },
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
social_competitors.competitor.updated

A competitor's name or profiles changed

Fires when someone renames a competitor or changes its tracked profiles. Carries the competitor as it is now and changes (which settings were sent: name, profiles). The automatic data refreshes do not fire it (they fire social_competitors.snapshot.created).

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "social_competitors.competitor.updated",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "competitor": {
      "id": "Qm7XoR2vT9sLp4KcZa1W",
      "name": "Clínica Sur · sede Centro",
      "order": 2,
      "color": "#8b5cf6",
      "profiles": {
        "instagram": {
          "username": "clinicasur"
        },
        "facebook": {
          "page_id": "104523987612345",
          "page_name": "Clínica Sur"
        },
        "youtube": {
          "channel_id": "UCq3Xb9vYH2mR8kT1aLw0pZg",
          "handle": "clinicasur",
          "channel_title": "Clínica Sur",
          "thumbnail_url": "https://yt3.ggpht.com/ytc/clinicasur=s240"
        }
      },
      "profile_meta": {
        "instagram": {
          "display_name": "Clínica Sur",
          "external_url": "https://www.instagram.com/clinicasur/",
          "website": "https://clinicasur.com"
        }
      },
      "last_fetched_at": 1761996400000,
      "last_fetch_error": null,
      "created_at": 1759408000000,
      "updated_at": 1762000000000,
      "created_by": "u_7KpQ2"
    },
    "changes": [
      "name"
    ],
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
social_competitors.competitor.deleted

A competitor was deleted with its history

Fires when a competitor is deleted together with its history: its metrics per day (snapshots_deleted) and its collected posts (posts_deleted). Carries the competitor as it was. The competitor and its most recent history stay 30 days in the trash and can be restored by owners and admins.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "social_competitors.competitor.deleted",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "competitor": {
      "id": "Qm7XoR2vT9sLp4KcZa1W",
      "name": "Clínica Sur",
      "order": 2,
      "color": "#8b5cf6",
      "profiles": {
        "instagram": {
          "username": "clinicasur"
        },
        "facebook": {
          "page_id": "104523987612345",
          "page_name": "Clínica Sur"
        },
        "youtube": {
          "channel_id": "UCq3Xb9vYH2mR8kT1aLw0pZg",
          "handle": "clinicasur",
          "channel_title": "Clínica Sur",
          "thumbnail_url": "https://yt3.ggpht.com/ytc/clinicasur=s240"
        }
      },
      "profile_meta": {
        "instagram": {
          "display_name": "Clínica Sur",
          "external_url": "https://www.instagram.com/clinicasur/",
          "website": "https://clinicasur.com"
        }
      },
      "last_fetched_at": 1761996400000,
      "last_fetch_error": null,
      "created_at": 1759408000000,
      "updated_at": 1762000000000,
      "created_by": "u_7KpQ2"
    },
    "snapshots_deleted": 84,
    "posts_deleted": 36,
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
social_competitors.snapshot.created

New metrics were collected for a competitor or for your own brand

Fires once per platform every time a competitor's public data (or the organization's own brand, competitor.is_self true and id __self__) is read from Meta (Instagram Business Discovery, Facebook Pages) or the YouTube Data API: from the weekly automatic refresh (a daily pass that reads each competitor about once a week, actor kind system), social_competitors.competitors.refresh, or right after a competitor is added or its profiles change. Carries the metrics of that reading: followers, average likes, comments and views of recent posts, engagement rate, posting cadence, share of reels/shorts and format mix. A platform that failed does not fire it.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "social_competitors.snapshot.created",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "competitor": {
      "id": "Qm7XoR2vT9sLp4KcZa1W",
      "name": "Clínica Sur",
      "is_self": false
    },
    "snapshot": {
      "id": "s8KfP2qLm4WvX7tR9aZc",
      "competitor_id": "Qm7XoR2vT9sLp4KcZa1W",
      "date": "2026-10-27",
      "platform": "instagram",
      "source": "api",
      "metrics": {
        "followers": 48210,
        "follows_count": 312,
        "total_posts": 1184,
        "avg_likes": 412,
        "avg_comments": 23,
        "engagement_rate": 0.009,
        "posts_per_week": 4.5,
        "reels_share": 0.42,
        "format_mix": {
          "reels": 5,
          "carousel": 4,
          "image": 3,
          "video": 0
        }
      },
      "fetched_at": 1762000000000
    },
    "actor": {
      "uid": "system:social-competitor-fetch",
      "name": "Weekly competitor refresh",
      "kind": "system"
    }
  }
}

Media Planner

media_planner.campaign.changed

A row of a media plan changed

Fires once per row (campaign, platform row or account row) when it is created, updated, deleted or imported, from the Media Planner screen, the API, the MCP, MIA or a carryover. change says which; changes lists each tracked field with its value before and after (name, budget, status, start_date, end_date, platform, currency, label_ids, mapped_campaign, auto_budget_enabled, carryover; amounts are in the row currency, dates in ms). source says who made it: user, ai, autobudget, carryover or system. Reordering rows and the cost sync do not fire it (see media_planner.costs.synced).

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "media_planner.campaign.changed",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "plan": {
      "id": "mp_8Kq2LmZpV0bT7xL1aR9c",
      "name": "Plan Octubre 2026"
    },
    "campaign": {
      "id": "cmp_3bTz8QpL2mV9xW1aKe7d",
      "name": "Google Search - Brand",
      "row_kind": "campaign",
      "platform": "google_ads",
      "budget": 4500,
      "currency": "USD",
      "status": "active",
      "start_date": 1790812800000,
      "end_date": 1793491199999,
      "label_ids": [
        "lbl_always_on"
      ],
      "mapped_campaign_id": "21345678901",
      "external_customer_id": "123-456-7890"
    },
    "change": "updated",
    "source": "user",
    "changes": [
      {
        "field": "budget",
        "before": 4000,
        "after": 4500
      },
      {
        "field": "status",
        "before": "scheduled",
        "after": "active"
      }
    ],
    "bulk": false,
    "source_plan_name": null,
    "history_entry_id": "chg_9Wd4KpQ2mZ7xV1bN3sLe",
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
media_planner.costs.synced

A media plan's spend was synced

Fires after the spend of a media plan is read from the ad platforms and stored: from the Sync costs button, the cross-account view, the API, the MCP or the scheduled automation (trigger automation, with a system actor). synced_rows rows got their spend; errors lists what a platform refused (the previous values of that platform are kept). total_spent is the plan's spend in its currency (null when it has spend in another currency too); the totals by currency are in spent_by_currency; account_total_spend is the spend of the connected accounts per platform.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "media_planner.costs.synced",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "plan": {
      "id": "mp_8Kq2LmZpV0bT7xL1aR9c",
      "name": "Plan Octubre 2026",
      "mode": "campaigns",
      "currency": "USD"
    },
    "trigger": "manual",
    "synced_rows": 6,
    "error_count": 0,
    "errors": [],
    "total_spent": 11480.5,
    "spent_by_currency": {
      "USD": 11480.5
    },
    "account_total_spend": {
      "google_ads": 8200.25,
      "meta_ads": 3600
    },
    "synced_at": 1762000000000,
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
media_planner.plan.archived

A media plan was archived

Fires when a media plan is archived through the API, the MCP, MIA or the cross-account view: plan is the plan as archived and transitions how many campaigns changed status (scheduled to cancelled, active and paused to completed). Archiving from the plan's own screen and the scheduled auto-archive do not fire it yet.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "media_planner.plan.archived",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "plan": {
      "id": "mp_8Kq2LmZpV0bT7xL1aR9c",
      "name": "Plan Octubre 2026",
      "status": "archived",
      "mode": "campaigns",
      "start_date": 1790812800000,
      "end_date": 1793491199999,
      "currency": "USD",
      "total_budget": 12000,
      "budget_by_currency": {
        "USD": 12000
      },
      "total_spent": 11480.5,
      "spent_by_currency": {
        "USD": 11480.5
      },
      "carryover_enabled": true,
      "updated_at": 1762000000000
    },
    "transitions": [
      {
        "from": "active",
        "to": "completed",
        "count": 5
      },
      {
        "from": "scheduled",
        "to": "cancelled",
        "count": 1
      }
    ],
    "campaign_count": 7,
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
media_planner.plan.shared

A media plan was emailed

Fires when a media plan is sent by email (from the app, the API, the MCP or MIA): the share id, format (html, or pdf with the plan attached), subject, how many recipients and the From address. The recipients' addresses are not in the webhook: read them with media_planner.shares.list.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "media_planner.plan.shared",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "plan": {
      "id": "mp_8Kq2LmZpV0bT7xL1aR9c",
      "name": "Plan Octubre 2026"
    },
    "share": {
      "id": "shr_5Hq2LmZpV0bT7xL1aR9c",
      "format": "pdf",
      "subject": "Plan de medios — Octubre 2026",
      "recipient_count": 3,
      "sender_email": "valentina@agencia.com",
      "sent_at": 1762000000000
    },
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
media_planner.carryover.applied

A carryover was applied to a media plan

Fires when the unspent balance of a finished plan (mode from_plan, with source_plan) or a balance entered by hand (mode manual, with source_note) is added to the budget of rows of a plan. allocations says how much each row received (negative subtracts); each row also fires media_planner.campaign.changed with source carryover.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "media_planner.carryover.applied",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "plan": {
      "id": "mp_2Np7RtYvB4cX8zQ1wE6f",
      "name": "Plan Noviembre 2026"
    },
    "mode": "from_plan",
    "source_plan": {
      "id": "mp_8Kq2LmZpV0bT7xL1aR9c",
      "name": "Plan Octubre 2026"
    },
    "source_note": null,
    "total_amount": 519.5,
    "applied_amount": 500,
    "allocations": [
      {
        "campaign_id": "cmp_7Gh2KpQ9mZ1xV4bN8sLe",
        "amount": 300
      },
      {
        "campaign_id": "cmp_4Rt8LmZpV0bT2xL6aR1c",
        "amount": 200
      }
    ],
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}

AI Strategies

strategy_generator.generation.completed

An AI paid media strategy finished generating

The AI finished generating a paid media strategy (status completed): a new one created from a briefing, or an existing one regenerated (regenerated=true; its edited projections were reset to the new AI values). The event carries the summary (objective, platforms, budget range, number of campaigns); read the full plan, the recommended channel mix and the briefing with strategy_generator.strategies.get. requested_by is the person who started the generation; ai_model, the model that produced it.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "strategy_generator.generation.completed",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "strategy": {
      "id": "Xq7RbT2mWc9LpZ4nVd1e",
      "name": "Lanzamiento colección otoño",
      "status": "completed",
      "objective": "sales",
      "platforms": [
        "google_ads",
        "meta_ads"
      ],
      "currency": "USD",
      "min_budget": 3000,
      "max_budget": 4500,
      "campaign_count": 5,
      "label_ids": [],
      "created_by": "u_7KpQ2",
      "created_at": 1761999880000,
      "updated_at": 1762000000000
    },
    "regenerated": false,
    "ai_model": "gemini-3.8-flash",
    "requested_by": "u_7KpQ2",
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
strategy_generator.generation.failed

An AI paid media strategy generation failed

A generation run of a paid media strategy ended without a usable plan (every AI model failed, or the answer came back incomplete). A first generation from the app leaves the strategy in status error with its briefing, ready to retry (from anywhere else a failed creation keeps nothing and emits no event); a failed regeneration leaves the strategy as it was (status completed with its previous plan). error.code is ai_generation_failed (every model failed or the answer came back incomplete) or internal_error. Credits are only charged for successful runs.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "strategy_generator.generation.failed",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "strategy": {
      "id": "Xq7RbT2mWc9LpZ4nVd1e",
      "name": "Lanzamiento colección otoño",
      "status": "error",
      "objective": "sales",
      "platforms": [
        "google_ads",
        "meta_ads"
      ],
      "currency": "USD",
      "min_budget": null,
      "max_budget": null,
      "campaign_count": 0,
      "label_ids": [],
      "created_by": "u_7KpQ2",
      "created_at": 1761999880000,
      "updated_at": 1762000000000
    },
    "regenerated": false,
    "error": {
      "code": "ai_generation_failed",
      "message": "Every AI model failed to produce the strategy. Retry in a few minutes."
    },
    "requested_by": "u_7KpQ2",
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
strategy_generator.strategy.deleted

An AI paid media strategy was deleted

A paid media strategy was deleted, from the app or through the API. It stays 30 days in the organization's trash, where an owner or admin can restore it with the same id. The event carries the summary of what was deleted.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "strategy_generator.strategy.deleted",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "strategy": {
      "id": "Xq7RbT2mWc9LpZ4nVd1e",
      "name": "Lanzamiento colección otoño",
      "status": "completed",
      "objective": "sales",
      "platforms": [
        "google_ads",
        "meta_ads"
      ],
      "currency": "USD",
      "min_budget": 3000,
      "max_budget": 4500,
      "campaign_count": 5,
      "label_ids": [],
      "created_by": "u_7KpQ2",
      "created_at": 1761999880000,
      "updated_at": 1762000000000
    },
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}

Ad Creator

ad_creator.copy.generated

Ad copies were generated

The Ad Creator generated a set of ad copies with AI (from the app, the API, the MCP or MIA): copy carries the brief (product description, platforms, tone) and every variant per platform (Google Search headlines and descriptions; primary text, headline and description for Meta, LinkedIn and TikTok). It fires once per generation, after the credit was charged and the copies were saved.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "ad_creator.copy.generated",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "copy": {
      "id": "Vq3mXp9LkT2bN7cR1sYd",
      "name": "Plan Pyme de contabilidad online",
      "product_description": "Contabilidad online para pymes: facturación electrónica, conciliación bancaria y reportes en un solo lugar.",
      "platforms": [
        "google_search",
        "meta_ads"
      ],
      "tone": "professional",
      "variant_count": 1,
      "key_benefits": "Ahorra 10 horas por mes; soporte en español",
      "cta_direction": "Probar gratis 14 días",
      "variants": [
        {
          "id": "variant_0",
          "platform": "google_search",
          "variant_index": 0,
          "variant": {
            "headlines": [
              "Contabilidad Online Pyme",
              "Factura en Minutos",
              "Prueba Gratis 14 Días"
            ],
            "descriptions": [
              "Facturación, conciliación y reportes en un solo lugar. Empieza hoy sin tarjeta."
            ]
          }
        },
        {
          "id": "variant_1",
          "platform": "meta_ads",
          "variant_index": 0,
          "variant": {
            "primary_text": "¿Cierras el mes a mano? Factura, concilia y mira tus números en un solo lugar.",
            "headline": "Tu contabilidad, al día",
            "description": "Prueba gratis 14 días",
            "cta_suggestion": "Más información"
          }
        }
      ],
      "status": "completed",
      "total_credits_consumed": 1,
      "created_by": "u_7KpQ2",
      "created_at": 1762000000000,
      "updated_at": 1762000000000
    },
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
ad_creator.copy.deleted

Ad copies were deleted

A set of ad copies was deleted (from the app, the API, the MCP or MIA). copy is the set as it was before deletion, variants included. It stays 30 days in the trash, where an owner or admin can restore it; restoring does not emit a new event.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "ad_creator.copy.deleted",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "copy": {
      "id": "Vq3mXp9LkT2bN7cR1sYd",
      "name": "Plan Pyme de contabilidad online",
      "product_description": "Contabilidad online para pymes: facturación electrónica, conciliación bancaria y reportes en un solo lugar.",
      "platforms": [
        "google_search",
        "meta_ads"
      ],
      "tone": "professional",
      "variant_count": 1,
      "key_benefits": "Ahorra 10 horas por mes; soporte en español",
      "cta_direction": "Probar gratis 14 días",
      "variants": [
        {
          "id": "variant_0",
          "platform": "google_search",
          "variant_index": 0,
          "variant": {
            "headlines": [
              "Contabilidad Online Pyme",
              "Factura en Minutos",
              "Prueba Gratis 14 Días"
            ],
            "descriptions": [
              "Facturación, conciliación y reportes en un solo lugar. Empieza hoy sin tarjeta."
            ]
          }
        },
        {
          "id": "variant_1",
          "platform": "meta_ads",
          "variant_index": 0,
          "variant": {
            "primary_text": "¿Cierras el mes a mano? Factura, concilia y mira tus números en un solo lugar.",
            "headline": "Tu contabilidad, al día",
            "description": "Prueba gratis 14 días",
            "cta_suggestion": "Más información"
          }
        }
      ],
      "status": "completed",
      "total_credits_consumed": 1,
      "created_by": "u_7KpQ2",
      "created_at": 1762000000000,
      "updated_at": 1762000000000
    },
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}

SEO Planner

seo_planner.item.created

An SEO planner action was created

Fires when an action is added to the SEO Planner through the API, the MCP or MIA (source manual), from an action template (source action_template) or when a pack is applied, from the app too (source pack, one event per action created). Actions created from the planner screen or by SEO Ops do not fire it yet.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "seo_planner.item.created",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "item": {
      "id": "si_8Rk2PqLm4ZtV0bN7xC1d",
      "title": "Optimizar la ficha de producto «Zapatillas running»",
      "subtitle": "Title, meta description y H1 con la keyword principal",
      "type": "on_page_seo",
      "status": "pending",
      "description": "",
      "month_key": "2026-11",
      "scheduled_date": 1793534400000,
      "organization_id": "org_Cl1n1c4N0rt3",
      "sub_actions": [
        {
          "id": "sa_1762000000000_0_k3Zp",
          "title": "Auditar title tags",
          "completed": true,
          "order": 0
        },
        {
          "id": "sa_1762000000000_1_Qm8v",
          "title": "Reescribir meta description",
          "completed": false,
          "order": 1
        }
      ],
      "content_brief": {
        "keyword": "zapatillas running mujer"
      },
      "pack_id": null,
      "pack_source": null,
      "pack_item_id": null,
      "template_id": null,
      "template_source": null,
      "comment_count": 0,
      "created_by": {
        "user_id": "u_7KpQ2",
        "user_name": "Valentina Ríos"
      },
      "created_at": 1761913600000,
      "updated_at": 1762000000000
    },
    "source": "manual",
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
seo_planner.item.updated

An SEO planner action changed

Fires on edits to an action through the API, the MCP or MIA (one or many at once), including moving it to another month (month_key). changed_fields lists the public field names that changed. Moving an action to completed with an edit also fires seo_planner.item.completed; seo_planner.items.complete fires only seo_planner.item.completed. Edits from the planner screen do not fire it yet.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "seo_planner.item.updated",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "item": {
      "id": "si_8Rk2PqLm4ZtV0bN7xC1d",
      "title": "Optimizar la ficha de producto «Zapatillas running»",
      "subtitle": "Title, meta description y H1 con la keyword principal",
      "type": "on_page_seo",
      "status": "pending",
      "description": "",
      "month_key": "2026-12",
      "scheduled_date": 1796126400000,
      "organization_id": "org_Cl1n1c4N0rt3",
      "sub_actions": [
        {
          "id": "sa_1762000000000_0_k3Zp",
          "title": "Auditar title tags",
          "completed": true,
          "order": 0
        },
        {
          "id": "sa_1762000000000_1_Qm8v",
          "title": "Reescribir meta description",
          "completed": false,
          "order": 1
        }
      ],
      "content_brief": {
        "keyword": "zapatillas running mujer"
      },
      "pack_id": null,
      "pack_source": null,
      "pack_item_id": null,
      "template_id": null,
      "template_source": null,
      "comment_count": 0,
      "created_by": {
        "user_id": "u_7KpQ2",
        "user_name": "Valentina Ríos"
      },
      "created_at": 1761913600000,
      "updated_at": 1762000000000
    },
    "changed_fields": [
      "month_key",
      "scheduled_date"
    ],
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
seo_planner.item.completed

An SEO planner action was completed

Fires once when an action moves to the completed status through the API, the MCP or MIA (seo_planner.items.complete, an edit or a bulk edit). Completing from the planner screen does not fire it yet.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "seo_planner.item.completed",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "item": {
      "id": "si_8Rk2PqLm4ZtV0bN7xC1d",
      "title": "Optimizar la ficha de producto «Zapatillas running»",
      "subtitle": "Title, meta description y H1 con la keyword principal",
      "type": "on_page_seo",
      "status": "completed",
      "description": "",
      "month_key": "2026-11",
      "scheduled_date": 1793534400000,
      "organization_id": "org_Cl1n1c4N0rt3",
      "sub_actions": [
        {
          "id": "sa_1762000000000_0_k3Zp",
          "title": "Auditar title tags",
          "completed": true,
          "order": 0
        },
        {
          "id": "sa_1762000000000_1_Qm8v",
          "title": "Reescribir meta description",
          "completed": false,
          "order": 1
        }
      ],
      "content_brief": {
        "keyword": "zapatillas running mujer"
      },
      "pack_id": null,
      "pack_source": null,
      "pack_item_id": null,
      "template_id": null,
      "template_source": null,
      "comment_count": 0,
      "created_by": {
        "user_id": "u_7KpQ2",
        "user_name": "Valentina Ríos"
      },
      "created_at": 1761913600000,
      "updated_at": 1762000000000
    },
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
seo_planner.item.deleted

An SEO planner action was deleted

Fires when an action is deleted through the API, the MCP or MIA (one or in bulk, once per action); item is the last copy before deletion, which stays 30 days in the trash. Deleting from the planner screen does not fire it yet.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "seo_planner.item.deleted",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "item": {
      "id": "si_8Rk2PqLm4ZtV0bN7xC1d",
      "title": "Optimizar la ficha de producto «Zapatillas running»",
      "subtitle": "Title, meta description y H1 con la keyword principal",
      "type": "on_page_seo",
      "status": "pending",
      "description": "",
      "month_key": "2026-11",
      "scheduled_date": 1793534400000,
      "organization_id": "org_Cl1n1c4N0rt3",
      "sub_actions": [
        {
          "id": "sa_1762000000000_0_k3Zp",
          "title": "Auditar title tags",
          "completed": true,
          "order": 0
        },
        {
          "id": "sa_1762000000000_1_Qm8v",
          "title": "Reescribir meta description",
          "completed": false,
          "order": 1
        }
      ],
      "content_brief": {
        "keyword": "zapatillas running mujer"
      },
      "pack_id": null,
      "pack_source": null,
      "pack_item_id": null,
      "template_id": null,
      "template_source": null,
      "comment_count": 0,
      "created_by": {
        "user_id": "u_7KpQ2",
        "user_name": "Valentina Ríos"
      },
      "created_at": 1761913600000,
      "updated_at": 1762000000000
    },
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}

Rankings

seo_rankings.project.created

A rank tracking project was created

Fires when a rank tracking project is created (from the app, the API, the MCP or MIA): the domain to track, its engines and countries, devices and check schedule. An account has one project; keywords are added afterwards (seo_rankings.keywords.added).

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "seo_rankings.project.created",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "project": {
      "id": "rp_8Kd2QmZpV0bT7xL1aR9c",
      "name": "Clínica Norte",
      "domain": "clinicanorte.com",
      "engines": [
        {
          "engine": "google",
          "location_name": "Argentina",
          "country_code": "AR",
          "language_code": "es"
        }
      ],
      "devices": [
        "desktop"
      ],
      "schedule": {
        "frequency": "weekly",
        "day_of_week": 1,
        "day_of_month": null,
        "hour": 9,
        "timezone": "America/Argentina/Buenos_Aires",
        "enabled": true
      },
      "keyword_count": 0,
      "inactive_keyword_count": 0,
      "last_check_at": null,
      "last_check_status": null,
      "next_check_at": 1762345600000,
      "created_at": 1751632000000,
      "updated_at": 1762000000000
    },
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
seo_rankings.project.updated

A rank tracking project's settings changed

Fires when the domain, name, engines and countries, devices or schedule of a rank tracking project actually change (an edit that leaves everything as it was does not fire it). changed_fields lists the public names of what changed; keywords_stamped counts the keywords that kept measuring on the previous countries when a country was added. When a country or a device stops being measured, retired_pos_keys lists the combinations it stopped measuring that had positions (the ones noted in retired_combos) and positions_cleared counts the latest positions removed (their history stays, readable with seo_rankings.history.grid).

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "seo_rankings.project.updated",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "project": {
      "id": "rp_8Kd2QmZpV0bT7xL1aR9c",
      "name": "Clínica Norte",
      "domain": "clinicanorte.com",
      "engines": [
        {
          "engine": "google",
          "location_name": "Argentina",
          "country_code": "AR",
          "language_code": "es"
        }
      ],
      "devices": [
        "desktop"
      ],
      "schedule": {
        "frequency": "weekly",
        "day_of_week": 1,
        "day_of_month": null,
        "hour": 9,
        "timezone": "America/Argentina/Buenos_Aires",
        "enabled": true
      },
      "keyword_count": 84,
      "inactive_keyword_count": 6,
      "last_check_at": 1761740800000,
      "last_check_status": "completed",
      "next_check_at": 1762345600000,
      "created_at": 1751632000000,
      "updated_at": 1762000000000
    },
    "changed_fields": [
      "schedule"
    ],
    "keywords_stamped": 0,
    "retired_pos_keys": [],
    "positions_cleared": 0,
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
seo_rankings.project.deleted

A rank tracking project was deleted

Fires when a rank tracking project is deleted with its keywords and their whole position history. project is the last copy before deletion; the trash keeps a read-only copy of the project and its keywords for 30 days (it is not restored automatically).

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "seo_rankings.project.deleted",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "project": {
      "id": "rp_8Kd2QmZpV0bT7xL1aR9c",
      "name": "Clínica Norte",
      "domain": "clinicanorte.com",
      "engines": [
        {
          "engine": "google",
          "location_name": "Argentina",
          "country_code": "AR",
          "language_code": "es"
        }
      ],
      "devices": [
        "desktop"
      ],
      "schedule": {
        "frequency": "weekly",
        "day_of_week": 1,
        "day_of_month": null,
        "hour": 9,
        "timezone": "America/Argentina/Buenos_Aires",
        "enabled": true
      },
      "keyword_count": 84,
      "inactive_keyword_count": 6,
      "last_check_at": 1761740800000,
      "last_check_status": "completed",
      "next_check_at": 1762345600000,
      "created_at": 1751632000000,
      "updated_at": 1762000000000
    },
    "keywords_deleted": 90,
    "checks_deleted": 4680,
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
seo_rankings.keywords.added

Keywords were added to a project

Fires once per call that adds keywords to a project, from the app (including the CSV history import, source import), the API, the MCP or MIA. added are the new keywords; reactivated were already in the project as inactive and came back with their history. Keywords loaded by MB Suite support tools straight into the database do not fire it.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "seo_rankings.keywords.added",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "project": {
      "id": "rp_8Kd2QmZpV0bT7xL1aR9c",
      "name": "Clínica Norte",
      "domain": "clinicanorte.com"
    },
    "source": "manual",
    "added": [
      {
        "id": "kw_3Hq2LmZpV0bT7xL1",
        "keyword": "implantes dentales precio",
        "status": "active"
      },
      {
        "id": "kw_9Wd4KpQ2mZ7xV1bN",
        "keyword": "clínica dental palermo",
        "status": "active"
      }
    ],
    "reactivated": [],
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
seo_rankings.keywords.removed

Keywords were deleted from a project

Fires once per call that deletes keywords from a project (one or many). Deleting also deletes their position history: each keyword and its most recent measurements stay 30 days in the trash. To stop measuring a keyword and keep its history, it is deactivated instead (seo_rankings.keywords.status_changed).

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "seo_rankings.keywords.removed",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "project": {
      "id": "rp_8Kd2QmZpV0bT7xL1aR9c",
      "name": "Clínica Norte",
      "domain": "clinicanorte.com"
    },
    "keywords": [
      {
        "id": "kw_3Hq2LmZpV0bT7xL1",
        "keyword": "implantes dentales precio",
        "status": "active"
      }
    ],
    "checks_deleted": 52,
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
seo_rankings.keywords.status_changed

Keywords were activated or deactivated

Fires once per call that activates or deactivates keywords of a project. Inactive keywords are not measured (no cost, no quota) and keep their labels, last position and history; active ones are measured again on the next check. Only the keywords whose status actually changed are listed.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "seo_rankings.keywords.status_changed",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "project": {
      "id": "rp_8Kd2QmZpV0bT7xL1aR9c",
      "name": "Clínica Norte",
      "domain": "clinicanorte.com"
    },
    "status": "inactive",
    "keywords": [
      {
        "id": "kw_9Wd4KpQ2mZ7xV1bN",
        "keyword": "clínica dental palermo",
        "status": "inactive"
      }
    ],
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
seo_rankings.check.completed

A rank check finished

Fires when every measurement of a rank check (scheduled or manual) has been collected and the project's summary was recomputed. summary is the distribution of the ACTIVE keywords on the project's main engine, country and device (the one with the most measured keywords; pos_key), the average position of the keywords that rank, and the top 5 gainers and losers against the previous check; null when no keyword has a position yet. Read every position with seo_rankings.keywords.list or the history grid with seo_rankings.history.grid. Sent by the system (actor kind system).

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "seo_rankings.check.completed",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "project": {
      "id": "rp_8Kd2QmZpV0bT7xL1aR9c",
      "name": "Clínica Norte",
      "domain": "clinicanorte.com"
    },
    "check": {
      "started_at": 1761997600000,
      "completed_at": 1762000000000
    },
    "keyword_count": 84,
    "summary": {
      "pos_key": "google_AR_desktop",
      "engine": "google",
      "country_code": "AR",
      "device": "desktop",
      "distribution": {
        "top3": 12,
        "top10": 21,
        "top20": 14,
        "top30": 9,
        "not_ranked": 28
      },
      "average_position": 11.4,
      "total_keywords": 84,
      "gainers": [
        {
          "keyword": "implantes dentales precio",
          "position": 4,
          "previous_position": 9,
          "change": 5,
          "search_volume": 2400
        }
      ],
      "losers": [
        {
          "keyword": "ortodoncia invisible",
          "position": 15,
          "previous_position": 8,
          "change": -7,
          "search_volume": 1900
        }
      ],
      "computed_at": 1762000000000,
      "last_checked_at": 1761999700000
    },
    "previous_summary": {
      "pos_key": "google_AR_desktop",
      "engine": "google",
      "country_code": "AR",
      "device": "desktop",
      "distribution": {
        "top3": 11,
        "top10": 20,
        "top20": 15,
        "top30": 10,
        "not_ranked": 28
      },
      "average_position": 12.1,
      "total_keywords": 84,
      "gainers": [],
      "losers": [],
      "computed_at": 1761395200000,
      "last_checked_at": 1761394900000
    },
    "combo_summaries": [
      {
        "pos_key": "google_AR_desktop",
        "engine": "google",
        "country_code": "AR",
        "device": "desktop",
        "primary": true,
        "current_summary": {
          "pos_key": "google_AR_desktop",
          "engine": "google",
          "country_code": "AR",
          "device": "desktop",
          "distribution": {
            "top3": 12,
            "top10": 21,
            "top20": 14,
            "top30": 9,
            "not_ranked": 28
          },
          "average_position": 11.4,
          "total_keywords": 84,
          "gainers": [
            {
              "keyword": "implantes dentales precio",
              "position": 4,
              "previous_position": 9,
              "change": 5,
              "search_volume": 2400
            }
          ],
          "losers": [
            {
              "keyword": "ortodoncia invisible",
              "position": 15,
              "previous_position": 8,
              "change": -7,
              "search_volume": 1900
            }
          ],
          "computed_at": 1762000000000,
          "last_checked_at": 1761999700000
        },
        "previous_summary": {
          "pos_key": "google_AR_desktop",
          "engine": "google",
          "country_code": "AR",
          "device": "desktop",
          "distribution": {
            "top3": 11,
            "top10": 20,
            "top20": 15,
            "top30": 10,
            "not_ranked": 28
          },
          "average_position": 12.1,
          "total_keywords": 84,
          "gainers": [],
          "losers": [],
          "computed_at": 1761395200000,
          "last_checked_at": 1761394900000
        }
      }
    ],
    "actor": {
      "uid": "system:cron-rank-tracking",
      "name": "Sistema de Rankings",
      "kind": "system"
    }
  }
}
seo_rankings.check.failed

A rank check failed

Fires when a rank check ends in failure. reason: dispatch_failed (no measurement could be sent to the SERP provider; from a scheduled or a manual check), batches_failed (part of the measurements failed in the last 24 hours) or timeout (the check was open for more than 6 hours). Positions measured before the failure are kept. With batches_failed, the summaries of the combinations measured without failures are updated; those with a failed batch keep theirs. The next scheduled check runs as usual.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "seo_rankings.check.failed",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "project": {
      "id": "rp_8Kd2QmZpV0bT7xL1aR9c",
      "name": "Clínica Norte",
      "domain": "clinicanorte.com"
    },
    "check": {
      "started_at": 1761978340000,
      "failed_at": 1762000000000
    },
    "reason": "timeout",
    "error": "Timeout: no response after 6 hours",
    "actor": {
      "uid": "system:cron-rank-tracking",
      "name": "Sistema de Rankings",
      "kind": "system"
    }
  }
}

Indexing

seo_indexation.sitemap.submitted

A sitemap was submitted to Search Console

Fires when a sitemap is submitted (or resubmitted) to a Search Console property connected to the organization, from the screen, the API or an agent, once Google accepted it. Carries the property (site_url) and the sitemap URL (path). Google fetches and processes it afterwards: its status shows later in seo_indexation.sitemaps.list. Sitemaps submitted directly in Search Console do not fire it.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "seo_indexation.sitemap.submitted",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "sitemap": {
      "site_url": "https://www.clinicanorte.com/",
      "path": "https://www.clinicanorte.com/sitemap.xml"
    },
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
seo_indexation.sitemap.deleted

A sitemap was removed from Search Console

Fires when a sitemap is removed from a Search Console property connected to the organization, from the screen, the API or an agent. Only the property's sitemap list changed: the file on the site is untouched and it can be submitted again. Sitemaps removed directly in Search Console do not fire it.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "seo_indexation.sitemap.deleted",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "sitemap": {
      "site_url": "https://www.clinicanorte.com/",
      "path": "https://www.clinicanorte.com/sitemap.xml"
    },
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
seo_indexation.coverage.completed

A coverage analysis finished

Fires when a coverage analysis of a Search Console property finishes and is saved (seo_indexation.coverage.run, from the screen, the API or an agent): the analysis id, the property, coverage_score (0–100) and its counts (URLs in sitemaps, pages with impressions in 90 days, orphan and dead pages). The page lists come from seo_indexation.coverage.latest. Analyses of a demo organization are not saved and do not fire it.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "seo_indexation.coverage.completed",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "analysis": {
      "id": "Q7mT2xVb9LkR4sNw1PzE",
      "site_url": "https://www.clinicanorte.com/",
      "coverage_score": 87,
      "total_sitemap_urls": 412,
      "total_indexed_urls": 0,
      "total_pages_with_impressions": 368,
      "orphan_pages_count": 14,
      "dead_pages_count": 3,
      "created_at": 1762000000000
    },
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}

Email Marketing

email_marketing.campaign.scheduled

An email campaign was scheduled

Fires when a campaign gets a send date, from the campaign wizard or by the API (email_marketing.campaigns.schedule), and again when a scheduled one is rescheduled. scheduled_at is the date chosen. At that time the campaign goes out on its own and email_marketing.campaign.sent fires with a system actor; if it cannot go out within an hour of that time, it is not sent and goes back to draft. Editing the content or cancelling a scheduled campaign does not fire it.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "email_marketing.campaign.scheduled",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "campaign": {
      "id": "cmp_8hQ2a",
      "name": "Novedades de octubre",
      "subject": "{{nombre}}, esto es lo nuevo de octubre",
      "status": "scheduled",
      "from_email": "hola@agencia-rocket.com",
      "from_name": "Agencia Rocket",
      "audience_id": "aud_3Lm7p",
      "audience_name": "Clientes activos",
      "template_id": "tpl_9Xk1z",
      "recipient_source": "audience",
      "recipient_count": 0,
      "suppressed_count": null,
      "scheduled_at": 1762086400000,
      "sent_at": null,
      "created_at": 1761996400000,
      "updated_at": 1762000000000
    },
    "scheduled_at": 1762086400000,
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
email_marketing.campaign.sent

An email campaign was sent

Fires once when a campaign's send is launched: now, from the screen or by the API, or at its scheduled time by the scheduled send (then actor.kind is system and campaign.scheduled_at keeps the time it was scheduled for). Its recipients were resolved, suppressed and duplicate addresses were left out and every message was queued. recipient_count is how many messages were queued and suppressed_count how many addresses the suppression list removed. Messages go out in the background over the next minutes (status queued → sending → sent); finishing the delivery and the per-message results (delivered, opened, clicked, bounced) do not fire events yet.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "email_marketing.campaign.sent",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "campaign": {
      "id": "cmp_8hQ2a",
      "name": "Novedades de octubre",
      "subject": "{{nombre}}, esto es lo nuevo de octubre",
      "status": "queued",
      "from_email": "hola@agencia-rocket.com",
      "from_name": "Agencia Rocket",
      "audience_id": "aud_3Lm7p",
      "audience_name": "Clientes activos",
      "template_id": "tpl_9Xk1z",
      "recipient_source": "audience",
      "recipient_count": 1240,
      "suppressed_count": 12,
      "scheduled_at": null,
      "sent_at": 1762000000000,
      "created_at": 1761996400000,
      "updated_at": 1762000000000
    },
    "recipient_count": 1240,
    "suppressed_count": 12,
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
email_marketing.flow.enrolled

Contacts were enrolled in an email flow

Fires once per enrollment request that enrolled at least one contact: one contact enrolled by hand or by the API, an audience enrolled once (source.type audience_snapshot) or an audience linked to the flow (audience_auto, its current members). enrollments lists up to 100 of the enrollments created; when enrollments_truncated is true, page through email_marketing.flows.enrollments.list for the rest. Contacts enrolled by the background audience sync or by a contact event (contact_added, contact_labeled) do not fire it yet.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "email_marketing.flow.enrolled",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "flow": {
      "id": "flw_4Tq8r",
      "name": "Bienvenida",
      "status": "active",
      "trigger": "manual"
    },
    "source": {
      "type": "manual",
      "audience_id": null,
      "audience_name": null
    },
    "enrolled_count": 1,
    "skipped_count": 0,
    "enrollments": [
      {
        "id": "enr_6Wn2c",
        "email": "ana@cliente.com",
        "name": "Ana Pérez",
        "contact_id": "ct_1Qa9"
      }
    ],
    "enrollments_truncated": false,
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
email_marketing.flow.exited

A contact left an email flow before finishing it

Fires when an active or paused enrollment is taken out of its flow by hand, from the flow's enrollments tab or by the API (email_marketing.flows.enrollments.exit): reason is manual and the enrollment ends cancelled. Exits decided in the background (an exit condition, the suppression list, an unsubscribe) and finishing the flow do not fire it yet.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "email_marketing.flow.exited",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "flow": {
      "id": "flw_4Tq8r",
      "name": "Bienvenida"
    },
    "enrollment": {
      "id": "enr_6Wn2c",
      "email": "ana@cliente.com",
      "name": "Ana Pérez",
      "contact_id": "ct_1Qa9",
      "status": "cancelled"
    },
    "reason": "manual",
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
email_marketing.audience.updated

An audience's definition changed

Fires when an audience is edited from the screen or by the API: name, description, its contacts, its label or account filters or its imported members. changed_fields lists the public field names that changed. Contacts that join a dynamic audience because they got a label do not fire it (the audience did not change, its members did), and neither does refreshing the member count.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "email_marketing.audience.updated",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "audience": {
      "id": "aud_3Lm7p",
      "name": "Clientes activos",
      "type": "dynamic_labels",
      "description": null,
      "member_count": 318,
      "filter_label_ids": [
        "lbl_cliente",
        "lbl_activo"
      ],
      "filter_label_mode": "all",
      "filter_org_ids": null,
      "updated_at": 1762000000000
    },
    "changed_fields": [
      "filter_label_ids",
      "filter_label_mode"
    ],
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}

Accounts

child_orgs.account.created

An account was created

Fires once per new account of the workspace: from Accounts (one by one or a CSV import), the API, the MCP or MIA. A new account is always dormant (child_org_status dormant, billing_mode parent_managed): no members of its own and no charge. source says whether it came alone or in a batch.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "child_orgs.account.created",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "account": {
      "id": "org_Cl1n1c4N0rt3",
      "name": "Clínica Norte",
      "slug": "clinica-norte",
      "parent_org_id": "org_W0rksp4c3",
      "status": "active",
      "child_org_status": "dormant",
      "billing_mode": "parent_managed",
      "industry": "Salud / Medicina",
      "website": "https://clinicanorte.com",
      "country": "ar",
      "created_at": 1762000000000
    },
    "source": "single",
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
child_orgs.account.archived

An account was archived

Fires when the workspace archives one of its accounts (from Accounts, the account's settings opened from the workspace, the API, the MCP or MIA): its access is blocked, its scheduled work is paused, it stops being billed to the workspace if the workspace paid for it, and it frees a slot of the plan. Archiving an already archived account does not fire it, and an account archived from inside by its own owner does not fire it yet.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "child_orgs.account.archived",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "account": {
      "id": "org_Cl1n1c4N0rt3",
      "name": "Clínica Norte",
      "slug": "clinica-norte",
      "parent_org_id": "org_W0rksp4c3",
      "status": "archived",
      "child_org_status": "dormant",
      "billing_mode": "parent_managed",
      "industry": "Salud / Medicina",
      "website": "https://clinicanorte.com",
      "country": "ar",
      "created_at": 1762000000000
    },
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
child_orgs.account.restored

An archived account was restored

Fires when the workspace brings an archived account back (from Accounts, the account's settings opened from the workspace, the API, the MCP or MIA): it takes a slot of the plan again and what archiving paused starts again. Restoring an account that was not archived does not fire it, and an account reactivated from inside by its own owner does not fire it yet.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "child_orgs.account.restored",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "account": {
      "id": "org_Cl1n1c4N0rt3",
      "name": "Clínica Norte",
      "slug": "clinica-norte",
      "parent_org_id": "org_W0rksp4c3",
      "status": "active",
      "child_org_status": "dormant",
      "billing_mode": "parent_managed",
      "industry": "Salud / Medicina",
      "website": "https://clinicanorte.com",
      "country": "ar",
      "created_at": 1762000000000
    },
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
child_orgs.account.deleted

An account was deleted

Fires when the workspace deletes one of its accounts (from Accounts, the account's settings opened from the workspace, the API, the MCP or MIA). The account carries its last state (archived). Deleting an account from inside it, by its own owner, does not fire it yet.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "child_orgs.account.deleted",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "account": {
      "id": "org_Cl1n1c4N0rt3",
      "name": "Clínica Norte",
      "slug": "clinica-norte",
      "parent_org_id": "org_W0rksp4c3",
      "status": "archived",
      "child_org_status": "dormant",
      "billing_mode": "parent_managed",
      "industry": "Salud / Medicina",
      "website": "https://clinicanorte.com",
      "country": "ar",
      "created_at": 1762000000000
    },
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}

Tasks

task_management.task.created

A task was created

Fires when a task or subtask is created through the API, the MCP or MIA, when a recurring task spawns its next instance (source recurrence), when a task pack is applied (source task_pack, one event per task) and when a task arrives from another organization (source moved). Tasks created from the Tasks screen do not fire it yet. Private tasks never fire webhooks.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "task_management.task.created",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "task": {
      "id": "tk_5Hq2LmZpV0bT7xL1aR9c",
      "title": "Enviar el reporte mensual a Clínica Norte",
      "description": "<p>Con los resultados de pauta de septiembre.</p>",
      "status_id": "status_todo",
      "priority_id": "prio_high",
      "is_done": false,
      "completed_at": null,
      "assignee_id": "u_7KpQ2",
      "assignee_name": "Valentina Ríos",
      "created_by_id": "u_7KpQ2",
      "organization_id": "org_W0rksp4c3",
      "account_id": "org_Cl1n1c4N0rt3",
      "is_private": false,
      "due_date": 1762259200000,
      "parent_task_id": null,
      "project_id": null,
      "label_ids": [
        "lbl_reportes"
      ],
      "tags": [],
      "alert_user_ids": [
        "u_3bTz8"
      ],
      "watcher_ids": [],
      "recurrence": {
        "frequency": "monthly",
        "interval": 1
      },
      "comment_count": 0,
      "created_at": 1761913600000,
      "updated_at": 1762000000000
    },
    "source": "manual",
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
task_management.task.updated

A task's fields changed

Fires on edits to a task through the API, the MCP or MIA (one or many at once), on reopening it and on scope changes (also from the app). changed_fields lists the public field names that changed. Completing a task fires task_management.task.completed as well. Edits made from the Tasks screen do not fire it yet.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "task_management.task.updated",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "task": {
      "id": "tk_5Hq2LmZpV0bT7xL1aR9c",
      "title": "Enviar el reporte mensual a Clínica Norte",
      "description": "<p>Con los resultados de pauta de septiembre.</p>",
      "status_id": "status_todo",
      "priority_id": "prio_urgent",
      "is_done": false,
      "completed_at": null,
      "assignee_id": "u_7KpQ2",
      "assignee_name": "Valentina Ríos",
      "created_by_id": "u_7KpQ2",
      "organization_id": "org_W0rksp4c3",
      "account_id": "org_Cl1n1c4N0rt3",
      "is_private": false,
      "due_date": 1762259200000,
      "parent_task_id": null,
      "project_id": null,
      "label_ids": [
        "lbl_reportes"
      ],
      "tags": [],
      "alert_user_ids": [
        "u_3bTz8"
      ],
      "watcher_ids": [],
      "recurrence": {
        "frequency": "monthly",
        "interval": 1
      },
      "comment_count": 0,
      "created_at": 1761913600000,
      "updated_at": 1762000000000
    },
    "changed_fields": [
      "priority_id"
    ],
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
task_management.task.completed

A task was completed

Fires once when a task moves from an open status to a DONE status through the API, the MCP or MIA. When the task is recurring, next_task_id is the id of its next instance: the one just created (task_management.task.created fires for it) or, when the series already had the instance for that date (the task was completed, reopened and completed again), that same one, which is not duplicated and fires no task_management.task.created. Completing from the Tasks screen does not fire it yet.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "task_management.task.completed",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "task": {
      "id": "tk_5Hq2LmZpV0bT7xL1aR9c",
      "title": "Enviar el reporte mensual a Clínica Norte",
      "description": "<p>Con los resultados de pauta de septiembre.</p>",
      "status_id": "status_done",
      "priority_id": "prio_high",
      "is_done": true,
      "completed_at": 1762000000000,
      "assignee_id": "u_7KpQ2",
      "assignee_name": "Valentina Ríos",
      "created_by_id": "u_7KpQ2",
      "organization_id": "org_W0rksp4c3",
      "account_id": "org_Cl1n1c4N0rt3",
      "is_private": false,
      "due_date": 1762259200000,
      "parent_task_id": null,
      "project_id": null,
      "label_ids": [
        "lbl_reportes"
      ],
      "tags": [],
      "alert_user_ids": [
        "u_3bTz8"
      ],
      "watcher_ids": [],
      "recurrence": {
        "frequency": "monthly",
        "interval": 1
      },
      "comment_count": 0,
      "created_at": 1761913600000,
      "updated_at": 1762000000000
    },
    "next_task_id": "tk_9Wd4KpQ2mZ7xV1bN3sLe",
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
task_management.task.deleted

A task was deleted

Fires when a task is deleted through the API, the MCP or MIA (one or in bulk), once per task and once per subtask deleted with it; the task is the last copy before deletion and stays 30 days in the trash. reason: moved means it moved to another organization (from the app), where task_management.task.created fires. Deleting from the Tasks screen does not fire it yet.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "task_management.task.deleted",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "task": {
      "id": "tk_5Hq2LmZpV0bT7xL1aR9c",
      "title": "Enviar el reporte mensual a Clínica Norte",
      "description": "<p>Con los resultados de pauta de septiembre.</p>",
      "status_id": "status_todo",
      "priority_id": "prio_high",
      "is_done": false,
      "completed_at": null,
      "assignee_id": "u_7KpQ2",
      "assignee_name": "Valentina Ríos",
      "created_by_id": "u_7KpQ2",
      "organization_id": "org_W0rksp4c3",
      "account_id": "org_Cl1n1c4N0rt3",
      "is_private": false,
      "due_date": 1762259200000,
      "parent_task_id": null,
      "project_id": null,
      "label_ids": [
        "lbl_reportes"
      ],
      "tags": [],
      "alert_user_ids": [
        "u_3bTz8"
      ],
      "watcher_ids": [],
      "recurrence": {
        "frequency": "monthly",
        "interval": 1
      },
      "comment_count": 0,
      "created_at": 1761913600000,
      "updated_at": 1762000000000
    },
    "reason": "deleted",
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
task_management.comment.added

Someone commented on a task

Fires on every new comment on a task, from the app, the API, the MCP or MIA. Carries the comment (sanitized HTML in content, plain text in content_text, mentioned user ids) and the task's id and title. Comments on private tasks never fire it.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "task_management.comment.added",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "comment": {
      "id": "cm_2Lp8",
      "task_id": "tk_5Hq2LmZpV0bT7xL1aR9c",
      "content": "<p>Listo el borrador, falta el gráfico de conversiones.</p>",
      "content_text": "Listo el borrador, falta el gráfico de conversiones.",
      "mentions": [],
      "created_by_id": "u_7KpQ2",
      "created_by_name": "Valentina Ríos",
      "created_at": 1762000000000
    },
    "task": {
      "id": "tk_5Hq2LmZpV0bT7xL1aR9c",
      "title": "Enviar el reporte mensual a Clínica Norte"
    },
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}

Projects

projects.project.created

A project was created

Fires when a public project is created through the API, the MCP or MIA. status is the project's status resolved against its type (name and category). Projects created from the Projects screen, and projects that are private, shared with specific people or agency-only, do not fire it.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "projects.project.created",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "project": {
      "id": "pj_4Rt8wQ1mZx",
      "name": "Rediseño del sitio — Clínica Norte",
      "type_id": "type_engagement",
      "status_id": "engagement_status_1",
      "is_closed": false,
      "closed_at": null,
      "is_archived": false,
      "progress_mode": "auto",
      "account_id": "ac_2mN8",
      "owner_id": "u_7KpQ2",
      "owner_name": "Valentina Ríos",
      "member_ids": [
        "u_7KpQ2",
        "u_3HsL9"
      ],
      "start_date": 1761395200000,
      "due_date": 1764592000000,
      "visibility": "public",
      "item_count": 4,
      "task_count": 12,
      "done_task_count": 5,
      "custom_fields": {
        "presupuesto": 4800,
        "trimestre": "q4"
      },
      "created_by_id": "u_7KpQ2",
      "created_at": 1761395200000,
      "updated_at": 1762000000000
    },
    "status": {
      "id": "engagement_status_1",
      "name": "En curso",
      "category": "in_progress"
    },
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
projects.project.updated

A project's fields changed

Fires when a public project is edited through the API, the MCP or MIA, or when its item statuses are edited from the project board: its name, status, dates, owner, team, custom fields, item configuration or privacy. changed_fields lists the public field names that changed; counters (items, tasks) do not count as a change. A project that stops being public stops firing events. Other edits made from the Projects screen do not fire it yet.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "projects.project.updated",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "project": {
      "id": "pj_4Rt8wQ1mZx",
      "name": "Rediseño del sitio — Clínica Norte",
      "type_id": "type_engagement",
      "status_id": "engagement_status_3",
      "is_closed": true,
      "closed_at": 1762000000000,
      "is_archived": false,
      "progress_mode": "auto",
      "account_id": "ac_2mN8",
      "owner_id": "u_7KpQ2",
      "owner_name": "Valentina Ríos",
      "member_ids": [
        "u_7KpQ2",
        "u_3HsL9"
      ],
      "start_date": 1761395200000,
      "due_date": 1764592000000,
      "visibility": "public",
      "item_count": 4,
      "task_count": 12,
      "done_task_count": 5,
      "custom_fields": {
        "presupuesto": 4800,
        "trimestre": "q4"
      },
      "created_by_id": "u_7KpQ2",
      "created_at": 1761395200000,
      "updated_at": 1762000000000
    },
    "status": {
      "id": "engagement_status_3",
      "name": "Completado",
      "category": "done"
    },
    "changed_fields": [
      "closed_at",
      "is_closed",
      "status_id"
    ],
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
projects.project.archived

A project was archived or unarchived

Fires when a public project is archived (archived: true: it leaves the active list but keeps its items and tasks) or unarchived (archived: false) through the API, the MCP or MIA. Archiving is a state of the project, not a deletion. Archiving from the Projects screen does not fire it yet.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "projects.project.archived",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "project": {
      "id": "pj_4Rt8wQ1mZx",
      "name": "Rediseño del sitio — Clínica Norte",
      "type_id": "type_engagement",
      "status_id": "engagement_status_1",
      "is_closed": false,
      "closed_at": null,
      "is_archived": true,
      "progress_mode": "auto",
      "account_id": "ac_2mN8",
      "owner_id": "u_7KpQ2",
      "owner_name": "Valentina Ríos",
      "member_ids": [
        "u_7KpQ2",
        "u_3HsL9"
      ],
      "start_date": 1761395200000,
      "due_date": 1764592000000,
      "visibility": "public",
      "item_count": 4,
      "task_count": 12,
      "done_task_count": 5,
      "custom_fields": {
        "presupuesto": 4800,
        "trimestre": "q4"
      },
      "created_by_id": "u_7KpQ2",
      "created_at": 1761395200000,
      "updated_at": 1762000000000
    },
    "status": {
      "id": "engagement_status_1",
      "name": "En curso",
      "category": "in_progress"
    },
    "archived": true,
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
projects.item.created

An item was added to a project

Fires when an item (a row of a project: a site, a campaign, a deliverable) is created in a public project through the API, the MCP or MIA. Carries the item, its project (id and name) and its status resolved against the project's item statuses. Items created from the project screen or by the CSV import do not fire it yet.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "projects.item.created",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "item": {
      "id": "it_9sD2kL",
      "project_id": "pj_4Rt8wQ1mZx",
      "title": "Landing de turnos online",
      "status_id": "engagement_status_1",
      "assignee_ids": [
        "u_3HsL9"
      ],
      "is_archived": false,
      "due_date": 1762864000000,
      "custom_fields": {
        "url_staging": "https://staging.clinicanorte.com/turnos"
      },
      "order": 20,
      "created_by_id": "u_7KpQ2",
      "created_at": 1761913600000,
      "updated_at": 1762000000000
    },
    "project": {
      "id": "pj_4Rt8wQ1mZx",
      "name": "Rediseño del sitio — Clínica Norte"
    },
    "status": {
      "id": "engagement_status_1",
      "name": "En curso",
      "category": "in_progress"
    },
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
projects.item.updated

A project item's fields changed

Fires when an item of a public project is edited through the API, the MCP or MIA: its title, status, assignees, dates, description, custom fields or archived state. changed_fields lists the public field names that changed. Reordering items does not fire it, and edits from the project screen do not fire it yet.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "projects.item.updated",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "item": {
      "id": "it_9sD2kL",
      "project_id": "pj_4Rt8wQ1mZx",
      "title": "Landing de turnos online",
      "status_id": "engagement_status_3",
      "assignee_ids": [
        "u_3HsL9"
      ],
      "is_archived": false,
      "due_date": 1762864000000,
      "custom_fields": {
        "url_staging": "https://staging.clinicanorte.com/turnos"
      },
      "order": 20,
      "created_by_id": "u_7KpQ2",
      "created_at": 1761913600000,
      "updated_at": 1762000000000
    },
    "project": {
      "id": "pj_4Rt8wQ1mZx",
      "name": "Rediseño del sitio — Clínica Norte"
    },
    "status": {
      "id": "engagement_status_3",
      "name": "Completado",
      "category": "done"
    },
    "changed_fields": [
      "status_id"
    ],
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}

Contacts

contacts.contact.created

A contact was created

Fires when a contact is added to the organization's address book (the Contacts module, not the CRM) through the API, the MCP or MIA. Contacts created from the Contacts screen do not fire it yet, and imported contacts never do: listen to contacts.import.completed for imports.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "contacts.contact.created",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "contact": {
      "id": "Q3vX8mLk2pTz9RbN4cWd",
      "first_name": "Lucía",
      "last_name": "Fernández",
      "email": "lucia.fernandez@clinicanorte.com",
      "phone": "",
      "mobile": "+54 9 11 5555 0101",
      "job_title": "Gerente de Marketing",
      "notes": "Recibe el reporte mensual.",
      "assigned_org_ids": [
        "org_Cl1n1c4N0rt3"
      ],
      "label_ids": [
        "lbl_marketing"
      ],
      "is_favorite": false,
      "organization_id": "org_W0rksp4c3",
      "created_at": 1761913600000,
      "updated_at": 1762000000000
    },
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
contacts.contact.updated

A contact's fields changed

Fires when a contact is edited through the API, the MCP or MIA, one at a time or in bulk (labels and Accounts), and when it is marked or unmarked as favorite. changed_fields lists the public field names that changed. Edits from the Contacts screen do not fire it yet.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "contacts.contact.updated",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "contact": {
      "id": "Q3vX8mLk2pTz9RbN4cWd",
      "first_name": "Lucía",
      "last_name": "Fernández",
      "email": "lucia.fernandez@clinicanorte.com",
      "phone": "",
      "mobile": "+54 9 11 5555 0101",
      "job_title": "Gerente de Marketing",
      "notes": "Recibe el reporte mensual.",
      "assigned_org_ids": [
        "org_Cl1n1c4N0rt3"
      ],
      "label_ids": [
        "lbl_marketing",
        "lbl_reportes"
      ],
      "is_favorite": false,
      "organization_id": "org_W0rksp4c3",
      "created_at": 1761913600000,
      "updated_at": 1762000000000
    },
    "changed_fields": [
      "label_ids"
    ],
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
contacts.contact.deleted

A contact was deleted

Fires when a contact is deleted through the API, the MCP or MIA, once per contact (also in bulk). The contact is the last copy before deletion; it stays 30 days in the trash and comes back with the same id if restored. Deleting from the Contacts screen does not fire it yet.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "contacts.contact.deleted",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "contact": {
      "id": "Q3vX8mLk2pTz9RbN4cWd",
      "first_name": "Lucía",
      "last_name": "Fernández",
      "email": "lucia.fernandez@clinicanorte.com",
      "phone": "",
      "mobile": "+54 9 11 5555 0101",
      "job_title": "Gerente de Marketing",
      "notes": "Recibe el reporte mensual.",
      "assigned_org_ids": [
        "org_Cl1n1c4N0rt3"
      ],
      "label_ids": [
        "lbl_marketing"
      ],
      "is_favorite": false,
      "organization_id": "org_W0rksp4c3",
      "created_at": 1761913600000,
      "updated_at": 1762000000000
    },
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
contacts.import.completed

A contact import created contacts

Fires once per import call that created at least one contact: from the API, the MCP or MIA (contacts.contacts.bulk.import, up to 500 rows per call) and from the CSV import of the Contacts screen, which sends its rows in chunks of 500 (a big file fires one event per chunk). contact_ids are the contacts created; skipped counts the rows that matched an existing contact and failed the invalid rows. Imported contacts do not fire contacts.contact.created.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "contacts.import.completed",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "import": {
      "imported": 2,
      "skipped": 1,
      "failed": 0,
      "contact_ids": [
        "Q3vX8mLk2pTz9RbN4cWd",
        "H7bK2nQw5sYp1LmZ8vRe"
      ]
    },
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
contacts.email.sent

An email was sent from Contacts

Fires after an email is sent from the Contacts module: the compose window of the screen, the API, the MCP or MIA (contacts.email.send). Carries the provider message id, the From, the sender id, the recipients and the subject; never the body.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "contacts.email.sent",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "email": {
      "id": "0100019a1b2c3d4e-5f6a7b8c-1d2e-4f5a-9b8c-7d6e5f4a3b2c-000000",
      "from": "Valentina Ríos <valentina@agencia.com>",
      "sender_id": "snd_valentina",
      "to": [
        "lucia.fernandez@clinicanorte.com"
      ],
      "cc": [],
      "subject": "Resultados de septiembre",
      "sent_at": 1762000000000
    },
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}

Media Library

media_library.item.created

A file was added to the media library

Fires when a file uploaded through the API is registered in the media library (source upload) and when the canvas editor creates a new edited image from an original (source canvas_edit, also from the app). Files uploaded from the Media Library screen and the images that Content Studio, Photo Sessions or Ad Creator save on their own do not fire it yet. item.storage_path identifies the file; get a download link with media_library.items.get.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "media_library.item.created",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "item": {
      "id": "mi_8sKq2LmZpV0bT7xL1aR9",
      "original_name": "Campaña primavera - hero.png",
      "filename": "campana_primavera_hero.png",
      "type": "image",
      "size": 482133,
      "folder_id": "mf_3nVb7QwE1rT5yU9iO2pA",
      "tags": [
        "primavera",
        "hero"
      ],
      "source": "upload",
      "storage_path": "organizations/org_Cl1n1c4N0rt3/media-library/mf_3nVb7QwE1rT5yU9iO2pA/1762000000000_campana_primavera_hero.png",
      "width": 1080,
      "height": 1350,
      "uploaded_by": "u_7KpQ2",
      "uploaded_at": 1762000000000,
      "canvas_element_count": 0,
      "organization_id": "org_Cl1n1c4N0rt3"
    },
    "source": "upload",
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
media_library.item.edited

An image was edited with the canvas editor

Fires every time an image of the media library is saved from the canvas editor, in the app, the API, the MCP or MIA. mode: created means editing an original produced a new image (media_library.item.created fires for it as well); mode: updated means an edited image was saved again with a new file. source_item_id is the image that was opened in the editor and element_count how many elements the recipe has.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "media_library.item.edited",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "item": {
      "id": "mi_2Wd4KpQ2mZ7xV1bN3sLe",
      "original_name": "Campaña primavera - hero (editada).png",
      "filename": "campana_primavera_hero.png",
      "type": "image",
      "size": 482133,
      "folder_id": "mf_3nVb7QwE1rT5yU9iO2pA",
      "tags": [
        "primavera",
        "hero"
      ],
      "source": "edited",
      "storage_path": "organizations/org_Cl1n1c4N0rt3/media-library/mf_3nVb7QwE1rT5yU9iO2pA/1762000000000_campana_primavera_hero.png",
      "width": 1080,
      "height": 1350,
      "uploaded_by": "u_7KpQ2",
      "uploaded_at": 1762000000000,
      "canvas_element_count": 2,
      "organization_id": "org_Cl1n1c4N0rt3",
      "edited_from_id": "mi_8sKq2LmZpV0bT7xL1aR9"
    },
    "mode": "created",
    "source_item_id": "mi_8sKq2LmZpV0bT7xL1aR9",
    "element_count": 2,
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
media_library.item.deleted

A file was deleted from the media library

Fires when a file is deleted through the API, the MCP or MIA (one, in bulk, or with its folder: reason: folder_deleted), once per file; the item is the last copy before deletion and stays 30 days in the trash, with the stored file kept so it can be restored. Deleting from the Media Library screen does not fire it yet.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "media_library.item.deleted",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "item": {
      "id": "mi_8sKq2LmZpV0bT7xL1aR9",
      "original_name": "Campaña primavera - hero.png",
      "filename": "campana_primavera_hero.png",
      "type": "image",
      "size": 482133,
      "folder_id": "mf_3nVb7QwE1rT5yU9iO2pA",
      "tags": [
        "primavera",
        "hero"
      ],
      "source": "upload",
      "storage_path": "organizations/org_Cl1n1c4N0rt3/media-library/mf_3nVb7QwE1rT5yU9iO2pA/1762000000000_campana_primavera_hero.png",
      "width": 1080,
      "height": 1350,
      "uploaded_by": "u_7KpQ2",
      "uploaded_at": 1762000000000,
      "canvas_element_count": 0,
      "organization_id": "org_Cl1n1c4N0rt3"
    },
    "reason": "deleted",
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}

Knowledge Base

knowledge_base.article.created

A Knowledge Base article was published

Fires when a public article is created, from the app, the API, the MCP or MIA. Carries the whole article (sanitized HTML in content, plain text in content_text, links, attachment metadata without download links, tag ids). Articles created as private, for some people or agency-only do not fire it; they fire knowledge_base.article.visibility_changed if they become public later.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "knowledge_base.article.created",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "article": {
      "id": "kb_8Rf2LmZpV0bT7xL1aQ3d",
      "title": "Cómo pedir acceso a la cuenta publicitaria de un cliente",
      "content": "<p>Pide el acceso desde el Business Manager del cliente con el rol <strong>Anunciante</strong>.</p>",
      "content_text": "Pide el acceso desde el Business Manager del cliente con el rol Anunciante.",
      "links": [
        {
          "url": "https://www.facebook.com/business/help",
          "title": "Ayuda para empresas de Meta",
          "description": null,
          "domain": "facebook.com"
        }
      ],
      "attachments": [
        {
          "id": "1762000000000_ab12cd",
          "filename": "checklist-accesos.pdf",
          "original_name": "Checklist accesos.pdf",
          "size": 182344,
          "type": "application/pdf",
          "uploaded_at": 1761913600000
        }
      ],
      "tag_ids": [
        "tag_onboarding"
      ],
      "visibility": "public",
      "is_pinned": false,
      "pinned_at": null,
      "created_by_id": "u_7KpQ2",
      "created_by_name": "Valentina Ríos",
      "created_at": 1761913600000,
      "updated_at": 1762000000000,
      "view_count": 12,
      "comment_count": 2
    },
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
knowledge_base.article.updated

A public Knowledge Base article changed

Fires when a public article is edited (title, content, links, attachments, tags), pinned or unpinned, from the app, the API, the MCP or MIA, and once per article when tags change in bulk. changed_fields lists the public field names that changed. Edits to non-public articles do not fire it; a change of visibility fires knowledge_base.article.visibility_changed instead.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "knowledge_base.article.updated",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "article": {
      "id": "kb_8Rf2LmZpV0bT7xL1aQ3d",
      "title": "Cómo pedir acceso a una cuenta publicitaria",
      "content": "<p>Pide el acceso desde el Business Manager del cliente con el rol <strong>Anunciante</strong>.</p>",
      "content_text": "Pide el acceso desde el Business Manager del cliente con el rol Anunciante.",
      "links": [
        {
          "url": "https://www.facebook.com/business/help",
          "title": "Ayuda para empresas de Meta",
          "description": null,
          "domain": "facebook.com"
        }
      ],
      "attachments": [
        {
          "id": "1762000000000_ab12cd",
          "filename": "checklist-accesos.pdf",
          "original_name": "Checklist accesos.pdf",
          "size": 182344,
          "type": "application/pdf",
          "uploaded_at": 1761913600000
        }
      ],
      "tag_ids": [
        "tag_onboarding"
      ],
      "visibility": "public",
      "is_pinned": false,
      "pinned_at": null,
      "created_by_id": "u_7KpQ2",
      "created_by_name": "Valentina Ríos",
      "created_at": 1761913600000,
      "updated_at": 1762000000000,
      "view_count": 12,
      "comment_count": 2
    },
    "changed_fields": [
      "title"
    ],
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
knowledge_base.article.deleted

A public Knowledge Base article was deleted

Fires when a public article is deleted (one or in bulk), from the app, the API, the MCP or MIA. The article is its last copy before deletion; it stays 30 days in the trash with its comments, where an owner or admin can restore it (restoring does not fire knowledge_base.article.created). Deleting a non-public article does not fire it.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "knowledge_base.article.deleted",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "article": {
      "id": "kb_8Rf2LmZpV0bT7xL1aQ3d",
      "title": "Cómo pedir acceso a la cuenta publicitaria de un cliente",
      "content": "<p>Pide el acceso desde el Business Manager del cliente con el rol <strong>Anunciante</strong>.</p>",
      "content_text": "Pide el acceso desde el Business Manager del cliente con el rol Anunciante.",
      "links": [
        {
          "url": "https://www.facebook.com/business/help",
          "title": "Ayuda para empresas de Meta",
          "description": null,
          "domain": "facebook.com"
        }
      ],
      "attachments": [
        {
          "id": "1762000000000_ab12cd",
          "filename": "checklist-accesos.pdf",
          "original_name": "Checklist accesos.pdf",
          "size": 182344,
          "type": "application/pdf",
          "uploaded_at": 1761913600000
        }
      ],
      "tag_ids": [
        "tag_onboarding"
      ],
      "visibility": "public",
      "is_pinned": false,
      "pinned_at": null,
      "created_by_id": "u_7KpQ2",
      "created_by_name": "Valentina Ríos",
      "created_at": 1761913600000,
      "updated_at": 1762000000000,
      "view_count": 12,
      "comment_count": 2
    },
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
knowledge_base.article.visibility_changed

A Knowledge Base article became public or stopped being public

Fires when an article's visibility changes to or from public. Becoming public carries the whole article (treat it as new); leaving public carries only its id, title, new visibility and update time, so the integration can remove it (the content is no longer shared). Changes between non-public visibilities do not fire it. changed_fields also lists other fields edited in the same change.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "knowledge_base.article.visibility_changed",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "article": {
      "id": "kb_8Rf2LmZpV0bT7xL1aQ3d",
      "title": "Cómo pedir acceso a la cuenta publicitaria de un cliente",
      "visibility": "private",
      "updated_at": 1762000000000
    },
    "from": "public",
    "to": "private",
    "changed_fields": [
      "visibility"
    ],
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}

Web Forms

web_forms.form.published

A web form started accepting submissions

Fires when a web form becomes published: created published, edited from unpublished to published, or published with web_forms.forms.publish (from the screen, the API or an agent). Carries the whole form (fields, recipients, allowed origins, anti-spam settings, CRM link). Unpublishing does not fire it, and a form switched on by an internal script outside the platform does not either.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "web_forms.form.published",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "form": {
      "id": "6f1c2a9e4b7d4e0f8a3c5b2d1e9f7a6c",
      "name": "Sitio web — Contacto",
      "enabled": true,
      "fields": [
        {
          "name": "nombre",
          "label": "Nombre",
          "type": "text",
          "required": true,
          "crm_template": "name"
        },
        {
          "name": "email",
          "label": "Email",
          "type": "email",
          "required": true,
          "crm_template": "email"
        },
        {
          "name": "telefono",
          "label": "Teléfono",
          "type": "phone",
          "required": false,
          "crm_template": "phone"
        },
        {
          "name": "mensaje",
          "label": "Mensaje",
          "type": "textarea",
          "required": true,
          "crm_template": "message"
        }
      ],
      "honeypot_field_name": "_qzt_field",
      "from_name": "Clínica Norte · sitio web",
      "to_emails": [
        "contacto@clinicanorte.com"
      ],
      "subject": "Nueva consulta de {{nombre}}",
      "reply_to_field": "email",
      "allowed_origins": [
        "https://clinicanorte.com",
        "https://www.clinicanorte.com"
      ],
      "recaptcha_enabled": false,
      "thank_you_url": "https://clinicanorte.com/gracias/",
      "rate_limits": {
        "per_ip_per_minute": 5,
        "per_ip_per_hour": 50,
        "per_form_per_day": 1000
      },
      "email_branding": "mb_suite",
      "crm_enabled": true,
      "linked_source_id": null,
      "auto_responder": null,
      "stats": {
        "total_submissions": 0,
        "total_rejected": 0,
        "total_emails_sent": 0,
        "total_emails_failed": 0,
        "total_leads_created": 0,
        "last_submission_at": null
      },
      "created_at": 1761913600000,
      "updated_at": 1762000000000
    },
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
web_forms.submission.received

A web form received a response

Fires once per real response to a published web form, after it is stored with its final state: payload (field name → value, exactly as submitted), whether the notification email went out (status success or email_failed), the auto-responder, the CRM lead it created when the form is linked to a lead source (lead_id, lead_type, person_id; the CRM also fires crm.lead.created) and the ad attribution captured by the MB Suite pixel. Responses dropped by the spam filters (honeypot, gibberish, bot signature, reCAPTCHA, rate limits) and test submissions sent from the editor do not fire it. The visitor's IP is never included.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "web_forms.submission.received",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "form": {
      "id": "6f1c2a9e4b7d4e0f8a3c5b2d1e9f7a6c",
      "name": "Sitio web — Contacto"
    },
    "submission": {
      "id": "Xk2Lp9QmV4rT8sWz1yBc",
      "form_id": "6f1c2a9e4b7d4e0f8a3c5b2d1e9f7a6c",
      "received_at": 1762000000000,
      "origin": "https://www.clinicanorte.com",
      "user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 14_5) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.5 Safari/605.1.15",
      "payload": {
        "nombre": "Mariana López",
        "email": "mariana@example.com",
        "telefono": "+54 9 11 5555-0123",
        "mensaje": "Quiero una cotización para el rediseño del sitio."
      },
      "status": "success",
      "rejection_reason": null,
      "email_sent": true,
      "email_message_id": "0100018f3c2b9d7e-4a1b2c3d-5e6f-7a8b-9c0d-1e2f3a4b5c6d-000000",
      "email_error": null,
      "notification_recipients": [
        "contacto@clinicanorte.com"
      ],
      "auto_responder_sent": false,
      "auto_responder_error": null,
      "auto_responder_skip_reason": null,
      "lead_created": true,
      "lead_id": "pr_9sD2",
      "lead_type": "prospect",
      "person_id": "pe_4hT1",
      "attribution": {
        "platform": "google",
        "attribution_method": "pixel_form_inject",
        "gclid": "Cj0KCQjw-example",
        "utm_source": "google",
        "utm_medium": "cpc",
        "utm_campaign": "rediseno-marzo",
        "landing_url": "https://www.clinicanorte.com/servicios/"
      }
    },
    "actor": {
      "uid": "system:web-forms",
      "name": "Sitio web — Contacto",
      "kind": "system"
    }
  }
}

Vault

vault.item.shared

Vault credentials were shared through a secure link

Fires once per secure link created in the Vault (Share access, from the MB Suite app): which credentials it includes (id and title), the client account they belong to, when it expires, whether it opens only once, whether it needs a key, and the recipient and note the creator wrote down. It never carries the link, its code, its key or any secret: the link is a bearer URL and only its creator can copy it from the app. Revoking, opening or blocking a link does not fire it.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "vault.item.shared",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "share": {
      "id": "Qm7Lp2Xz9KcR4tWv8NbE",
      "status": "active",
      "items": [
        {
          "id": "Vt9kQ2mLx8RzP4wB1cNd",
          "title": "clinicanorte.com — FTP"
        },
        {
          "id": "Hq3sW7eYt1UiO5pA9dFg",
          "title": "clinicanorte.com — Panel de hosting"
        }
      ],
      "assigned_child_org_id": "Gx5Bn2Mk8Rt4Lq7Wc1Zp",
      "expires_at": 1762604800000,
      "max_opens": null,
      "single_use": false,
      "requires_key": true,
      "recipient": {
        "name": "Mariana López",
        "email": "mariana@clinicanorte.com"
      },
      "note": "Accesos para la migración del sitio",
      "locale": "es",
      "created_by": "u_7KpQ2",
      "created_by_name": "Valentina Ríos",
      "created_at": 1762000000000
    },
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
vault.access.requested

An access request link was created for a client

Fires when someone creates an access request (Request access): a one-time link where a client enters the credentials the agency needs, which are encrypted on arrival and land in the Vault. Carries the client account, the slots asked for (type and suggested title), the message, the recipient written down and the expiry. Fires for requests made in the app, through the API (vault.requests.create) or by an internal script. It never carries the link or its code (a bearer URL): the person copies it from the app. When the client submits, vault.access.fulfilled fires.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "vault.access.requested",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "request": {
      "id": "Rk2Vn8Hc5Tq1Lw9Pz3Ya",
      "status": "pending",
      "assigned_child_org_id": "Gx5Bn2Mk8Rt4Lq7Wc1Zp",
      "child_org_name": "Clínica Norte",
      "slots": [
        {
          "id": "aB3dE5fG",
          "type": "ftp",
          "title": "clinicanorte.com — FTP"
        },
        {
          "id": "hJ7kL9mN",
          "type": "hosting_panel",
          "title": "clinicanorte.com — Panel de hosting"
        }
      ],
      "message": "Para avanzar con la migración necesitamos los accesos de abajo.",
      "recipient": {
        "name": "Mariana López",
        "email": "mariana@clinicanorte.com"
      },
      "expires_at": 1762604800000,
      "locale": "es",
      "created_by": "u_7KpQ2",
      "created_by_name": "Valentina Ríos",
      "created_at": 1762000000000
    },
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
vault.access.fulfilled

A client submitted the credentials of an access request

Fires once when a client submits an access request link: the credentials are already encrypted and stored in the Vault, assigned to the request's client account. Carries the request (id, account, who created it), the credentials created (id, title, type and whether a password came with them: never the password, the username or the server) and the name and email the client left, if any. The actor is the public link (kind system), not a member. The visitor's IP is never included.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "vault.access.fulfilled",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "request": {
      "id": "Rk2Vn8Hc5Tq1Lw9Pz3Ya",
      "assigned_child_org_id": "Gx5Bn2Mk8Rt4Lq7Wc1Zp",
      "child_org_name": "Clínica Norte",
      "created_by": "u_7KpQ2",
      "created_by_name": "Valentina Ríos"
    },
    "items": [
      {
        "id": "Vt9kQ2mLx8RzP4wB1cNd",
        "title": "clinicanorte.com — FTP",
        "type": "ftp",
        "has_secret": true
      },
      {
        "id": "Hq3sW7eYt1UiO5pA9dFg",
        "title": "clinicanorte.com — Panel de hosting",
        "type": "hosting_panel",
        "has_secret": true
      }
    ],
    "submitter": {
      "name": "Mariana López",
      "email": "mariana@clinicanorte.com"
    },
    "fulfilled_at": 1762086400000,
    "actor": {
      "uid": "system:vault-link",
      "name": "Public link",
      "kind": "system"
    }
  }
}

Activity

activity.entry.created

An activity entry was created

Fires when someone adds a note, a meeting or a milestone to the activity timeline, or replies to an entry (parent_entry_id set), from the app, the API, the MCP or MIA. In a workspace, child_org_id is the Account the entry is about. Carries the plain text, not the HTML. System events (auto_event) do not fire it: each one already has the event of its own module.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "activity.entry.created",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "entry": {
      "id": "ae_8Kq2LmZpV0bT7xL1aR9c",
      "type": "meeting",
      "title": "Revisión mensual con Clínica Norte",
      "meeting_date": 1761996400000,
      "attendee_ids": [
        "u_7KpQ2"
      ],
      "attendee_names": [
        "Valentina Ríos",
        "Martín Paz (Clínica Norte)"
      ],
      "agenda": "Resultados de septiembre y presupuesto de octubre",
      "notes_plain_text": "El cliente aprueba subir el presupuesto de búsqueda un 15 %.",
      "action_items": [
        {
          "id": "ai_1",
          "text": "Enviar la propuesta de presupuesto",
          "is_completed": false,
          "assignee_id": "u_7KpQ2",
          "assignee_name": "Valentina Ríos"
        }
      ],
      "child_org_id": "org_Cl1n1c4N0rt3",
      "child_org_name": "Clínica Norte",
      "label_ids": [
        "lbl_reuniones"
      ],
      "reply_count": 0,
      "is_pinned": false,
      "created_by_id": "u_7KpQ2",
      "created_by_name": "Valentina Ríos",
      "created_by_photo_url": null,
      "created_at": 1762000000000,
      "updated_at": 1762000000000
    },
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}

Profile

profile.profile.updated

The organization profile changed

Fires when the organization's profile changes through the API, the MCP or MIA (profile.profile.update): name, logo, website, industry, country, internal notes, social network URLs or the reporting currency and time zone. Carries the whole profile as it was saved and changed_fields with the paths that changed (name, social.youtube, reporting.timezone…). Saving the same values does not fire it. Edits made on the Profile screen do not fire it yet, and a slug change fires profile.slug.changed instead.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "profile.profile.updated",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "profile": {
      "id": "Qm7Lp2XvR9sTa4KwZ1cB",
      "name": "Clínica Norte",
      "slug": "clinica-norte",
      "logo": "https://mb-suite.com/api/v1/storage/public/organizations/Qm7Lp2XvR9sTa4KwZ1cB/branding/logo_20261101_clinica-norte.png",
      "website": "https://clinicanorte.com",
      "industry": "Salud / Medicina",
      "country": "ar",
      "notes": "Cuenta con dos sedes; la de Palermo abre los sábados.",
      "social": {
        "facebook": "https://facebook.com/clinicanorte",
        "instagram": "https://instagram.com/clinicanorte",
        "linkedin": null,
        "x": null,
        "youtube": "https://youtube.com/@clinicanorte",
        "tiktok": null
      },
      "reporting": {
        "currency": "ARS",
        "timezone": "America/Argentina/Buenos_Aires"
      },
      "updated_at": 1762000000000
    },
    "changed_fields": [
      "website",
      "social.instagram"
    ],
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
profile.slug.changed

The organization's slug changed

Fires when the organization's slug changes, from the Profile screen, the API or the MCP. The app's addresses (mb-suite.com/<slug>/…) and the public booking pages of the main domain (mb-suite.com/book/<slug>/…) moved to the new slug: links with previous_slug stop working, and previous_slug becomes available to other organizations. Custom domains are not affected.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "profile.slug.changed",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "organization": {
      "id": "Qm7Lp2XvR9sTa4KwZ1cB",
      "name": "Clínica Norte"
    },
    "slug": "clinica-norte",
    "previous_slug": "clinica-norte-palermo",
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}

Members

members.member.removed

A member left or was removed from the organization

Fires once per person who stops being a direct member of the organization: removed by an owner or admin (reason removed; from the app, the API, the MCP or MIA, one or many at once) or leaving on their own (reason left). Their API keys are suspended and the webhooks they created are turned off right after. member is the membership as it was before leaving.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "members.member.removed",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "member": {
      "user_id": "u_3bTz8",
      "email": "martin@agencia.com",
      "display_name": "Martín Paz",
      "role": "member",
      "joined_at": 1751632000000
    },
    "reason": "removed",
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
members.member.role_changed

A member's role changed

Fires when an owner or admin changes a member's role (owner, admin, member or viewer) from the app, the API, the MCP or MIA. member.role is the new role and previous_role the old one. Setting the same role again does not fire it.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "members.member.role_changed",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "member": {
      "user_id": "u_3bTz8",
      "email": "martin@agencia.com",
      "display_name": "Martín Paz",
      "role": "admin",
      "joined_at": 1751632000000
    },
    "previous_role": "member",
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
members.member.permissions_changed

A member's module permissions changed

Fires when the per-module permission overrides of a member or viewer change: edited by hand (source manual) or by applying a permission preset (source preset, one event per member). Carries the new maps: module_permissions for the organization and child_module_permissions for the member's assigned Accounts (module id → hidden, view_only or full_access; an absent module uses the role's default), and the preset they came from. Saving without changes does not fire it.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "members.member.permissions_changed",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "member": {
      "user_id": "u_3bTz8",
      "email": "martin@agencia.com",
      "display_name": "Martín Paz",
      "role": "member",
      "joined_at": 1751632000000,
      "module_permissions": {
        "crm": "view_only",
        "media_planner": "hidden"
      },
      "child_module_permissions": {},
      "applied_preset_id": "prs_Ventas"
    },
    "source": "preset",
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
members.invitation.created

Someone was invited to the organization

Fires when a new invitation is created (from the app, the API, the MCP or MIA), whether or not the invitation email was sent. Inviting again an email that already has a pending invitation reuses it and does not fire. The invitation is valid for 30 days; the person joins when they accept it.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "members.invitation.created",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "invitation": {
      "id": "inv_8sKq2",
      "email": "lucia@cliente.com",
      "role": "member",
      "invited_by": "Valentina Ríos",
      "invited_by_id": "u_7KpQ2",
      "created_at": 1762000000000,
      "expires_at": 1764592000000
    },
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}

Branding

branding.settings.updated

The brand kit changed

Fires when the organization's brand kit changes: app name, logos, favicon, report logo, colors, fonts or buttons, from the Branding screen, the API, the MCP or MIA. changed_fields lists the public names that changed; reset_section is colors, fonts or buttons when a whole section was reset to the MB Suite defaults (null otherwise). Saving the same values does not fire it.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "branding.settings.updated",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "settings": {
      "app_name": "Rocket Suite",
      "logo": "https://mb-suite.com/api/v1/storage/public/organizations/org_W0rksp4c3/branding/logo_20261101_rocket.png",
      "logo_dark": null,
      "logo_icon": null,
      "favicon": "https://mb-suite.com/api/v1/storage/public/organizations/org_W0rksp4c3/branding/favicon-1762000000000.png",
      "report_logo": null,
      "primary_color": "#148BEF",
      "accent_color": "#3195DA",
      "brand_colors": [
        "#0F172A",
        "#F97316"
      ],
      "heading_font": "Georgia, 'Times New Roman', serif",
      "heading_font_name": "Georgia",
      "body_font": "Helvetica, Arial, sans-serif",
      "body_font_name": "Helvetica",
      "button_shape": "rounded",
      "button_style": "filled",
      "button_color": "#148BEF",
      "button_text_color": "#FFFFFF",
      "configured_at": 1762000000000,
      "configured_by": "u_7KpQ2"
    },
    "changed_fields": [
      "primary_color",
      "accent_color"
    ],
    "reset_section": null,
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
branding.domain.added

A domain or subdomain was registered

Fires when the organization registers an address: its own domain or an MB Suite subdomain, for team access (the white-label app) or for the client portal (surface team_access or client_portal; kind custom_domain or subdomain). A custom domain starts unverified: branding.domain.verified fires once its DNS checks out. Changing the team subdomain fires branding.domain.removed for the old one too.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "branding.domain.added",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "domain": {
      "surface": "team_access",
      "kind": "custom_domain",
      "host": "app.rocketagencia.com",
      "label": null,
      "enabled": true,
      "verified": false,
      "added_at": 1762000000000
    },
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
branding.domain.removed

A domain or subdomain was removed

Fires when the organization removes an address (team access or client portal; custom domain or subdomain), and for the previous team subdomain when it is replaced. From then on that address no longer opens MB Suite; the DNS records at the registrar are not touched.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "branding.domain.removed",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "domain": {
      "surface": "team_access",
      "kind": "custom_domain",
      "host": "app.rocketagencia.com",
      "label": null,
      "enabled": true,
      "verified": true,
      "added_at": 1762000000000
    },
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
branding.domain.verified

A custom domain was verified

Fires once when a custom domain (team access or client portal) goes from unverified to verified: the hosting provider validated ownership and the DNS points to MB Suite, so the address starts serving the white-label app or the portal. It is checked when someone verifies it (Branding screen, client portal screen, branding.custom_domain.verify or branding.portal_domains.verify).

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "branding.domain.verified",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "domain": {
      "surface": "team_access",
      "kind": "custom_domain",
      "host": "app.rocketagencia.com",
      "label": null,
      "enabled": true,
      "verified": true,
      "added_at": 1762000000000
    },
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
branding.email_domain.verified

The sending domain was verified

Fires once when the organization's email sending domain goes from pending to verified in Amazon SES (DKIM and MAIL FROM found in the DNS), when someone checks it from the Branding screen, the API or the MCP. From then on its senders can be used: campaigns, flows, reports and shared emails go out from the organization's own addresses.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "branding.email_domain.verified",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "email_domain": {
      "domain": "rocketagencia.com",
      "status": "verified",
      "verified_at": 1762000000000,
      "default_sender": {
        "email": "hola@rocketagencia.com",
        "name": "Rocket Agencia"
      }
    },
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}

Client Portal

client_portal.client.invited

A client was invited to the portal

Fires when an invitation to the workspace's client portal is created, from the app, the API, the MCP or MIA. Carries the invitation (email, the accounts and sections the client will get, who invited, expires_at) and email_sent (false when the invitation was created but its email failed; resending does not fire it again). Never carries the registration link. client_portal.client.registered fires when the person creates their account.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "client_portal.client.invited",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "invitation": {
      "id": "8Zq2LmNpV0bT7xL1aR9c",
      "email": "marketing@clinicanorte.com",
      "display_name": "Laura Gómez",
      "assigned_child_org_ids": [
        "org_Cl1n1c4N0rt3"
      ],
      "enabled_modules": {
        "monitors": true,
        "dashboards": true,
        "reports": true,
        "paid_insights": true,
        "paid_media": true,
        "social_insights": false,
        "social_media": true,
        "social_competitors": false,
        "seo": true,
        "seo_rankings": false,
        "seo_site_auditor": false,
        "ai_chat": true,
        "apps_ads_visualizer": true,
        "apps_utm_builder": true
      },
      "status": "pending",
      "invited_by": "u_7KpQ2",
      "invited_by_name": "Valentina Ríos",
      "created_at": 1762000000000,
      "expires_at": 1764592000000
    },
    "email_sent": true,
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
client_portal.client.registered

An invited client created their portal account

Fires once when a person accepts a portal invitation and creates their account (email and password or Google): they can sign in from now on. Carries the new client (its id is their client id in client_portal.clients.*: email, accounts, sections, auth_provider) and invitation_id; the actor is the client. Clients given direct access with a password from the app do not fire it.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "client_portal.client.registered",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "client": {
      "id": "Uq4XyZp1R8sKm2Ln6Tb0Wd3EfGh1",
      "email": "marketing@clinicanorte.com",
      "display_name": "Laura Gómez",
      "status": "active",
      "assigned_child_org_ids": [
        "org_Cl1n1c4N0rt3"
      ],
      "enabled_modules": {
        "monitors": true,
        "dashboards": true,
        "reports": true,
        "paid_insights": true,
        "paid_media": true,
        "social_insights": false,
        "social_media": true,
        "social_competitors": false,
        "seo": true,
        "seo_rankings": false,
        "seo_site_auditor": false,
        "ai_chat": true,
        "apps_ads_visualizer": true,
        "apps_utm_builder": true
      },
      "auth_method": "invitation",
      "auth_provider": "password",
      "invitation_id": "8Zq2LmNpV0bT7xL1aR9c",
      "created_at": 1762003600000,
      "registered_at": 1762003600000,
      "last_accessed_at": 1762003700000
    },
    "invitation_id": "8Zq2LmNpV0bT7xL1aR9c",
    "actor": {
      "uid": "Uq4XyZp1R8sKm2Ln6Tb0Wd3EfGh1",
      "name": "Laura Gómez",
      "kind": "user"
    }
  }
}
client_portal.client.deactivated

A portal client lost access

Fires when a portal client is deactivated through the API, the MCP or MIA: they can no longer sign in and their open sessions ended (sessions_ended). Carries the client with status inactive. Nothing was deleted: client_portal.client.reactivated fires if access comes back. Deactivating from the app's client list does not fire it yet.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "client_portal.client.deactivated",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "client": {
      "id": "Uq4XyZp1R8sKm2Ln6Tb0Wd3EfGh1",
      "email": "marketing@clinicanorte.com",
      "display_name": "Laura Gómez",
      "status": "inactive",
      "assigned_child_org_ids": [
        "org_Cl1n1c4N0rt3"
      ],
      "enabled_modules": {
        "monitors": true,
        "dashboards": true,
        "reports": true,
        "paid_insights": true,
        "paid_media": true,
        "social_insights": false,
        "social_media": true,
        "social_competitors": false,
        "seo": true,
        "seo_rankings": false,
        "seo_site_auditor": false,
        "ai_chat": true,
        "apps_ads_visualizer": true,
        "apps_utm_builder": true
      },
      "auth_method": "invitation",
      "auth_provider": "password",
      "invitation_id": "8Zq2LmNpV0bT7xL1aR9c",
      "created_at": 1762003600000,
      "registered_at": 1762003600000,
      "last_accessed_at": 1762003700000
    },
    "sessions_ended": true,
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
client_portal.client.reactivated

A portal client got access back

Fires when a deactivated portal client is reactivated through the API, the MCP or MIA: they can sign in again with the same login and see the accounts and sections they had. Carries the client with status active. Reactivating from the app's client list does not fire it yet.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "client_portal.client.reactivated",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "client": {
      "id": "Uq4XyZp1R8sKm2Ln6Tb0Wd3EfGh1",
      "email": "marketing@clinicanorte.com",
      "display_name": "Laura Gómez",
      "status": "active",
      "assigned_child_org_ids": [
        "org_Cl1n1c4N0rt3"
      ],
      "enabled_modules": {
        "monitors": true,
        "dashboards": true,
        "reports": true,
        "paid_insights": true,
        "paid_media": true,
        "social_insights": false,
        "social_media": true,
        "social_competitors": false,
        "seo": true,
        "seo_rankings": false,
        "seo_site_auditor": false,
        "ai_chat": true,
        "apps_ads_visualizer": true,
        "apps_utm_builder": true
      },
      "auth_method": "invitation",
      "auth_provider": "password",
      "invitation_id": "8Zq2LmNpV0bT7xL1aR9c",
      "created_at": 1762003600000,
      "registered_at": 1762003600000,
      "last_accessed_at": 1762003700000
    },
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}

Integrations

integrations.credential.disconnected

A platform connection was disconnected

Fires when someone disconnects one of the organization's platform connections (Google Ads, Meta, TikTok, LinkedIn, YouTube, WhatsApp…), from the app, the API, the MCP or MIA, once per connection (disconnecting a whole platform fires one per connection). credential is its last state, without tokens; cleaned_data_sources lists the Data sources platforms that were unlinked with it and paused_lead_sources how many CRM lead sources were paused. Each unlinked account also fires integrations.data_source.unlinked. A connection removed by Meta itself (the person removed the app) does not fire it yet. One for LinkedIn or TikTok does not reach a webhook: their terms do not allow sending it the connected account's data.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "integrations.credential.disconnected",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "credential": {
      "id": "Kd8sPq2LmZ0vT7xA1bR9",
      "platform": "google_ads",
      "name": "Clínica Norte",
      "status": "active",
      "auth_error": null,
      "account": {
        "id": null,
        "name": "Valentina Ríos",
        "email": "valentina@clinicanorte.com"
      },
      "connected_by": "valentina@clinicanorte.com",
      "connected_at": 1754224000000,
      "token_expires_at": null,
      "refresh_token_expires_at": null,
      "last_reauthorized_at": null,
      "inherited": false,
      "owner_org_id": "org_Cl1n1c4N0rt3",
      "scope_status": "ok",
      "missing_scopes": []
    },
    "cleaned_data_sources": [
      "google_ads"
    ],
    "paused_lead_sources": 1,
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
integrations.data_source.linked

An account was linked in Data sources

Fires when an account of a platform (an ad account, analytics property, Search Console site, business profile, page, channel or WhatsApp number) is linked to the organization in Data sources, from the app, the API, the MCP or MIA (source manual) or by its workspace's bulk assignment (source bulk_assignment, fired in the Account). Refreshing an account that was already linked does not fire it. Accounts chosen inside an OAuth connection flow (Meta, TikTok, WhatsApp sign-up) do not fire it yet.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "integrations.data_source.linked",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "data_source": {
      "platform": "google_ads",
      "id": "1234567890",
      "composite_id": "google_ads:1234567890",
      "name": "Clínica Norte — Search",
      "is_default": true,
      "inherited": true,
      "source_org_id": "org_W0rksp4c3",
      "fields": {
        "external_customer_id": "1234567890",
        "name": "Clínica Norte — Search",
        "mcc_id": "9990001111",
        "currency": "ARS"
      }
    },
    "source": "manual",
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
integrations.data_source.unlinked

An account was unlinked from Data sources

Fires once per account that stops being linked to the organization in Data sources, with the reason: unlinked (that account), platform_unlinked (every account of its platform), replaced (another account took its place), credential_disconnected (its connection was disconnected), inheritance_deactivated (the workspace stopped connecting the platform in this Account), mode_changed (the Account switched the platform to its own connection) or bulk_assignment (the workspace's bulk assignment left the Account without it). data_source is its last state.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "integrations.data_source.unlinked",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "data_source": {
      "platform": "google_ads",
      "id": "1234567890",
      "composite_id": "google_ads:1234567890",
      "name": "Clínica Norte — Search",
      "is_default": true,
      "inherited": true,
      "source_org_id": "org_W0rksp4c3",
      "fields": {
        "external_customer_id": "1234567890",
        "name": "Clínica Norte — Search",
        "mcc_id": "9990001111",
        "currency": "ARS"
      }
    },
    "reason": "unlinked",
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}

Partners

partners.invitation.sent

A partner invitation was emailed

Fires when the workspace emails a partner invitation to the owner of another organization (from the app, the API, the MCP or MIA), and again on every resend (resent: true, with the new expires_at).

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "partners.invitation.sent",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "invitation": {
      "id": "pinv_8Zt2QmLx4RkV0bN7aYcE",
      "status": "pending",
      "recipient_email": "owner@clinicanorte.example",
      "parent_org_id": "org_W0rksp4c3",
      "parent_org_name": "Agencia Rocket",
      "invited_by": "u_7KpQ2",
      "invited_by_name": "Valentina Ríos",
      "invited_by_email": "valentina@agenciarocket.example",
      "created_at": 1762000000000,
      "expires_at": 1762604800000,
      "responded_at": null,
      "cancelled_at": null,
      "child_org_id": null,
      "child_org_name": null
    },
    "resent": false,
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
partners.invitation.accepted

An organization accepted the invitation and is now an account

Fires when the invited person accepts a partner invitation in the MB Suite app with one of the organizations they own: from now on it is an account of the workspace (account), still paying its own subscription (billing mode self_pays). The actor is the person who accepted, from the other organization.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "partners.invitation.accepted",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "invitation": {
      "id": "pinv_8Zt2QmLx4RkV0bN7aYcE",
      "status": "accepted",
      "recipient_email": "owner@clinicanorte.example",
      "parent_org_id": "org_W0rksp4c3",
      "parent_org_name": "Agencia Rocket",
      "invited_by": "u_7KpQ2",
      "invited_by_name": "Valentina Ríos",
      "invited_by_email": "valentina@agenciarocket.example",
      "created_at": 1762000000000,
      "expires_at": 1762604800000,
      "responded_at": 1762086400000,
      "cancelled_at": null,
      "child_org_id": "org_Cl1n1c4N0rt3",
      "child_org_name": "Clínica Norte"
    },
    "account": {
      "id": "org_Cl1n1c4N0rt3",
      "name": "Clínica Norte"
    },
    "actor": {
      "uid": "u_2Wd8Xs",
      "name": "Martín Paz",
      "kind": "user"
    }
  }
}
partners.invitation.declined

The invited person declined a partner invitation

Fires when the invited person declines a partner invitation in the MB Suite app. The actor is that person, from outside the workspace.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "partners.invitation.declined",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "invitation": {
      "id": "pinv_8Zt2QmLx4RkV0bN7aYcE",
      "status": "declined",
      "recipient_email": "owner@clinicanorte.example",
      "parent_org_id": "org_W0rksp4c3",
      "parent_org_name": "Agencia Rocket",
      "invited_by": "u_7KpQ2",
      "invited_by_name": "Valentina Ríos",
      "invited_by_email": "valentina@agenciarocket.example",
      "created_at": 1762000000000,
      "expires_at": 1762604800000,
      "responded_at": 1762086400000,
      "cancelled_at": null,
      "child_org_id": null,
      "child_org_name": null
    },
    "actor": {
      "uid": "u_2Wd8Xs",
      "name": "Martín Paz",
      "kind": "user"
    }
  }
}
partners.invitation.cancelled

The workspace cancelled a partner invitation

Fires when the workspace cancels a pending partner invitation (from the app, the API, the MCP or MIA). Cancelling one that was already cancelled does not fire it again.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "partners.invitation.cancelled",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "invitation": {
      "id": "pinv_8Zt2QmLx4RkV0bN7aYcE",
      "status": "cancelled",
      "recipient_email": "owner@clinicanorte.example",
      "parent_org_id": "org_W0rksp4c3",
      "parent_org_name": "Agencia Rocket",
      "invited_by": "u_7KpQ2",
      "invited_by_name": "Valentina Ríos",
      "invited_by_email": "valentina@agenciarocket.example",
      "created_at": 1762000000000,
      "expires_at": 1762604800000,
      "responded_at": null,
      "cancelled_at": 1762086400000,
      "child_org_id": null,
      "child_org_name": null
    },
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
partners.billing_transition.requested

The workspace asked an account to move its billing to the agency

Fires when the workspace asks one of its self_pays accounts to be paid by the agency (from the app, the API, the MCP or MIA). Nothing changes in billing until the account accepts.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "partners.billing_transition.requested",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "billing_transition": {
      "id": "btr_3Hq9LmZpV0bT7xL1aR2d",
      "status": "pending",
      "direction": "to_parent_pays",
      "parent_org_id": "org_W0rksp4c3",
      "parent_org_name": "Agencia Rocket",
      "child_org_id": "org_Cl1n1c4N0rt3",
      "child_org_name": "Clínica Norte",
      "requested_by": "u_7KpQ2",
      "requested_by_name": "Valentina Ríos",
      "created_at": 1762000000000,
      "scheduled_for": null,
      "accepted_at": null,
      "accepted_by": null,
      "completed_at": null,
      "rejected_at": null,
      "rejected_by": null,
      "rejected_by_name": null,
      "cancelled_at": null,
      "cancelled_by": null,
      "cancelled_by_name": null
    },
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}
partners.billing_transition.scheduled

The account accepted: its billing moves to the agency at the end of its period

Fires when the account accepts the request in the MB Suite app while it has an active subscription: the subscription will not renew and, at scheduled_for (the end of its paid period), the agency starts paying for it (partners.billing_transition.completed). An account on a trial or without a subscription moves at once and fires only .completed.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "partners.billing_transition.scheduled",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "billing_transition": {
      "id": "btr_3Hq9LmZpV0bT7xL1aR2d",
      "status": "scheduled",
      "direction": "to_parent_pays",
      "parent_org_id": "org_W0rksp4c3",
      "parent_org_name": "Agencia Rocket",
      "child_org_id": "org_Cl1n1c4N0rt3",
      "child_org_name": "Clínica Norte",
      "requested_by": "u_7KpQ2",
      "requested_by_name": "Valentina Ríos",
      "created_at": 1762000000000,
      "scheduled_for": 1763728000000,
      "accepted_at": 1762086400000,
      "accepted_by": "u_2Wd8Xs",
      "completed_at": null,
      "rejected_at": null,
      "rejected_by": null,
      "rejected_by_name": null,
      "cancelled_at": null,
      "cancelled_by": null,
      "cancelled_by_name": null
    },
    "actor": {
      "uid": "u_2Wd8Xs",
      "name": "Martín Paz",
      "kind": "user"
    }
  }
}
partners.billing_transition.completed

The agency now pays for the account

Fires when the move is executed: the account switches to billing mode parent_pays (the agency pays for its modules from its next invoice) and inherits the agency's integrations. It runs when the account accepts on a trial, or by the system when its paid period ends (actor kind system).

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "partners.billing_transition.completed",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "billing_transition": {
      "id": "btr_3Hq9LmZpV0bT7xL1aR2d",
      "status": "completed",
      "direction": "to_parent_pays",
      "parent_org_id": "org_W0rksp4c3",
      "parent_org_name": "Agencia Rocket",
      "child_org_id": "org_Cl1n1c4N0rt3",
      "child_org_name": "Clínica Norte",
      "requested_by": "u_7KpQ2",
      "requested_by_name": "Valentina Ríos",
      "created_at": 1762000000000,
      "scheduled_for": 1763728000000,
      "accepted_at": 1762086400000,
      "accepted_by": "u_2Wd8Xs",
      "completed_at": 1763728000000,
      "rejected_at": null,
      "rejected_by": null,
      "rejected_by_name": null,
      "cancelled_at": null,
      "cancelled_by": null,
      "cancelled_by_name": null
    },
    "actor": {
      "uid": "system:billing-transition",
      "name": "Billing transitions",
      "kind": "system"
    }
  }
}
partners.billing_transition.rejected

The account rejected the request

Fires when the account's owner or admin rejects the request (from the app, the API, the MCP or MIA): the account keeps paying its own subscription.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "partners.billing_transition.rejected",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "billing_transition": {
      "id": "btr_3Hq9LmZpV0bT7xL1aR2d",
      "status": "rejected",
      "direction": "to_parent_pays",
      "parent_org_id": "org_W0rksp4c3",
      "parent_org_name": "Agencia Rocket",
      "child_org_id": "org_Cl1n1c4N0rt3",
      "child_org_name": "Clínica Norte",
      "requested_by": "u_7KpQ2",
      "requested_by_name": "Valentina Ríos",
      "created_at": 1762000000000,
      "scheduled_for": null,
      "accepted_at": null,
      "accepted_by": null,
      "completed_at": null,
      "rejected_at": 1762086400000,
      "rejected_by": "u_2Wd8Xs",
      "rejected_by_name": "Martín Paz",
      "cancelled_at": null,
      "cancelled_by": null,
      "cancelled_by_name": null
    },
    "actor": {
      "uid": "u_2Wd8Xs",
      "name": "Martín Paz",
      "kind": "user"
    }
  }
}
partners.billing_transition.cancelled

A billing transition request was cancelled

Fires when either side cancels a pending request (from the app, the API, the MCP or MIA), or a scheduled one from the app (the account's subscription renews again). Nothing changes in billing.

{
  "id": "evt_4f9c1a7e2b6d0c3a8e5f1b9d2c",
  "type": "partners.billing_transition.cancelled",
  "created_at": "2025-11-01T12:26:40.000Z",
  "api_version": "2026-11-01",
  "org_id": "ORG_ID",
  "data": {
    "billing_transition": {
      "id": "btr_3Hq9LmZpV0bT7xL1aR2d",
      "status": "cancelled",
      "direction": "to_parent_pays",
      "parent_org_id": "org_W0rksp4c3",
      "parent_org_name": "Agencia Rocket",
      "child_org_id": "org_Cl1n1c4N0rt3",
      "child_org_name": "Clínica Norte",
      "requested_by": "u_7KpQ2",
      "requested_by_name": "Valentina Ríos",
      "created_at": 1762000000000,
      "scheduled_for": null,
      "accepted_at": null,
      "accepted_by": null,
      "completed_at": null,
      "rejected_at": null,
      "rejected_by": null,
      "rejected_by_name": null,
      "cancelled_at": 1762086400000,
      "cancelled_by": "u_7KpQ2",
      "cancelled_by_name": "Valentina Ríos"
    },
    "actor": {
      "uid": "u_7KpQ2",
      "name": "Valentina Ríos",
      "kind": "user"
    }
  }
}