How to implement Webhooks for your LoyaltySurf campaign.
Example 1: Webhooks
Below is a Node.js + Express example of what the code for your webhook endpoint could look like:
//Your webhooks payload endpointapp.post("/your/webhook/payload-url",function(req, res) {constbody=req.body;try {if (body.event ==='PARTICIPANT_SUBMITTED_REWARD_FORM') {// Write code here to do something when a participant submits a reward form console.log(`${body.data.participant.email} just submitted a reward form: ${body.data.reward.description} - ${body.data.reward.cta}`);
} elseif (body.event ==='PARTICIPANT_REACHED_A_GOAL') {// Write code here to do something when a participant wins a rewardconsole.log(`${body.data.participant.email} just won this reward: ${body.data.reward.description}`);// If the reward is approvedif (body.data &&body.data.reward &&body.data.reward.approved) {// Do something } } elseif (body.event ==='NEW_PARTICIPANT_ADDED') {// Write code here to do something when a new participant is added console.log(`${body.data.email} just joined via source: ${body.data.loyaltyActionSource}.`) } elseif (body.event ==='CAMPAIGN_ENDED') {// Write code here to do something when a campaign endsconsole.log(`${body.data.name} just ended with ${body.data.loyaltyActionCount} total loyalty actions!`); } } catch (err) {res.status(400).end(); }res.json({received:true});});
To see the different sample data from webhook request payloads, see Events
Example 2: Webhooks (with secret)
Below is a Node.js + Express example (using the crypto-js library) of what the code for your webhook endpoint could look like:
//Your webhooks payload endpointapp.post("/your/webhook/payload-url",function(req, res) {constbody=req.body;constsignature=req.get("LoyaltySurf-Signature");try {// Validate the signaturevalidateSignature(body, signature);// Do work!.....// Write your code in here... } catch (err) {res.status(400).end(); }res.json({received:true});});/** * Compares the LoyaltySurf header provided signature against the expected * signature. * * @param{Object} body the request body provided by Surf * @param{String} signature the signature hash value provided within the header of the request * @returns{Boolean} valid true if the expected matches the given * @throws{Exception} thrown if the expected signature value does not match the given */constvalidateSignature=function(body, signature) {// Extractlet parts =signature.split(",");// t valuelet timestamp = parts[0].split("=")[1];// v valuelet hash = parts[1].split("=")[1];// Generate hashlet message = (timestamp +"."+JSON.stringify(body));let expected =CryptoJS.HmacSHA256(message,"YOUR-SECRET-TOKEN").toString();// Validate/Compareif(expected === hash) {returntrue; } else {thrownewError("Invalid Signature"); }}