The Intake Bot delivery health panel now names why a case has no traffic source, warns when a send job is stuck pending or a loaded pixel is missing its shared event ID, and labels Google Analytics Measurement Protocol rows as posted rather than accepted. A 2xx does not mean the credentials or the payload were valid. A conversion that exhausts its retries also sends an error alert.
Intake Bots can upload completed cases to Google Ads as offline click conversions using the captured click ID and hashed user data. GA4 Measurement Protocol stays available for analytics events. The two do not fire for the same conversion action.
On Business and Enterprise, Intake Bot analytics groups submissions by last-touch source, campaign, and campaign id, with volume and completion rate. A workspace view rolls the same fields up across every Intake Bot, with meeting counts from lifecycle events and a named reason for every unattributed case. There is no value, CPA, or ROAS column. The product does not hold ad spend.
The public submissions API returns the same attribution fields the in-app tab shows. Pro and above for the API and for Google upload. Business and Enterprise for the analytics tables.
The Intake Bot delivery health panel now names why cases have no traffic source, warns when a send job is stuck pending or a loaded pixel is missing its shared event ID, and labels Google Analytics Measurement Protocol rows as posted rather than accepted (a 2xx does not mean the credentials or payload were valid). A conversion that exhausts its QStash retries also sends an error alert.
Intake Bots can upload completed cases to Google Ads as offline click conversions using the captured gclid (or gbraid / wbraid) and hashed user data. GA4 Measurement Protocol stays available for analytics events. The two never fire for the same conversion action. Delivery health treats a Google Ads accept as verified and no longer labels Google as accepted-unverified.
The Intake Bot Analytics tab now groups submissions by last-touch utm_source, utm_campaign, and utm_id, with volume and completion rate per source. Lower-volume sources roll into Other, while cases with no UTM (including WhatsApp and API) remain Unattributed, so the table always adds up.
GET submission list and detail on the v1 API now return marketing attribution: a nested attribution object (UTMs, click IDs, pixel cookies) plus referrer, landing_page, embed_type, geo, and channel. The same fields the in-app Attribution tab shows.
A workspace Analytics page now rolls last-touch utm_source, utm_campaign, and utm_id up across every Intake Bot, with meeting counts from lifecycle events and a named reason for every unattributed case (WhatsApp, API, capture off, blocked pixel, or direct/organic). There is no value, CPA, or ROAS column: the product does not hold ad spend, and no purchase emitter exists yet.