{{ENV}}.
PurchaseConfirmed_POST (Подія 1): замовлення підтверджено, в роботі.QualifiedPurchase_POST (Подія 2): реальний викуп, передаємо фінальну суму з допродажами.| Параметр | ❌ v1 | ✅ v2 |
|---|---|---|
| Джерело тригера | статус у OpenCart | статус у CRM (SuiteCRM) |
| Скільки подій | одна | дві (в обробці + викуп) |
| Сума (value) | на момент оформлення | фінальна, з допродажами |
| Telegram | не передавались | передаються (через CRM) |
| Google conversionAction | хибний ID 11022164503 | 2 нові Import-дії (створено) |
| 3 API, дедуп, хешування | — без змін — | те саме з v1 |
| Подія | Тригер (статус CRM) | value |
|---|---|---|
Подія 1 PurchaseConfirmed_POSTпідтверджено, в роботі | ЗАПОВНИТИ: назва статусу | value_processing |
Подія 2 QualifiedPurchase_POSTреальний викуп, закрито | ЗАПОВНИТИ: назва статусу | value_final (з допродажами) |
Обидві події незалежні, кожна один раз (флаги e1_* / e2_*). event_time / conversionDateTime = момент зміни статусу в CRM (не дата замовлення), тому подія завжди свіжа.
| Подія 1 | Подія 2 | |
|---|---|---|
Meta event_name | PurchaseConfirmed_POST | QualifiedPurchase_POST |
Meta event_id | purchase_confirmed_<order_id> | qualified_purchase_<order_id> |
| GA4 event | purchase_confirmed_post | qualified_purchase_post |
GA4 transaction_id | <order_id> | <order_id> |
Google conversionAction | 7660803552 | 7660805253 |
| value | value_processing | value_final |
UPLOAD_CLICKS, PURCHASE, counting Every, вікно 90 днів, value по завантаженню. Обидві Secondary (primary_for_goal=false), у ставки не входять (бідинг на wGTM / Purchase 7590805370 не чіпаємо). Стара POST / Qualified Purchase (7606114302) = WEBPAGE, для OCI не годиться. ID 11022164503 з v1 = AW- gtag id, не conversion action.
lm-utm-keeper-gtm.js)Ловить utm_* + click ID (gclid/gbraid/wbraid/fbclid/igclid/ttclid/msclkid) + ga_client_id з _ga. Фолбек gclid з _gcl_aw, відновлює _fbc. TTL 90 днів, переживає навігацію. Віддає мітки через window.lmGetTracking() для прихованих полів форми OpenCart.
lm-telegram-buttons.js, заміна старого)Знаходить посилання на бота по href (t.me/Molfar_Support_Bot, клас не потрібен), переписує на tg.pulse.is з мітками. Канал та інші боти не чіпає. SendPulse: завести змінні контакту gbraid, wbraid, fbclid, ga_client_id, fbc (на додачу до utm + gclid). Менеджер переносить мітки в CRM (поки руками).
_ga / _gcl_aw / _fbc, усі гілки логіки працюють; TG-скрипт переписав 7/7 бот-посилань, ланцюг доїхав до Telegram через SendPulse. Старий скрипт цілився в клас .tg-button, якого на сайті 0.
| Поле | Джерело | Навіщо |
|---|---|---|
order_id | CRM | GA4 transaction_id; Meta event_id; Ads orderId |
created_at, status | CRM | контроль затримок; тригер Подій 1/2 |
ga_client_id | _ga | обовʼязково для GA4 MP |
gclid / gbraid / wbraid | URL / cookie | тільки для Ads OCI |
fbp, fbc, fbclid | cookie / URL | Meta match (fbc з fbclid якщо нема) |
utm_* | URL | аналітика |
event_source_url, user_agent, ip | сайт / header | Meta (website) |
email, phone, first_name, last_name, city, state, zip, country, customer_id → нормалізуємо → SHA-256 (lowercase/trim; телефон строго E.164).
currency (UAH), value_processing (Подія 1), value_final з допродажами (Подія 2), items[] (GA4), contents[] (Meta). Флаги: e1_meta_sent / e1_ga4_sent / e1_ads_sent / e2_meta_sent / e2_ga4_sent / e2_ads_sent.
{
"order_id": "LM-100500",
"created_at": "2025-10-12T16:22:31Z",
"status": "confirmed",
"currency": "UAH",
"value_processing": 1490.00,
"value_final": 1890.00,
"items": [
{"id": "112", "name": "Гриб Левиний Гриб 60 кап", "quantity": 1, "price": 890.00},
{"id": "88", "name": "Адаптоген Ашваганда 30 кап", "quantity": 1, "price": 600.00}
],
"customer_raw": {
"email": "client@example.com", "phone": "+380991234567",
"first_name": "Олена", "last_name": "Коваль",
"city": "Київ", "state": "", "zip": "04050", "country": "UA",
"customer_id": "CUST-100500"
},
"attribution": {
"ga_client_id": "1865432100.987654321",
"gclid": "EAIaIQ...", "gbraid": null, "wbraid": null,
"fbp": "fb.1.1728735751000.3456789012",
"fbc": "fb.1.1728735755000.AbCdEfGhIjKlMnOp",
"fbclid": "AbCdEfGhIjKlMnOp",
"event_source_url": "https://lavka-molfara.com.ua/checkout/success/",
"landing_page": "https://lavka-molfara.com.ua/",
"referrer": "https://www.facebook.com/",
"utm_source": "facebook", "utm_medium": "cpc", "utm_campaign": "lm_conversion",
"user_agent": "Mozilla/5.0 ...", "ip": "203.0.113.10"
},
"flags": {
"e1_meta_sent": false, "e1_ga4_sent": false, "e1_ads_sent": false,
"e2_meta_sent": false, "e2_ga4_sent": false, "e2_ads_sent": false
}
}
Приклади для Події 2 (QualifiedPurchase). Для Події 1 підставити значення Події 1 з таблиці розділу 5 (event_name/event_id/name/conversionAction/value).
curl -X POST "https://graph.facebook.com/v21.0/1849940369742660/events?access_token={{META_ACCESS_TOKEN}}" \
-H "Content-Type: application/json" \
-d '{
"data": [{
"event_name": "QualifiedPurchase_POST",
"event_time": 1761440100,
"action_source": "website",
"event_source_url": "https://lavka-molfara.com.ua/checkout/success/",
"event_id": "qualified_purchase_LM-100500",
"user_data": {
"em": ["<sha256(client@example.com)>"],
"ph": ["<sha256(+380991234567)>"],
"fn": ["<sha256(олена)>"], "ln": ["<sha256(коваль)>"],
"ct": ["<sha256(київ)>"], "zp": ["<sha256(04050)>"],
"country": ["<sha256(ua)>"],
"external_id": ["<sha256(1865432100.987654321)>"],
"client_ip_address": "203.0.113.10",
"client_user_agent": "Mozilla/5.0 ...",
"fbp": "fb.1.1728735751000.3456789012",
"fbc": "fb.1.1728735755000.AbCdEfGhIjKlMnOp"
},
"custom_data": {
"currency": "UAH", "value": 1890.00, "content_type": "product",
"contents": [
{"id": "112", "quantity": 1, "item_price": 890.00},
{"id": "88", "quantity": 1, "item_price": 600.00}
]
}
}]
}'
Подія 1: event_name=PurchaseConfirmed_POST, event_id=purchase_confirmed_LM-100500, value=value_processing. Для TG-замовлень ip/ua/fbp можуть бути відсутні: матч по PII + fbc.
curl -X POST "https://www.google-analytics.com/mp/collect?measurement_id=G-CQYZHNRVDB&api_secret={{GA4_API_SECRET}}" \
-H "Content-Type: application/json" \
-d '{
"client_id": "1865432100.987654321",
"timestamp_micros": 1761440100000000,
"events": [{
"name": "qualified_purchase_post",
"params": {
"transaction_id": "LM-100500",
"currency": "UAH", "value": 1890.00, "engagement_time_msec": 1,
"items": [
{"item_id": "112", "item_name": "Гриб Левиний Гриб 60 кап", "price": 890.00, "quantity": 1},
{"item_id": "88", "item_name": "Адаптоген Ашваганда 30 кап", "price": 600.00, "quantity": 1}
]
}
}]
}'
Подія 1: name=purchase_confirmed_post, value=value_processing. client_id обовʼязковий. timestamp_micros лише якщо ≤72год, інакше без нього.
curl -X POST "https://googleads.googleapis.com/v22/customers/7699145794:uploadClickConversions" \
-H "Authorization: Bearer {{ACCESS_TOKEN}}" \
-H "developer-token: {{GOOGLE_ADS_DEVELOPER_TOKEN}}" \
-H "login-customer-id: 1914648688" \
-H "Content-Type: application/json" \
-d '{
"conversions": [{
"gclid": "EAIaIQobChMIvJZz...",
"conversionAction": "customers/7699145794/conversionActions/7660805253",
"conversionDateTime": "2025-10-26 10:15:00+03:00",
"currencyCode": "UAH",
"conversionValue": 1890.00,
"orderId": "LM-100500"
}],
"partialFailure": true
}'
Подія 1: conversionAction=.../7660803552, conversionValue=value_processing. Рівно один з gclid / gbraid / wbraid.
curl -X POST "https://oauth2.googleapis.com/token" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "client_id={{GOOGLE_ADS_CLIENT_ID}}&client_secret={{GOOGLE_ADS_CLIENT_SECRET}}&refresh_token={{GOOGLE_ADS_REFRESH_TOKEN}}&grant_type=refresh_token"
| Система | Коли | Умова | Ключ дедупу | Вікно |
|---|---|---|---|---|
| Meta CAPI | завжди | будь-яке підтвердження | event_id (різний П1/П2) | ≤7 днів (event_time = момент статусу) |
| GA4 MP | завжди | будь-яке підтвердження | transaction_id = order_id | backdate ≤72год |
| Google Ads OCI | умовно | є gclid / gbraid / wbraid | orderId = order_id | клік ≤90 днів |
e1_* / e2_*). Якщо не відправлено, шле і ставить флаг.event_id і conversionAction, не злипаються на платформах.trace_id у логах.| Сценарій | Рішення |
|---|---|
| Подія 2: статус «Оплачено» → потім «Доставлено» | Подія 2 відправляється на першому з них, флаг e2_* ставиться. На другому статусі флаг уже стоїть, пропускаємо (як у v1). |
| Тільки накладений платіж, статус «Доставлено» | Подія 2 відправляється на «Доставлено». |
| Подія 1 надіслана, далі статус Події 2 | Це дві РІЗНІ події, обидві шлються (різні event_id / conversionAction). Флаги не дають дублів у межах однієї події. |
| Telegram без gclid (напр. Facebook) | Google OCI не шлемо. Meta (PII + fbc) і GA4 (ga_client_id) шлемо. |
Немає ga_client_id на TG-замовленні | Генеруємо синтетичний client_id, фіксуємо в CRM. |
Немає fbc | Відновлюємо з fbclid: fb.1.<ts>.<fbclid>. |
| Підтвердження через 2+ тижні від замовлення | Meta: event_time = момент підтвердження (не дата замовлення) → завжди в межах 7 днів, шлемо (виправлення проти v1). GA4: без timestamp_micros. Google: лише якщо клік ≤90 днів. |
| Допродаж після Події 1 | Подія 2 несе value_final. Подія 1 лишається зі своєю value_processing. |
client_id + engagement_time_msec: 1; timestamp_micros тільки ≤72год._ga→ga_client_id, _fbp/_fbc, fbclid, gclid/gbraid/wbraid, event_source_url, user_agent, ip. На сайтовому замовленні кладемо у приховані поля форми.value_final)order_id? (ключ дедупу)# Meta META_PIXEL_ID=1849940369742660 META_ACCESS_TOKEN=<ротувати, з env> # Google Ads GOOGLE_ADS_DEVELOPER_TOKEN=<ротувати> GOOGLE_ADS_CLIENT_ID=<ротувати> GOOGLE_ADS_CLIENT_SECRET=<ротувати> GOOGLE_ADS_REFRESH_TOKEN=<ротувати> GOOGLE_ADS_CUSTOMER_ID=7699145794 GOOGLE_ADS_LOGIN_CUSTOMER_ID=1914648688 GOOGLE_ADS_CONV_ACTION_E1=customers/7699145794/conversionActions/7660803552 GOOGLE_ADS_CONV_ACTION_E2=customers/7699145794/conversionActions/7660805253 # стара POST/Qualified Purchase 7606114302 = WEBPAGE, для OCI не годиться # GA4 GA4_MEASUREMENT_ID=G-CQYZHNRVDB GA4_API_SECRET=<ротувати> # CRM CRM_STATUS_EVENT1=<заповнити> CRM_STATUS_EVENT2=<заповнити> # SendPulse SENDPULSE_FLOW_ID=69a18b210993aea5530d6faf SENDPULSE_BOT=Molfar_Support_Bot
order_id з OpenCart.