Using the heroku example results in the issue even though req.headers reveal the following:
'x-hub-signature': 'sha1=XXXXXXXXXXXXXXXXXXXXXXXXXX'
I might however have found the issue:
app.use(bodyParser.json());
app.use(xhub({ algorithm: 'sha1', secret: process.env.APP_SECRET }));
Should be like this according to Express X-Hub README:
app.use(xhub({ algorithm: 'sha1', secret: process.env.APP_SECRET }));
app.use(bodyParser.json());
Because the README specifies that it should be added before bodyParser:
Then add the middleware to Express.js. It needs to be one of the first and before bodyParser().