SOLVED

How do I send a confirmation email with a unique code?

Go to solution
SanfordWhiteman
Level 10 - Community Moderator

Re: How do I send a confirmation email with a unique code?

OK, I’m back with more answers! Had a call.

 


3) In your sample webhook code (1st one) , you have two lines at the top
 var fileOfCodes = "https://pages.example.com/rs/111-222-333/images/sample_codes.txt";
 var counter = "/distributed_codes/{{Program.Id}}/v1";

           fileOfCodes is a variable holding the text file, we import that file into marketo and adjust the https://pages.example.... with the actual path where we uploaded the text file

counter is a variable holding the count. What does or how does the "/distributed_codes/{{Program.Id}}/v1" keep track of the  count?

Yes, fileOfCodes points to the Design Studio asset.

 

The code is using FBCounter (actually a simple key-value database, etcd, under the hood) and its method called autoAdd()autoAdd() just adds an automatically-generated unique entry (like a GUID) under the counter path (/codes/12345/v1/...) every time you call it. So it doesn’t have to know what it’s counting — it just counts and tells you how many entries there are!

SanfordWhiteman
Level 10 - Community Moderator

Re: How do I send a confirmation email with a unique code?


When creating the webhook, where do we put the sample code? 
 var fileOfCodes = "https://pages.example.com/rs/111-222-333/images/sample_codes.txt";

   var counter = "/distributed_codes/{{Program.Id}}/v1";

   FBHttp.fetch(fileOfCodes)
  .then( resp => resp.text() )
  .then( respT => respT.split(/\r?\n/) )
  .then ( codes =>
      FBCounter.count(counter)
      .catch( count => 0 )
      .then( count =>
             count < codes.length
             ? FBCounter.autoAdd(counter).then( resp => success(codes[count]))
                  : failure("All outta codes!")

               )
             ) 
.catch(failure)

That goes in the webhook Payload textbox.

 

But I think there’s one piece you might not be clear on: you need a FlowBoost API key to make this call. It’s free (Community key is 100,000 calls/month which certainly seems beyond your usage) but you need to fill out the form!

tmoi
Level 2

Re: How do I send a confirmation email with a unique code?

Hi Sanford!
Thanks a lot, this function is exactly what I'm looking for. I've set everything up through FlowBoost, although I always receive the below response message:

{"errorType":"string","errorMessage":"ERR: Compile error (strict mode): SyntaxError: Invalid regular expression: missing /","trace":[]}

Any idea what might cause this and how should I fix it?
The code you've provided is unchanged basically other than the fileOfCodes path of course.
--
I ruled out the possibility that I've set up FlowBoost poorly, as the much simpler "Hello World!" call went through beautifully with the same setup.
If you need any other details, let me know. Thanks a lot!

SanfordWhiteman
Level 10 - Community Moderator

Re: How do I send a confirmation email with a unique code?

It’s tricky because in the webhook UI you have to double up those escapes in order for Marketo to send the right thing on the wire. Otherwise Marketo swallows them. Try:

.then( respT => respT.split(/\\r?\\n/) )

 

tmoi
Level 2

Re: How do I send a confirmation email with a unique code?

Yeah, it works fine now! Thanks Sanford!
I have another concern though, one that might never happen actually but I can not rule out the possibility.
So, when I run the webhook on a sample of 60 records (with 45 codes only), many of them receive back the same code. Only 24 get unique codes in the end, but more importantly, none gets back "nothing" as the value of 15 should because we have fewer codes than people qualified.

 

I realize if my trigger would be closer to a realistic one like "fill out a form" then the possibility of this is closer to 0, as people won't be entering the flow in one batch, but wondering if 2 form submissions are really really close in time, would that result in the same situation described above? Trying it with a smaller sample of 5, adding a 1-second delay between each record's webhook call seems to solve the issue, but it's not scalable. The question in the end is if the payload can be adjusted to have some sort of delay that solves this issue or if the delay should happen in the smart campaign flow. And more importantly, if I'm overthinking it in the first place?:D
Thanks a lot!

SanfordWhiteman
Level 10 - Community Moderator

Re: How do I send a confirmation email with a unique code?

You’re right that because of multithreading (or, more precisely, multi-processing) on the FlowBoost side that code could return duplicates under high parallel load.

 

You can avoid that by changing the order of operations, so everyone gets a unique counter index before looking up that index (i.e. row) in the file w/values:

var fileOfCodes = "https://pages.example.com/rs/111-222-333/images/sample_codes.txt";
var counter = "/distributed_codes/{{Program.Id}}/v4";

Promise.all([
  FBHttp.fetch(fileOfCodes).then(resp => resp.text()),
  FBCounter.autoAdd(counter)
])
.then( ([fileContents, counters]) => {
  let codes = fileContents.split(/\r?\n/);
  let nextCode = codes[counters.currentCount - 1];
  
  if(nextCode) {
    success(nextCode);
  } else {
    failure("All outta codes");
  }
});

 

tmoi
Level 2

Re: How do I send a confirmation email with a unique code?

I think the issue still stands. Now running this code on a smaller sample of 20 (still at the same time) continues to return duplicates and one more empty value than it should. Sample: 20 codes, 21 records. 
Result below:

Email AddressLast Unique Code
1 
2Code6
3Code18
4Code18
5Code17
6Code5
7Code12
8Code11
9Code10
10Code11
11Code2
12Code3
13Code17
14Code2
15 
16Code10
17Code17
18Code19
19Code5
20Code17
21Code10
SanfordWhiteman
Level 10 - Community Moderator

Re: How do I send a confirmation email with a unique code?

Sorry, one important change I forgot to recommend!

 

Use

let nextCode = codes[counters.entryIndex];

 

instead of

let nextCode = codes[counters.currentCount - 1];

 

The 2 differ significantly. entryIndex is the index of the just added entry in the list, which is what you actually want here. currentCount is the size of the whole list, which at certain points in time (under load) may include entries who were added milliseconds after the current person — that’s why currentCount can end up assigning  a code that shouldn’t be given out to this specific person, but to someone else.

 

At any rate, use entryIndex. I tested multiple times with a 50-code file and 50-person list and everything was correct.

tmoi
Level 2

Re: How do I send a confirmation email with a unique code?

Now it's perfect, thank you!

The explanation helps a lot as well! 

SanfordWhiteman
Level 10 - Community Moderator

Re: How do I send a confirmation email with a unique code?

Excellent! This needs better/some documentation. 🙂