Cognigy webhook payload mapping to CXone custom attributes

Trying to map dynamic intent data from a NICE Cognigy webhook into CXone contact attributes. The payload arrives at the CXone endpoint, but the custom attributes stay null. Here is the JSON structure Cognigy sends:

{"intent": "billing", "confidence": 0.95, "metadata": {"tier": "gold"}}

I’m using a standard POST to /api/v2/analytics/events. The request returns 200 OK, so the delivery works. The problem is the data doesn’t persist on the contact. I’ve checked the attribute names and they match exactly. Is there a specific schema requirement for the payload body or a header I’m missing?