Problem
GC sits at 2025-06.150.0. Node 20.12.0 throws a ValidationError every time the batch processor hits the route. The analytics.reporting.data.created webhook hits the Express middleware but the JWT payload keeps missing the interactionId after a queue flush. Console logs show the event arrives with a 202, but the downstream Lambda handler bails out on undefined.
app.post('/webhooks/gc/analytics', express.json(), (req, res) => {
const token = req.headers.authorization.split(' ')[1];
const decoded = jwt.verify(token, process.env.GC_JWT_SECRET, { algorithms: ['HS256'] });
if (!decoded.data.interactionId) {
console.warn('Missing interactionId on analytics batch');
return res.status(200).send('OK'); // GC expects 200 within 3s
}
queue.push(decoded.data);
res.status(200).send('OK');
});
Error
The logs keep repeating TypeError: Cannot read properties of undefined (reading 'interactionId') even though the WebSocket Notification API shows the event firing correctly. EventBridge consumers see the payload intact, but once it routes through the Express listener, the interactionId field vanishes. Doing jack all with the current JWT decode logic. The batch window sits at 30 seconds, and the reporting metrics array flattens into a single object instead of an array of records. Route times out if the handler waits longer than 2.5s. GC documentation still points to the old payload schema, which doesn’t match what’s actually landing in the request body.
Question
The analytics batch webhook seems to strip out the interactionId during high-throughput flushes. JWT validation passes fine, but the data object structure changes completely after the 2025-06 patch. It’s been dropping the nested fields consistently since Tuesday. Checking the raw request body shows the structure shifted again.