Site event catalog
With syncing on, a connected site tells Joinotify what happens on it,
one event at a time. Each event has a name shaped as <source>.<object>.<what happened> —
wc.order.paid, wp.user.registered — and that name is what the Site event trigger and the
Wait for event step listen to.
The samples on this page are the same ones the plugin reports to the panel and the editor shows under Event sample: made-up values, in the exact shape of the real data.
Which events a site sends
Each source only sends when its plugin is active in WordPress and the matching option is on in the sync window:
| Source | Needs | Sync option |
|---|---|---|
| WooCommerce | WooCommerce | WooCommerce orders and customers |
| Subscriptions | WooCommerce Subscriptions | WooCommerce orders and customers |
| WordPress | — | WordPress users |
| Forms | WPForms or Elementor Pro | Form submissions (off by default) |
| Flexify Checkout | Flexify Checkout with cart recovery | Abandoned carts |
| Custom | Your own code | — |
The envelope
Each event arrives with what happened (data) and who it is about (contact):
{
"id": "5b0e7c3a-9f41-4d2a-8c7e-1f6a2b9d0e34",
"name": "wp.user.registered",
"occurred_at": "2026-09-24T12:00:00Z",
"schema_version": 1,
"site_url": "https://example.com",
"contact": {
"ref": { "kind": "wp_user", "id": "42" },
"phone": "+5511987654321",
"country": "BR",
"first_name": "Ana",
"last_name": "Souza",
"attributes": {
"wp_registered_at": "2026-09-24T12:00:00Z",
"wp_role": "customer"
},
"tags": ["My Store"],
"consent": {
"status": "opted_in",
"evidence": "I want to receive offers on WhatsApp. — sign-up — example.com",
"at": "2026-09-24T12:00:00Z"
}
},
"data": {
"user": {
"id": 42,
"first_name": "Ana",
"last_name": "Souza",
"roles": ["customer"],
"registered_at": "2026-09-24T12:00:00Z"
}
}
}
| Field | What it is |
|---|---|
id | An id the site generated when it recorded the event. The same id sent again is ignored |
name | The event's name |
occurred_at | When it happened on the site, in ISO 8601 and UTC |
schema_version | The version of the shape of data — 1 today |
site_url | The site's address. If it differs from the connected address, the whole batch is refused (see staging copies) |
contact | Who the event is about. Optional |
data | The event's data — what each section below describes |
The contact block
| Field | What it is |
|---|---|
ref | Who the person is on the site: { "kind": …, "id": … } |
phone, country | The phone number and the billing country, which says how to read a number without its country code |
first_name, last_name, email | Name and e-mail |
attributes | The store fields on the contact: orders, total spent, last purchase… |
tags | The site's source tag |
consent | The marketing consent, when the site asks for it |
The ref kind is one of these:
kind | In the panel | id |
|---|---|---|
wp_user | WordPress user | The user id |
wc_customer | WooCommerce customer | The customer's user id |
wc_guest | Buyer without an account | The SHA-256 of the lowercase e-mail (or of the phone, without e-mail) |
lead | Form or cart lead | The same hash as a buyer without an account |
Joinotify looks the contact up by the ref first and by the phone after — the ref is what keeps
a customer who changed numbers as one contact. Without a phone and without an earlier link, no
contact is created: the event is recorded with the status No contact.
The attributes go to the store fields the platform creates in the account — Orders
(wc_orders_count), Total spent, Average order value, First purchase, Last
purchase, Last order status, City, State, Registered on the site, Role on the
site and, with subscriptions, Subscription status and Next payment. They are a snapshot
the site computes: they replace the previous value instead of adding to it.
The consent is { "status": "opted_in", "evidence": …, "at": … } when the person ticked the
marketing checkbox — the evidence joins the checkbox text, where it was ticked and the site — or
{ "status": "opted_out", "reason": "my_account" } when they unticked the preference in My
account.
The data in a flow
An event's data is what the flow reads as {{trigger.<path>}}:
| Variable | Renders |
|---|---|
{{trigger.order.number}} | 1234 |
{{trigger.order.total:money}} | R$ 189,90 |
{{trigger.order.line_items[0].name}} | Café especial 500 g |
{{trigger.links.payment_url}} | The link to pay for the order |
{{trigger.customer.orders_count}} | 3 |
The platform adds two keys to every event:
| Key | Carries | Example |
|---|---|---|
$event | The event's id, name and occurred_at | {{trigger.$event.name}} |
$site | The id, url and name of the connected site that sent it | {{trigger.$site.name}} |
The contact block is not under trigger: it becomes the run's contact, and the flow reads the
person with the contact variables — {{first_name}}, {{field.wc_total_spent}}. The paths of the
Filter, of Act once per and of Wait for event start from data too: order.id,
order.status, cart.id. The full syntax is in Variables in flows.
Recurring blocks
Order, subscription, user and cart events share the same blocks. The shape is the WooCommerce REST
API's, with raw values: totals as decimal strings ("189.90"), dates in ISO 8601 and UTC,
statuses without the wc- prefix.
order
{
"id": 1234,
"number": "1234",
"status": "pending",
"currency": "BRL",
"total": "189.90",
"subtotal": "179.90",
"discount_total": "10.00",
"shipping_total": "20.00",
"total_tax": "0.00",
"payment_method": "pix",
"payment_method_title": "Pix",
"date_created": "2026-09-24T12:00:00Z",
"date_paid": null,
"customer_id": 42,
"customer_note": "",
"billing": {
"first_name": "Ana",
"last_name": "Souza",
"phone": "+5511987654321",
"city": "São Paulo",
"state": "SP",
"country": "BR"
},
"shipping": {
"city": "São Paulo",
"state": "SP",
"country": "BR"
},
"shipping_lines": [
{
"method_id": "flat_rate",
"method_title": "SEDEX",
"total": "20.00"
}
],
"line_items": [
{
"product_id": 77,
"variation_id": 0,
"sku": "CAFE-500",
"name": "Café especial 500 g",
"quantity": 2,
"price": "89.95",
"total": "179.90",
"categories": ["Cafés"]
}
],
"coupon_lines": [
{
"code": "BEMVINDO10",
"discount": "10.00"
}
]
}
line_itemsonly comes with the Send the items of each order option (on by default).- Billing and shipping carry city, state and country. With Send billing and shipping
addresses,
billingaddscompany,address_1,address_2andpostcode, andshippingaddsfirst_name,last_name,address_1,address_2,postcodeandphone. customer_idis0on an order placed without an account.
customer
{
"id": 42,
"orders_count": 3,
"total_spent": "540.90",
"avg_order_value": "180.30",
"first_order_at": "2026-03-02T15:10:00Z",
"last_order_at": "2026-09-24T12:00:00Z",
"last_order_status": "completed",
"is_first_order": false
}
A snapshot of the customer's history in the store, computed from paid orders (the statuses
WooCommerce counts as paid — processing and completed, by default), with refunds taken out of
total_spent. A buyer without an account is recognized by the e-mail of their orders and comes
with id 0. last_order_status is the status of the last paid order.
is_first_order only comes on order events: on a paid order, it is true when that is the
customer's only paid order; on an order not paid yet, it is true when the customer has no paid
order.
links
{
"payment_url": "https://example.com/checkout/order-pay/1234/?pay_for_order=true&key=wc_order_example",
"order_received_url": "https://example.com/checkout/order-received/1234/?key=wc_order_example",
"my_account_url": "https://example.com/minha-conta/view-order/1234/",
"review_urls": ["https://example.com/produto/cafe-especial/#reviews"]
}
payment_url pays for a pending order, order_received_url and my_account_url show the order,
and review_urls has the page of each product bought, already on the reviews tab.
subscription
{
"id": 900,
"status": "pending",
"total": "59.90",
"currency": "BRL",
"billing_period": "month",
"billing_interval": 1,
"next_payment_at": "2026-10-24T12:00:00Z",
"customer_id": 42,
"billing": {
"first_name": "Ana",
"last_name": "Souza",
"phone": "+5511987654321",
"city": "São Paulo",
"state": "SP",
"country": "BR"
},
"line_items": [
{
"product_id": 88,
"variation_id": 0,
"sku": "CLUBE-CAFE",
"name": "Clube do café",
"quantity": 1,
"price": "59.90",
"total": "59.90",
"categories": ["Assinaturas"]
}
]
}
user
{
"id": 42,
"first_name": "Ana",
"last_name": "Souza",
"roles": ["customer"],
"registered_at": "2026-09-24T12:00:00Z"
}
cart
{
"id": 555,
"total": "189.90",
"currency": "BRL",
"recovery_url": "https://example.com/checkout/?recovery_cart=555",
"first_name": "Ana",
"last_name": "Souza",
"phone": "+5511987654321"
}
WooCommerce
| Event | In the panel |
|---|---|
wc.order.created | Order created |
wc.order.paid | Order paid |
wc.order.status_changed | Order status changed |
wc.order.completed | Order completed |
wc.order.cancelled | Order cancelled |
wc.order.failed | Order payment failed |
wc.order.refunded | Order refunded |
wc.customer.created | Customer registered in the store |
The contact of order events is the buyer: wc_customer when they have an account, wc_guest when
they do not. The phone is the billing one — or the shipping one, when billing has none.
wc.order.created
When the customer places the order at checkout, classic or block. Once per order.
Sample data
{
"order": {
"id": 1234,
"number": "1234",
"status": "pending",
"currency": "BRL",
"total": "189.90",
"subtotal": "179.90",
"discount_total": "10.00",
"shipping_total": "20.00",
"total_tax": "0.00",
"payment_method": "pix",
"payment_method_title": "Pix",
"date_created": "2026-09-24T12:00:00Z",
"date_paid": null,
"customer_id": 42,
"customer_note": "",
"billing": {
"first_name": "Ana",
"last_name": "Souza",
"phone": "+5511987654321",
"city": "São Paulo",
"state": "SP",
"country": "BR"
},
"shipping": {
"city": "São Paulo",
"state": "SP",
"country": "BR"
},
"shipping_lines": [
{
"method_id": "flat_rate",
"method_title": "SEDEX",
"total": "20.00"
}
],
"line_items": [
{
"product_id": 77,
"variation_id": 0,
"sku": "CAFE-500",
"name": "Café especial 500 g",
"quantity": 2,
"price": "89.95",
"total": "179.90",
"categories": ["Cafés"]
}
],
"coupon_lines": [
{
"code": "BEMVINDO10",
"discount": "10.00"
}
]
},
"customer": {
"id": 42,
"orders_count": 3,
"total_spent": "540.90",
"avg_order_value": "180.30",
"first_order_at": "2026-03-02T15:10:00Z",
"last_order_at": "2026-09-24T12:00:00Z",
"last_order_status": "completed",
"is_first_order": false
},
"links": {
"payment_url": "https://example.com/checkout/order-pay/1234/?pay_for_order=true&key=wc_order_example",
"order_received_url": "https://example.com/checkout/order-received/1234/?key=wc_order_example",
"my_account_url": "https://example.com/minha-conta/view-order/1234/",
"review_urls": ["https://example.com/produto/cafe-especial/#reviews"]
}
}
wc.order.paid
The first time the order enters a paid status, or when the payment method confirms the payment. Once per order, even if the status goes back and forth afterwards.
Sample data
{
"order": {
"id": 1234,
"number": "1234",
"status": "processing",
"currency": "BRL",
"total": "189.90",
"subtotal": "179.90",
"discount_total": "10.00",
"shipping_total": "20.00",
"total_tax": "0.00",
"payment_method": "pix",
"payment_method_title": "Pix",
"date_created": "2026-09-24T12:00:00Z",
"date_paid": "2026-09-24T12:05:00Z",
"customer_id": 42,
"customer_note": "",
"billing": {
"first_name": "Ana",
"last_name": "Souza",
"phone": "+5511987654321",
"city": "São Paulo",
"state": "SP",
"country": "BR"
},
"shipping": {
"city": "São Paulo",
"state": "SP",
"country": "BR"
},
"shipping_lines": [
{
"method_id": "flat_rate",
"method_title": "SEDEX",
"total": "20.00"
}
],
"line_items": [
{
"product_id": 77,
"variation_id": 0,
"sku": "CAFE-500",
"name": "Café especial 500 g",
"quantity": 2,
"price": "89.95",
"total": "179.90",
"categories": ["Cafés"]
}
],
"coupon_lines": [
{
"code": "BEMVINDO10",
"discount": "10.00"
}
]
},
"customer": {
"id": 42,
"orders_count": 3,
"total_spent": "540.90",
"avg_order_value": "180.30",
"first_order_at": "2026-03-02T15:10:00Z",
"last_order_at": "2026-09-24T12:00:00Z",
"last_order_status": "completed",
"is_first_order": false
},
"links": {
"payment_url": "https://example.com/checkout/order-pay/1234/?pay_for_order=true&key=wc_order_example",
"order_received_url": "https://example.com/checkout/order-received/1234/?key=wc_order_example",
"my_account_url": "https://example.com/minha-conta/view-order/1234/",
"review_urls": ["https://example.com/produto/cafe-especial/#reviews"]
}
}
wc.order.status_changed
On every status change, with the previous status in status_from and the new one in
status_to. For the flow to act only once per order, use Act once per order.id on the
trigger.
Sample data
{
"order": {
"id": 1234,
"number": "1234",
"status": "pending",
"currency": "BRL",
"total": "189.90",
"subtotal": "179.90",
"discount_total": "10.00",
"shipping_total": "20.00",
"total_tax": "0.00",
"payment_method": "pix",
"payment_method_title": "Pix",
"date_created": "2026-09-24T12:00:00Z",
"date_paid": null,
"customer_id": 42,
"customer_note": "",
"billing": {
"first_name": "Ana",
"last_name": "Souza",
"phone": "+5511987654321",
"city": "São Paulo",
"state": "SP",
"country": "BR"
},
"shipping": {
"city": "São Paulo",
"state": "SP",
"country": "BR"
},
"shipping_lines": [
{
"method_id": "flat_rate",
"method_title": "SEDEX",
"total": "20.00"
}
],
"line_items": [
{
"product_id": 77,
"variation_id": 0,
"sku": "CAFE-500",
"name": "Café especial 500 g",
"quantity": 2,
"price": "89.95",
"total": "179.90",
"categories": ["Cafés"]
}
],
"coupon_lines": [
{
"code": "BEMVINDO10",
"discount": "10.00"
}
]
},
"status_from": "pending",
"status_to": "processing",
"customer": {
"id": 42,
"orders_count": 3,
"total_spent": "540.90",
"avg_order_value": "180.30",
"first_order_at": "2026-03-02T15:10:00Z",
"last_order_at": "2026-09-24T12:00:00Z",
"last_order_status": "completed",
"is_first_order": false
},
"links": {
"payment_url": "https://example.com/checkout/order-pay/1234/?pay_for_order=true&key=wc_order_example",
"order_received_url": "https://example.com/checkout/order-received/1234/?key=wc_order_example",
"my_account_url": "https://example.com/minha-conta/view-order/1234/",
"review_urls": ["https://example.com/produto/cafe-especial/#reviews"]
}
}
wc.order.completed
Every time the order enters the completed status.
Sample data
{
"order": {
"id": 1234,
"number": "1234",
"status": "completed",
"currency": "BRL",
"total": "189.90",
"subtotal": "179.90",
"discount_total": "10.00",
"shipping_total": "20.00",
"total_tax": "0.00",
"payment_method": "pix",
"payment_method_title": "Pix",
"date_created": "2026-09-24T12:00:00Z",
"date_paid": null,
"customer_id": 42,
"customer_note": "",
"billing": {
"first_name": "Ana",
"last_name": "Souza",
"phone": "+5511987654321",
"city": "São Paulo",
"state": "SP",
"country": "BR"
},
"shipping": {
"city": "São Paulo",
"state": "SP",
"country": "BR"
},
"shipping_lines": [
{
"method_id": "flat_rate",
"method_title": "SEDEX",
"total": "20.00"
}
],
"line_items": [
{
"product_id": 77,
"variation_id": 0,
"sku": "CAFE-500",
"name": "Café especial 500 g",
"quantity": 2,
"price": "89.95",
"total": "179.90",
"categories": ["Cafés"]
}
],
"coupon_lines": [
{
"code": "BEMVINDO10",
"discount": "10.00"
}
]
},
"customer": {
"id": 42,
"orders_count": 3,
"total_spent": "540.90",
"avg_order_value": "180.30",
"first_order_at": "2026-03-02T15:10:00Z",
"last_order_at": "2026-09-24T12:00:00Z",
"last_order_status": "completed",
"is_first_order": false
},
"links": {
"payment_url": "https://example.com/checkout/order-pay/1234/?pay_for_order=true&key=wc_order_example",
"order_received_url": "https://example.com/checkout/order-received/1234/?key=wc_order_example",
"my_account_url": "https://example.com/minha-conta/view-order/1234/",
"review_urls": ["https://example.com/produto/cafe-especial/#reviews"]
}
}
wc.order.cancelled
Every time the order enters the cancelled status.
Sample data
{
"order": {
"id": 1234,
"number": "1234",
"status": "cancelled",
"currency": "BRL",
"total": "189.90",
"subtotal": "179.90",
"discount_total": "10.00",
"shipping_total": "20.00",
"total_tax": "0.00",
"payment_method": "pix",
"payment_method_title": "Pix",
"date_created": "2026-09-24T12:00:00Z",
"date_paid": null,
"customer_id": 42,
"customer_note": "",
"billing": {
"first_name": "Ana",
"last_name": "Souza",
"phone": "+5511987654321",
"city": "São Paulo",
"state": "SP",
"country": "BR"
},
"shipping": {
"city": "São Paulo",
"state": "SP",
"country": "BR"
},
"shipping_lines": [
{
"method_id": "flat_rate",
"method_title": "SEDEX",
"total": "20.00"
}
],
"line_items": [
{
"product_id": 77,
"variation_id": 0,
"sku": "CAFE-500",
"name": "Café especial 500 g",
"quantity": 2,
"price": "89.95",
"total": "179.90",
"categories": ["Cafés"]
}
],
"coupon_lines": [
{
"code": "BEMVINDO10",
"discount": "10.00"
}
]
},
"customer": {
"id": 42,
"orders_count": 3,
"total_spent": "540.90",
"avg_order_value": "180.30",
"first_order_at": "2026-03-02T15:10:00Z",
"last_order_at": "2026-09-24T12:00:00Z",
"last_order_status": "completed",
"is_first_order": false
},
"links": {
"payment_url": "https://example.com/checkout/order-pay/1234/?pay_for_order=true&key=wc_order_example",
"order_received_url": "https://example.com/checkout/order-received/1234/?key=wc_order_example",
"my_account_url": "https://example.com/minha-conta/view-order/1234/",
"review_urls": ["https://example.com/produto/cafe-especial/#reviews"]
}
}
wc.order.failed
Every time the order enters the failed status.
Sample data
{
"order": {
"id": 1234,
"number": "1234",
"status": "failed",
"currency": "BRL",
"total": "189.90",
"subtotal": "179.90",
"discount_total": "10.00",
"shipping_total": "20.00",
"total_tax": "0.00",
"payment_method": "pix",
"payment_method_title": "Pix",
"date_created": "2026-09-24T12:00:00Z",
"date_paid": null,
"customer_id": 42,
"customer_note": "",
"billing": {
"first_name": "Ana",
"last_name": "Souza",
"phone": "+5511987654321",
"city": "São Paulo",
"state": "SP",
"country": "BR"
},
"shipping": {
"city": "São Paulo",
"state": "SP",
"country": "BR"
},
"shipping_lines": [
{
"method_id": "flat_rate",
"method_title": "SEDEX",
"total": "20.00"
}
],
"line_items": [
{
"product_id": 77,
"variation_id": 0,
"sku": "CAFE-500",
"name": "Café especial 500 g",
"quantity": 2,
"price": "89.95",
"total": "179.90",
"categories": ["Cafés"]
}
],
"coupon_lines": [
{
"code": "BEMVINDO10",
"discount": "10.00"
}
]
},
"customer": {
"id": 42,
"orders_count": 3,
"total_spent": "540.90",
"avg_order_value": "180.30",
"first_order_at": "2026-03-02T15:10:00Z",
"last_order_at": "2026-09-24T12:00:00Z",
"last_order_status": "completed",
"is_first_order": false
},
"links": {
"payment_url": "https://example.com/checkout/order-pay/1234/?pay_for_order=true&key=wc_order_example",
"order_received_url": "https://example.com/checkout/order-received/1234/?key=wc_order_example",
"my_account_url": "https://example.com/minha-conta/view-order/1234/",
"review_urls": ["https://example.com/produto/cafe-especial/#reviews"]
}
}
wc.order.refunded
On every refund, partial or full. refund.full is true when the refunded amount reaches the
order total.
Sample data
{
"order": {
"id": 1234,
"number": "1234",
"status": "refunded",
"currency": "BRL",
"total": "189.90",
"subtotal": "179.90",
"discount_total": "10.00",
"shipping_total": "20.00",
"total_tax": "0.00",
"payment_method": "pix",
"payment_method_title": "Pix",
"date_created": "2026-09-24T12:00:00Z",
"date_paid": null,
"customer_id": 42,
"customer_note": "",
"billing": {
"first_name": "Ana",
"last_name": "Souza",
"phone": "+5511987654321",
"city": "São Paulo",
"state": "SP",
"country": "BR"
},
"shipping": {
"city": "São Paulo",
"state": "SP",
"country": "BR"
},
"shipping_lines": [
{
"method_id": "flat_rate",
"method_title": "SEDEX",
"total": "20.00"
}
],
"line_items": [
{
"product_id": 77,
"variation_id": 0,
"sku": "CAFE-500",
"name": "Café especial 500 g",
"quantity": 2,
"price": "89.95",
"total": "179.90",
"categories": ["Cafés"]
}
],
"coupon_lines": [
{
"code": "BEMVINDO10",
"discount": "10.00"
}
]
},
"refund": {
"id": 1235,
"amount": "189.90",
"reason": "Produto com defeito",
"full": true
},
"customer": {
"id": 42,
"orders_count": 3,
"total_spent": "540.90",
"avg_order_value": "180.30",
"first_order_at": "2026-03-02T15:10:00Z",
"last_order_at": "2026-09-24T12:00:00Z",
"last_order_status": "completed",
"is_first_order": false
},
"links": {
"payment_url": "https://example.com/checkout/order-pay/1234/?pay_for_order=true&key=wc_order_example",
"order_received_url": "https://example.com/checkout/order-received/1234/?key=wc_order_example",
"my_account_url": "https://example.com/minha-conta/view-order/1234/",
"review_urls": ["https://example.com/produto/cafe-especial/#reviews"]
}
}
wc.customer.created
When WooCommerce creates a customer account — at checkout or in the My account sign-up. The
contact comes as wc_customer. With the users option on, the same sign-up also sends
wp.user.registered.
Sample data
{
"customer": {
"id": 42,
"first_name": "Ana",
"last_name": "Souza",
"roles": ["customer"],
"registered_at": "2026-09-24T12:00:00Z",
"orders_count": 0
}
}
Subscriptions
With WooCommerce Subscriptions active. The contact is the subscriber, and the subscription's
line_items follows the same option as the order items.
| Event | In the panel |
|---|---|
wcs.subscription.created | Subscription created |
wcs.subscription.activated | Subscription activated |
wcs.subscription.payment_complete | Subscription payment approved |
wcs.subscription.payment_failed | Subscription payment failed |
wcs.subscription.expired | Subscription expired |
wcs.subscription.cancelled | Subscription cancelled |
wcs.subscription.created
When the subscription is created at checkout, with the order that created it in order.
Sample data
{
"subscription": {
"id": 900,
"status": "pending",
"total": "59.90",
"currency": "BRL",
"billing_period": "month",
"billing_interval": 1,
"next_payment_at": "2026-10-24T12:00:00Z",
"customer_id": 42,
"billing": {
"first_name": "Ana",
"last_name": "Souza",
"phone": "+5511987654321",
"city": "São Paulo",
"state": "SP",
"country": "BR"
},
"line_items": [
{
"product_id": 88,
"variation_id": 0,
"sku": "CLUBE-CAFE",
"name": "Clube do café",
"quantity": 1,
"price": "59.90",
"total": "59.90",
"categories": ["Assinaturas"]
}
]
},
"order": {
"id": 1234,
"number": "1234",
"status": "pending",
"currency": "BRL",
"total": "189.90",
"subtotal": "179.90",
"discount_total": "10.00",
"shipping_total": "20.00",
"total_tax": "0.00",
"payment_method": "pix",
"payment_method_title": "Pix",
"date_created": "2026-09-24T12:00:00Z",
"date_paid": null,
"customer_id": 42,
"customer_note": "",
"billing": {
"first_name": "Ana",
"last_name": "Souza",
"phone": "+5511987654321",
"city": "São Paulo",
"state": "SP",
"country": "BR"
},
"shipping": {
"city": "São Paulo",
"state": "SP",
"country": "BR"
},
"shipping_lines": [
{
"method_id": "flat_rate",
"method_title": "SEDEX",
"total": "20.00"
}
],
"line_items": [
{
"product_id": 77,
"variation_id": 0,
"sku": "CAFE-500",
"name": "Café especial 500 g",
"quantity": 2,
"price": "89.95",
"total": "179.90",
"categories": ["Cafés"]
}
],
"coupon_lines": [
{
"code": "BEMVINDO10",
"discount": "10.00"
}
]
}
}
wcs.subscription.activated
Every time the subscription becomes active.
Sample data
{
"subscription": {
"id": 900,
"status": "active",
"total": "59.90",
"currency": "BRL",
"billing_period": "month",
"billing_interval": 1,
"next_payment_at": "2026-10-24T12:00:00Z",
"customer_id": 42,
"billing": {
"first_name": "Ana",
"last_name": "Souza",
"phone": "+5511987654321",
"city": "São Paulo",
"state": "SP",
"country": "BR"
},
"line_items": [
{
"product_id": 88,
"variation_id": 0,
"sku": "CLUBE-CAFE",
"name": "Clube do café",
"quantity": 1,
"price": "59.90",
"total": "59.90",
"categories": ["Assinaturas"]
}
]
}
}
wcs.subscription.payment_complete
On every approved payment of the subscription, with that payment's order in order.
Sample data
{
"subscription": {
"id": 900,
"status": "active",
"total": "59.90",
"currency": "BRL",
"billing_period": "month",
"billing_interval": 1,
"next_payment_at": "2026-10-24T12:00:00Z",
"customer_id": 42,
"billing": {
"first_name": "Ana",
"last_name": "Souza",
"phone": "+5511987654321",
"city": "São Paulo",
"state": "SP",
"country": "BR"
},
"line_items": [
{
"product_id": 88,
"variation_id": 0,
"sku": "CLUBE-CAFE",
"name": "Clube do café",
"quantity": 1,
"price": "59.90",
"total": "59.90",
"categories": ["Assinaturas"]
}
]
},
"order": {
"id": 1234,
"number": "1234",
"status": "pending",
"currency": "BRL",
"total": "189.90",
"subtotal": "179.90",
"discount_total": "10.00",
"shipping_total": "20.00",
"total_tax": "0.00",
"payment_method": "pix",
"payment_method_title": "Pix",
"date_created": "2026-09-24T12:00:00Z",
"date_paid": null,
"customer_id": 42,
"customer_note": "",
"billing": {
"first_name": "Ana",
"last_name": "Souza",
"phone": "+5511987654321",
"city": "São Paulo",
"state": "SP",
"country": "BR"
},
"shipping": {
"city": "São Paulo",
"state": "SP",
"country": "BR"
},
"shipping_lines": [
{
"method_id": "flat_rate",
"method_title": "SEDEX",
"total": "20.00"
}
],
"line_items": [
{
"product_id": 77,
"variation_id": 0,
"sku": "CAFE-500",
"name": "Café especial 500 g",
"quantity": 2,
"price": "89.95",
"total": "179.90",
"categories": ["Cafés"]
}
],
"coupon_lines": [
{
"code": "BEMVINDO10",
"discount": "10.00"
}
]
}
}
wcs.subscription.payment_failed
When a subscription payment fails, with the order left unpaid and links.payment_url to pay it.
Sample data
{
"subscription": {
"id": 900,
"status": "on-hold",
"total": "59.90",
"currency": "BRL",
"billing_period": "month",
"billing_interval": 1,
"next_payment_at": "2026-10-24T12:00:00Z",
"customer_id": 42,
"billing": {
"first_name": "Ana",
"last_name": "Souza",
"phone": "+5511987654321",
"city": "São Paulo",
"state": "SP",
"country": "BR"
},
"line_items": [
{
"product_id": 88,
"variation_id": 0,
"sku": "CLUBE-CAFE",
"name": "Clube do café",
"quantity": 1,
"price": "59.90",
"total": "59.90",
"categories": ["Assinaturas"]
}
]
},
"order": {
"id": 1234,
"number": "1234",
"status": "failed",
"currency": "BRL",
"total": "189.90",
"subtotal": "179.90",
"discount_total": "10.00",
"shipping_total": "20.00",
"total_tax": "0.00",
"payment_method": "pix",
"payment_method_title": "Pix",
"date_created": "2026-09-24T12:00:00Z",
"date_paid": null,
"customer_id": 42,
"customer_note": "",
"billing": {
"first_name": "Ana",
"last_name": "Souza",
"phone": "+5511987654321",
"city": "São Paulo",
"state": "SP",
"country": "BR"
},
"shipping": {
"city": "São Paulo",
"state": "SP",
"country": "BR"
},
"shipping_lines": [
{
"method_id": "flat_rate",
"method_title": "SEDEX",
"total": "20.00"
}
],
"line_items": [
{
"product_id": 77,
"variation_id": 0,
"sku": "CAFE-500",
"name": "Café especial 500 g",
"quantity": 2,
"price": "89.95",
"total": "179.90",
"categories": ["Cafés"]
}
],
"coupon_lines": [
{
"code": "BEMVINDO10",
"discount": "10.00"
}
]
},
"links": {
"payment_url": "https://example.com/checkout/order-pay/1234/?pay_for_order=true&key=wc_order_example",
"order_received_url": "https://example.com/checkout/order-received/1234/?key=wc_order_example",
"my_account_url": "https://example.com/minha-conta/view-order/1234/",
"review_urls": ["https://example.com/produto/cafe-especial/#reviews"]
}
}
wcs.subscription.expired
When the subscription expires.
Sample data
{
"subscription": {
"id": 900,
"status": "expired",
"total": "59.90",
"currency": "BRL",
"billing_period": "month",
"billing_interval": 1,
"next_payment_at": "2026-10-24T12:00:00Z",
"customer_id": 42,
"billing": {
"first_name": "Ana",
"last_name": "Souza",
"phone": "+5511987654321",
"city": "São Paulo",
"state": "SP",
"country": "BR"
},
"line_items": [
{
"product_id": 88,
"variation_id": 0,
"sku": "CLUBE-CAFE",
"name": "Clube do café",
"quantity": 1,
"price": "59.90",
"total": "59.90",
"categories": ["Assinaturas"]
}
]
}
}
wcs.subscription.cancelled
When the subscription is cancelled.
Sample data
{
"subscription": {
"id": 900,
"status": "cancelled",
"total": "59.90",
"currency": "BRL",
"billing_period": "month",
"billing_interval": 1,
"next_payment_at": "2026-10-24T12:00:00Z",
"customer_id": 42,
"billing": {
"first_name": "Ana",
"last_name": "Souza",
"phone": "+5511987654321",
"city": "São Paulo",
"state": "SP",
"country": "BR"
},
"line_items": [
{
"product_id": 88,
"variation_id": 0,
"sku": "CLUBE-CAFE",
"name": "Clube do café",
"quantity": 1,
"price": "59.90",
"total": "59.90",
"categories": ["Assinaturas"]
}
]
}
}
WordPress
| Event | In the panel |
|---|---|
wp.user.registered | User registered |
wp.user.updated | User profile updated |
The contact is the user (wp_user), with WooCommerce's billing phone or the one Joinotify's code
login saved. A user without a phone arrives as an event, but creates no contact.
wp.user.registered
When someone signs up on the site. The event goes out at the end of the sign-up, after WooCommerce and the profile forms have saved the phone and the name.
Sample data
{
"user": {
"id": 42,
"first_name": "Ana",
"last_name": "Souza",
"roles": ["customer"],
"registered_at": "2026-09-24T12:00:00Z"
}
}
wp.user.updated
When the user changes their phone, first name, last name or e-mail, or ticks or unticks the
marketing preference in My account. changed says what changed: phone, first_name,
last_name, email, marketing_consent.
Sample data
{
"user": {
"id": 42,
"first_name": "Ana",
"last_name": "Souza",
"roles": ["customer"],
"registered_at": "2026-09-24T12:00:00Z"
},
"changed": ["phone"]
}
Forms
| Event | In the panel |
|---|---|
form.submitted | Form submitted |
form.submitted
On every submission of a WPForms or Elementor Pro form that has a phone or an e-mail — with
neither, nothing is sent. Every field of the form goes in fields, keyed by its label (lowercase,
without accents, spaces turned into _). form.plugin is wpforms or elementor; entry_id is
empty for Elementor, and page_url is the page the form was sent from, when the browser says.
The phone is the field of the phone type or, failing that, the first one whose label mentions
phone, mobile or WhatsApp. The contact is the logged-in user (wp_user) or, without a login, a
lead.
Sample data
{
"form": {
"plugin": "wpforms",
"id": "12",
"title": "Fale conosco"
},
"entry_id": "345",
"fields": {
"name": "Ana Souza",
"phone": "+5511987654321",
"message": "Quero um orçamento"
},
"page_url": "https://example.com/contato"
}
Flexify Checkout
With Flexify Checkout's cart recovery active. A cart's contact is always a lead, identified by
the e-mail or the phone; Joinotify finds an existing customer by the phone.
| Event | In the panel |
|---|---|
fcrc.lead.collected | Contact captured at checkout |
fcrc.cart.abandoned | Cart abandoned |
fcrc.cart.recovered | Cart recovered |
fcrc.cart.lost | Cart lost |
fcrc.lead.collected
When Flexify Checkout captures the contact of someone at checkout.
Sample data
{
"cart": {
"id": 555,
"total": "189.90",
"currency": "BRL",
"recovery_url": "https://example.com/checkout/?recovery_cart=555",
"first_name": "Ana",
"last_name": "Souza",
"phone": "+5511987654321"
}
}
fcrc.cart.abandoned
When Flexify Checkout marks the cart as abandoned. If an order was left unpaid, it comes in
order, with links.payment_url.
Sample data
{
"cart": {
"id": 555,
"total": "189.90",
"currency": "BRL",
"recovery_url": "https://example.com/checkout/?recovery_cart=555",
"first_name": "Ana",
"last_name": "Souza",
"phone": "+5511987654321"
},
"order": {
"id": 1234,
"number": "1234",
"status": "pending",
"currency": "BRL",
"total": "189.90",
"subtotal": "179.90",
"discount_total": "10.00",
"shipping_total": "20.00",
"total_tax": "0.00",
"payment_method": "pix",
"payment_method_title": "Pix",
"date_created": "2026-09-24T12:00:00Z",
"date_paid": null,
"customer_id": 42,
"customer_note": "",
"billing": {
"first_name": "Ana",
"last_name": "Souza",
"phone": "+5511987654321",
"city": "São Paulo",
"state": "SP",
"country": "BR"
},
"shipping": {
"city": "São Paulo",
"state": "SP",
"country": "BR"
},
"shipping_lines": [
{
"method_id": "flat_rate",
"method_title": "SEDEX",
"total": "20.00"
}
],
"line_items": [
{
"product_id": 77,
"variation_id": 0,
"sku": "CAFE-500",
"name": "Café especial 500 g",
"quantity": 2,
"price": "89.95",
"total": "179.90",
"categories": ["Cafés"]
}
],
"coupon_lines": [
{
"code": "BEMVINDO10",
"discount": "10.00"
}
]
},
"links": {
"payment_url": "https://example.com/checkout/order-pay/1234/?pay_for_order=true&key=wc_order_example",
"order_received_url": "https://example.com/checkout/order-received/1234/?key=wc_order_example",
"my_account_url": "https://example.com/minha-conta/view-order/1234/",
"review_urls": ["https://example.com/produto/cafe-especial/#reviews"]
}
}
fcrc.cart.recovered
When the cart is recovered, with the order in order.
Sample data
{
"cart": {
"id": 555,
"total": "189.90",
"currency": "BRL",
"recovery_url": "https://example.com/checkout/?recovery_cart=555",
"first_name": "Ana",
"last_name": "Souza",
"phone": "+5511987654321"
},
"order": {
"id": 1234,
"number": "1234",
"status": "pending",
"currency": "BRL",
"total": "189.90",
"subtotal": "179.90",
"discount_total": "10.00",
"shipping_total": "20.00",
"total_tax": "0.00",
"payment_method": "pix",
"payment_method_title": "Pix",
"date_created": "2026-09-24T12:00:00Z",
"date_paid": null,
"customer_id": 42,
"customer_note": "",
"billing": {
"first_name": "Ana",
"last_name": "Souza",
"phone": "+5511987654321",
"city": "São Paulo",
"state": "SP",
"country": "BR"
},
"shipping": {
"city": "São Paulo",
"state": "SP",
"country": "BR"
},
"shipping_lines": [
{
"method_id": "flat_rate",
"method_title": "SEDEX",
"total": "20.00"
}
],
"line_items": [
{
"product_id": 77,
"variation_id": 0,
"sku": "CAFE-500",
"name": "Café especial 500 g",
"quantity": 2,
"price": "89.95",
"total": "179.90",
"categories": ["Cafés"]
}
],
"coupon_lines": [
{
"code": "BEMVINDO10",
"discount": "10.00"
}
]
}
}
fcrc.cart.lost
When Flexify Checkout gives the cart up as lost.
Sample data
{
"cart": {
"id": 555,
"total": "189.90",
"currency": "BRL",
"recovery_url": "https://example.com/checkout/?recovery_cart=555",
"first_name": "Ana",
"last_name": "Souza",
"phone": "+5511987654321"
}
}
Custom events
Your code can send events of its own with joinotify_track(). The name starts with custom.
followed by one to three parts of lowercase letters, digits and _ — custom.quote.requested —
and the data is whatever you pass. On the trigger, choose Custom event and type the name. How
to send them is in Connecting WordPress and WooCommerce.
Sending through the API
Events arrive through POST /site-events, in batches of up to 100, and only with a connected
site's key. Each event can carry up to 64 kB of data and contact; an invalid event is refused
on its own, without failing the batch. The details are in the API reference.