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 formconsole.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// Optional: If you set metadata on the CampaignReward object, you can reference it:if (body.data.reward.metadata &&body.data.reward.metadata["proRewardValue"]) {console.log(`${body.data.participant.email} earned an amount of ${body.data.reward.metadata["proRewardValue"]}.`); } } } 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});});
Helpful tips:
To see the different sample data from webhook request payloads, see Events
If you use reward metadata in your New Participant Reward events, your marketing team can update these values anytime in the future from the Campaign Editor without getting developers involved.
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"); }}