The service hook handlers were only passed req.chunks[0]. Which worked fine in most cases but sometimes the data is split across multiple chunks, leading to invalid querystring parsing in travis.js. Instead of dealing with raw chunks ourselves, director handles them and parses them into req.body depending upon content-type and other headers (https://github.com/flatiron/director#http-streaming-and-body-parsing). Hence I modified the code to use req.body. This also included making the bot.respond function much more robust. The object validity checks are structured the way they are because (typeof null === 'object').