Skip to main content

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:

SourceNeedsSync option
WooCommerceWooCommerceWooCommerce orders and customers
SubscriptionsWooCommerce SubscriptionsWooCommerce orders and customers
WordPress—WordPress users
FormsWPForms or Elementor ProForm submissions (off by default)
Flexify CheckoutFlexify Checkout with cart recoveryAbandoned carts
CustomYour 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",
"email": "[email protected]",
"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,
"email": "[email protected]",
"first_name": "Ana",
"last_name": "Souza",
"roles": ["customer"],
"registered_at": "2026-09-24T12:00:00Z"
}
}
}
FieldWhat it is
idAn id the site generated when it recorded the event. The same id sent again is ignored
nameThe event's name
occurred_atWhen it happened on the site, in ISO 8601 and UTC
schema_versionThe version of the shape of data — 1 today
site_urlThe site's address. If it differs from the connected address, the whole batch is refused (see staging copies)
contactWho the event is about. Optional
dataThe event's data — what each section below describes

The contact block​

FieldWhat it is
refWho the person is on the site: { "kind": …, "id": … }
phone, countryThe phone number and the billing country, which says how to read a number without its country code
first_name, last_name, emailName and e-mail
attributesThe store fields on the contact: orders, total spent, last purchase…
tagsThe site's source tag
consentThe marketing consent, when the site asks for it

The ref kind is one of these:

kindIn the panelid
wp_userWordPress userThe user id
wc_customerWooCommerce customerThe customer's user id
wc_guestBuyer without an accountThe SHA-256 of the lowercase e-mail (or of the phone, without e-mail)
leadForm or cart leadThe 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>}}:

VariableRenders
{{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:

KeyCarriesExample
$eventThe event's id, name and occurred_at{{trigger.$event.name}}
$siteThe 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",
"email": "[email protected]",
"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_items only 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, billing adds company, address_1, address_2 and postcode, and shipping adds first_name, last_name, address_1, address_2, postcode and phone.
  • customer_id is 0 on 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.

{
"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",
"email": "[email protected]",
"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,
"email": "[email protected]",
"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",
"email": "[email protected]",
"phone": "+5511987654321"
}

WooCommerce​

EventIn the panel
wc.order.createdOrder created
wc.order.paidOrder paid
wc.order.status_changedOrder status changed
wc.order.completedOrder completed
wc.order.cancelledOrder cancelled
wc.order.failedOrder payment failed
wc.order.refundedOrder refunded
wc.customer.createdCustomer 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",
"email": "[email protected]",
"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",
"email": "[email protected]",
"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",
"email": "[email protected]",
"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",
"email": "[email protected]",
"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",
"email": "[email protected]",
"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",
"email": "[email protected]",
"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",
"email": "[email protected]",
"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,
"email": "[email protected]",
"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.

EventIn the panel
wcs.subscription.createdSubscription created
wcs.subscription.activatedSubscription activated
wcs.subscription.payment_completeSubscription payment approved
wcs.subscription.payment_failedSubscription payment failed
wcs.subscription.expiredSubscription expired
wcs.subscription.cancelledSubscription 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",
"email": "[email protected]",
"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",
"email": "[email protected]",
"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",
"email": "[email protected]",
"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",
"email": "[email protected]",
"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",
"email": "[email protected]",
"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",
"email": "[email protected]",
"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",
"email": "[email protected]",
"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",
"email": "[email protected]",
"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",
"email": "[email protected]",
"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​

EventIn the panel
wp.user.registeredUser registered
wp.user.updatedUser 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,
"email": "[email protected]",
"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,
"email": "[email protected]",
"first_name": "Ana",
"last_name": "Souza",
"roles": ["customer"],
"registered_at": "2026-09-24T12:00:00Z"
},
"changed": ["phone"]
}

Forms​

EventIn the panel
form.submittedForm 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",
"email": "[email protected]",
"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.

EventIn the panel
fcrc.lead.collectedContact captured at checkout
fcrc.cart.abandonedCart abandoned
fcrc.cart.recoveredCart recovered
fcrc.cart.lostCart 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",
"email": "[email protected]",
"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",
"email": "[email protected]",
"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",
"email": "[email protected]",
"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",
"email": "[email protected]",
"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",
"email": "[email protected]",
"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",
"email": "[email protected]",
"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.