<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Fidel API</title>
    <description>The latest articles on Forem by Fidel API (@fidel).</description>
    <link>https://forem.com/fidel</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F2294%2Fd9052489-97e4-4c59-b117-f8b6b238aa8b.png</url>
      <title>Forem: Fidel API</title>
      <link>https://forem.com/fidel</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/fidel"/>
    <language>en</language>
    <item>
      <title>What Do Exotic Programming Languages and Single-origin Coffee Beans Have in Common?</title>
      <dc:creator>Jorge Díaz</dc:creator>
      <pubDate>Thu, 24 Jun 2021 12:01:18 +0000</pubDate>
      <link>https://forem.com/fidel/what-do-exotic-programming-languages-and-single-origin-coffee-beans-have-in-common-37af</link>
      <guid>https://forem.com/fidel/what-do-exotic-programming-languages-and-single-origin-coffee-beans-have-in-common-37af</guid>
      <description>&lt;p&gt;This blog post started when I wanted to combine two of the things I love: playing around with different programming languages and brewing my own coffee with different beans from all around the world. Then, that got me thinking: how do some of the most interesting programming languages I've used relate to some of the most delicious and peculiar beans I've had the chance to taste? &lt;/p&gt;

&lt;p&gt;Mind you, I don't consider myself to be an expert on either of the two. I can, however, share enough knowledge today so that you can learn something new! And, who knows, maybe you’ll be inspired enough to try out a new language or coffee variety.&lt;/p&gt;

&lt;p&gt;Without further ado, make yourself a coffee, take a seat and enjoy my coffee/programming language pairings!&lt;/p&gt;

&lt;h2&gt;
  
  
  Ada and Venezuelan coffee: Utterly great - almost perfect - and incredibly difficult to find
&lt;/h2&gt;

&lt;p&gt;I'll start things by coming clean: Ada is my favourite programming language. And I'm originally from Venezuela. So there's going to be some bias here. However, I'm pretty sure anyone who’s tried Ada can admit that it's a hell of a language! And Venezuela has always been pretty well known for its amazing coffee and cocoa beans, so hopefully, I'm not too detached from the truth anyway.&lt;/p&gt;

&lt;p&gt;What makes them so great, then? When it comes to Ada, one has to first understand what it was made for: highly secure and reliable systems. Which explains many of the things surrounding the language; a very strict type system that's also incredibly expressive, it possesses a weird array and string types that force you to always define their size so that the compiler can guarantee that there's not going to be an overflow. Plus, its syntax, while seemingly verbose at first, is very well suited for readability (something that makes a lot of sense, given that we spend way more time reading software than writing it).&lt;/p&gt;

&lt;p&gt;All in all, Ada is a very well-thought-out programming language that makes way too much sense most of the time and thus, in my opinion, lends itself quite well for learning programming concepts, since it's a language that aids you a lot in your thinking process.&lt;/p&gt;

&lt;p&gt;Unfortunately, though, it's garnered a bad rap since the very beginning for its relation with the US Department of Defence and being a closed language with a paid compiler. Nowadays, you can download a free version of it, but it’s still not widely used. Many issues you'll find while developing will not be as simple to solve as doing a Google search or looking on Stack Overflow.&lt;/p&gt;

&lt;p&gt;As for Venezuelan coffee: if you can imagine how good coffee should taste like, then you pretty much know why it's so highly regarded. Because of the country’s currently “fragile” state, it's not as readily available in your everyday roaster coffee shop. Same as with Ada, if you get your hands on it, please try it. You won't regret it!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ada"&gt;&lt;code&gt;&lt;span class="kn"&gt;with&lt;/span&gt; &lt;span class="nn"&gt;Ada&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nn"&gt;Text_IO&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="n"&gt;Ada&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Text_IO&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;procedure&lt;/span&gt; &lt;span class="nf"&gt;Drinking_Venezuelan_Coffee&lt;/span&gt; &lt;span class="k"&gt;is&lt;/span&gt;
    &lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nf"&gt;Level_Type&lt;/span&gt; &lt;span class="k"&gt;is&lt;/span&gt; &lt;span class="k"&gt;range&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;..&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nf"&gt;Coffee_Origin_Type&lt;/span&gt; &lt;span class="k"&gt;is&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Venezuela&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Kenya&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Rwanda&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Sumatra&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nf"&gt;Coffee_Mug&lt;/span&gt; &lt;span class="k"&gt;is&lt;/span&gt; &lt;span class="k"&gt;record&lt;/span&gt;
        &lt;span class="n"&gt;Level&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Level_Type&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;Coffee_Origin&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Coffee_Origin_Type&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="k"&gt;record&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;procedure&lt;/span&gt; &lt;span class="nf"&gt;Fill_Mug&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;M&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="k"&gt;out&lt;/span&gt; &lt;span class="n"&gt;Coffee_Mug&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;is&lt;/span&gt;
    &lt;span class="k"&gt;begin&lt;/span&gt;
        &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;M&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Level&lt;/span&gt; &lt;span class="k"&gt;is&lt;/span&gt;
            &lt;span class="k"&gt;when&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;..&lt;/span&gt; &lt;span class="mi"&gt;99&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; 
                &lt;span class="n"&gt;M&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Level&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;Level_Type&lt;/span&gt;&lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="na"&gt;Last&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="n"&gt;Put_line&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Mug filled!"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="k"&gt;when&lt;/span&gt; &lt;span class="k"&gt;others&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; 
                &lt;span class="n"&gt;Put_Line&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Mug is already full!"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="k"&gt;case&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="n"&gt;Fill_Mug&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="n"&gt;My_Mug&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Coffee_Mug&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Level&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Coffee_Origin&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Venezuela&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;begin&lt;/span&gt;
    &lt;span class="n"&gt;Fill_Mug&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;My_Mug&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="n"&gt;Drinking_Venezuelan_Coffee&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Pony and Kenyan coffee: Down-to-earth and inconspicuous, but full of flavour
&lt;/h2&gt;

&lt;p&gt;What I like a lot about Kenyan coffee is that it's a very grounded coffee. You can almost taste the earth with every sip of it. If you don't get what I mean, imagine the amazing smell of earth just before it rains. Yep, Kenyan coffee tastes that good!&lt;/p&gt;

&lt;p&gt;That same feeling is the one I get whenever I do something with the Pony language. Pony is a very welcoming programming language because it doesn't try to be more than it is. And yet, what it has to offer is quite powerful and unique. For starters, Pony is an actor based language. If you are familiar with Erlang or using channels, you'll get the gist of it. But if not, think of every actor as a living object (or process) that communicates with other actors by sending and receiving messages. This already makes Pony quite suitable for concurrent systems and programs, but there's more: Pony is also a capabilities based programming language, in which everything has a set of rules that tells you what you can and cannot do with it. For instance, a variable with the Value capability is read-only, which means that you can safely share it between your actors. A variable with the Reference capability is mutable, which means that you can't pass it around. There are of course many more of them, but hopefully you got the gist of it. All of this comes packaged in a nice syntax that reminds me of Python, which is always a nice language to read.&lt;/p&gt;

&lt;p&gt;Did it sound compelling? I hope it did! And if you decide to try Pony, please ask a friendly barista to make you a cup of Kenyan coffee to go along with it. You can have it however you like, but I recommend it black and without sugar.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight pony"&gt;&lt;code&gt;&lt;span class="kr"&gt;actor&lt;/span&gt; &lt;span class="nc"&gt;Customer&lt;/span&gt;
  &lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;
  &lt;span class="kr"&gt;var&lt;/span&gt; &lt;span class="nc"&gt;_coffee&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;""&lt;/span&gt;

  &lt;span class="kr"&gt;new&lt;/span&gt; &lt;span class="n"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;'&lt;/span&gt;

  &lt;span class="kr"&gt;be&lt;/span&gt; &lt;span class="n"&gt;ask_for_coffee&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Barista&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
    &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;prepare_coffee&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kr"&gt;this&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="kr"&gt;be&lt;/span&gt; &lt;span class="n"&gt;receive_coffee&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;coffee&lt;/span&gt;&lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
    &lt;span class="nc"&gt;_coffee&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;coffee&lt;/span&gt;&lt;span class="p"&gt;'&lt;/span&gt;

&lt;span class="kr"&gt;actor&lt;/span&gt; &lt;span class="nc"&gt;Barista&lt;/span&gt;
  &lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="n"&gt;available_coffee&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;
  &lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="nc"&gt;_out&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;OutStream&lt;/span&gt;

  &lt;span class="kr"&gt;new&lt;/span&gt; &lt;span class="n"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;available_coffee&lt;/span&gt;&lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;OutStream&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
    &lt;span class="n"&gt;available_coffee&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;available_coffee&lt;/span&gt;&lt;span class="p"&gt;'&lt;/span&gt;
    &lt;span class="nc"&gt;_out&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;out&lt;/span&gt;

  &lt;span class="kr"&gt;be&lt;/span&gt; &lt;span class="n"&gt;prepare_coffee&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Customer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
      &lt;span class="nc"&gt;_out&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"One "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;available_coffee&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;" coffee for "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;receive_coffee&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;available_coffee&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="kr"&gt;actor&lt;/span&gt; &lt;span class="nc"&gt;Main&lt;/span&gt;
  &lt;span class="kr"&gt;new&lt;/span&gt; &lt;span class="n"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Env&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;

  &lt;span class="kr"&gt;var&lt;/span&gt; &lt;span class="n"&gt;barista&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Barista&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Kenyan"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="kr"&gt;var&lt;/span&gt; &lt;span class="n"&gt;customer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Customer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Jane"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="n"&gt;customer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ask_for_coffee&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;barista&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Reason and Rwandan coffee: Familiar on the outside, amazingly exciting on the inside
&lt;/h2&gt;

&lt;p&gt;If there's something that Reason and Rwandan coffee have in common, is that they both look like something else at first glance. When it comes to Rwandan coffee it just looks like, well, any other coffee, but when you try it… uff, it's like no coffee you've ever had!&lt;/p&gt;

&lt;p&gt;As for Reason, from a syntax point of view, it's eerily similar to JavaScript. This happens for a good reason (pun intended): it's a language mostly directed at JavaScript developers. Reducing "grammar friction" is one of its objectives. However, under that first superficial layer of familiarity lies a different language in many, many ways.&lt;br&gt;
First off, Reason, unlike JavaScript, is powered by OCaml. You could say that it's a syntax layer on top of OCaml. At its core, it has the kind of strong and rich type system that JavaScript could only dream of (I still love you, JavaScript, just not in the same way!). With Reason, you'll be able to construct better software that's easier to rely on. In addition to that, you can compile to both JavaScript and OCaml, giving you access to two very mature ecosystems at once. Oh, and if you needed one more reason (yes, pun intended… again) to try it, two words: pattern matching. Think of it as a sort of switch statement that lets you match the shape of your data instead of just doing it by an explicit value. Trust me, once you use a language with pattern matching, you'll miss it whenever you're using one that doesn't!&lt;/p&gt;

&lt;p&gt;If you feel like trying out something new but don't feel like going too far from your comfort zone, be it other kinds of coffee or programming languages with C style syntax, then maybe you should consider checking out Reason or Rwandan coffee, you can't go wrong with either one!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight reasonml"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;workingHours&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;workStartsAt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;myPreferredDrink&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Rwandan coffee"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;translateTime&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hour&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; 
  &lt;span class="n"&gt;hour&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;13&lt;/span&gt; 
  &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="n"&gt;string_of_int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hour&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;++&lt;/span&gt; &lt;span class="s2"&gt;"AM"&lt;/span&gt; 
  &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;string_of_int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hour&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;++&lt;/span&gt; &lt;span class="s2"&gt;"PM"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;whatToDo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;firstHour&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;currentHour&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;drink&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;timeOfDay&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;firstHour&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;currentHour&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;atTime&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;predicate&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; 
      &lt;span class="s2"&gt;"At "&lt;/span&gt; &lt;span class="o"&gt;++&lt;/span&gt; &lt;span class="n"&gt;translateTime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;timeOfDay&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;++&lt;/span&gt; &lt;span class="n"&gt;predicate&lt;/span&gt; &lt;span class="o"&gt;++&lt;/span&gt; &lt;span class="s2"&gt;"!"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;switch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;timeOfDay&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timeOfDay&lt;/span&gt; &lt;span class="ow"&gt;mod&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;atTime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;" drink more "&lt;/span&gt; &lt;span class="o"&gt;++&lt;/span&gt; &lt;span class="n"&gt;drink&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;atTime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;": Lunch break"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;atTime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;" drink "&lt;/span&gt; &lt;span class="o"&gt;++&lt;/span&gt; &lt;span class="n"&gt;drink&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hour&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="n"&gt;workingHours&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nn"&gt;Js&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;whatToDo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;workStartsAt&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;hour&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;myPreferredDrink&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Idris and Sumatran coffee: Strange, hard to grasp and filled with incredible depth
&lt;/h2&gt;

&lt;p&gt;When it comes to programming languages that I enjoy playing around with, a certain group of so-called functional programming languages is at the top. One of the most popular in that group is Haskell, from which Idris takes a lot of cues.&lt;/p&gt;

&lt;p&gt;One of the core tenants of a functional programming language is that functions are first class citizens. You can treat them as you would any other value, which allows for pretty powerful things like returning functions or passing them around as arguments to other functions. They also tend to feature very strong type systems. However, one other thing that makes languages such as Idris so special is their declarative syntax style, which looks more as if you were describing things instead of the more intuitive command-like style (do this, then that) of writing imperative style code.&lt;/p&gt;

&lt;p&gt;Sumatran coffee is also a very special kind of coffee because of the way in which it's processed, as well as the kind of climate where it grows. This makes it so that Sumatran coffee tastes quite different from what you would expect coffee to taste like. It tastes almost foreign to someone more used to the kind of "regular" coffee you would find at your average café. In the same way, Idris or Haskell look almost foreign to someone used to more imperative programming languages like C or Java.&lt;/p&gt;

&lt;p&gt;Yet, besides all that, Idris most distinctive feature is not that it's a functional programming language per se, but rather something more unique: dependent types. You can enhance a type by providing a value together with it. A good example for this would be the &lt;code&gt;concat&lt;/code&gt; function, which would be typed something like &lt;code&gt;List n t -&amp;gt; List m t -&amp;gt; List (n + m) t&lt;/code&gt;. The first argument will be a list of &lt;code&gt;n&lt;/code&gt; elements, the second a list of &lt;code&gt;m&lt;/code&gt; elements and the result will be a list with &lt;code&gt;n + m&lt;/code&gt; elements. How cool is that?! With dependent types, you gain a whole new level of control over what to expect from your code. In my book, that’s always good.&lt;/p&gt;

&lt;p&gt;Whenever you're ready to try something different and exciting, be it Idris, Sumatran coffee or (even better) both: be prepared and enjoy the ride!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight haskell"&gt;&lt;code&gt;&lt;span class="n"&gt;isSumatranCoffee&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;Bool&lt;/span&gt;
&lt;span class="n"&gt;isSumatranCoffee&lt;/span&gt; &lt;span class="s"&gt;"Sumatran"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;True&lt;/span&gt;
&lt;span class="n"&gt;isSumatranCoffee&lt;/span&gt; &lt;span class="kr"&gt;_&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;False&lt;/span&gt;

&lt;span class="n"&gt;drinkOrPass&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt;
&lt;span class="n"&gt;drinkOrPass&lt;/span&gt; &lt;span class="n"&gt;coffee&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kr"&gt;case&lt;/span&gt; &lt;span class="n"&gt;isSumatranCoffee&lt;/span&gt; &lt;span class="n"&gt;coffee&lt;/span&gt; &lt;span class="kr"&gt;of&lt;/span&gt;
  &lt;span class="kt"&gt;True&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;"I'll have some of that Sumatran coffee, please!"&lt;/span&gt;
  &lt;span class="kt"&gt;False&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;"No thanks, I’d rather have something else"&lt;/span&gt;

&lt;span class="n"&gt;main&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;IO&lt;/span&gt; &lt;span class="nb"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;main&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;putStrLn&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;drinkOrPass&lt;/span&gt; &lt;span class="s"&gt;"Sumatran"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;There are of course many other programming languages and coffee beans that are worth talking about. Like Nicaraguan coffee with its acidic notes, the aromatic wonder that Ethiopian coffee is, the esoteric 8th with its stack-based syntax or Clojure &lt;code&gt;(which is a cool language (based on Lisp (which means (it uses lots of parentheses))))&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Hopefully, I got to pique your curiosity on at least one of the combos that I paired above. Few things are as fun as trying new programming languages. Combine that with a cup of coffee made with freshly roasted beans, and you're all set!&lt;/p&gt;

</description>
      <category>programming</category>
      <category>coffee</category>
      <category>ada</category>
      <category>pony</category>
    </item>
    <item>
      <title>How to Build a Card-Linked Application With Node.js, React and the Fidel Web SDK</title>
      <dc:creator>Alex Lakatos 🥑</dc:creator>
      <pubDate>Mon, 24 May 2021 13:08:50 +0000</pubDate>
      <link>https://forem.com/fidel/how-to-build-a-card-linked-application-with-node-js-react-and-the-fidel-web-sdk-31bf</link>
      <guid>https://forem.com/fidel/how-to-build-a-card-linked-application-with-node-js-react-and-the-fidel-web-sdk-31bf</guid>
      <description>&lt;p&gt;&lt;a href="https://fidel.uk/" rel="noopener noreferrer"&gt;Fidel&lt;/a&gt; makes it simple to add card-linking capabilities to any application. The process involves setting up a program, along with the participating brands and locations. And then registering or helping your users register their cards on the Fidel platform. Once they are live, Fidel receives transactions from participating locations and will pass them along to your application using webhooks. You can register your webhook URLs in the Fidel Dashboard and start receiving the transaction data.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Are We Building?
&lt;/h2&gt;

&lt;p&gt;There are two main steps in the process, and this tutorial is going to walk you through building an application with a card-linking feature.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2FFidelLimited%2Fdocs%2Fmaster%2Fassets%2Fimages%2Ftutorial-card-linking.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2FFidelLimited%2Fdocs%2Fmaster%2Fassets%2Fimages%2Ftutorial-card-linking.png" title="Card-Linked Application Demo" alt="Card-Linked Application Demo" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The first requirement is to register user cards on the Fidel platform. Fidel provides SDKs to use within your applications to help you register cards simply and securely. This tutorial will show you how to use the Fidel Web SDK in a React application to register cards. &lt;/p&gt;

&lt;p&gt;The second part of the card-linking process is the flow of transaction data from participating locations whenever a user makes a purchase with a registered card. For delivering the flow of transactions to your application, the Fidel platform uses webhooks. This tutorial is going to walk you through setting up a Node.js server that listens for transaction data, register it with the Fidel platform using ngrok, and start receiving transactions. You'll also use the server to send the transactions to the React client after receiving them, so you can display them in the UI.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;Before you begin, make sure you've got a few things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;a href="https://dashboard.fidel.uk/sign-in" rel="noopener noreferrer"&gt;Fidel Account&lt;/a&gt;. You can create one via the &lt;a href="https://dashboard.fidel.uk/sign-up" rel="noopener noreferrer"&gt;Fidel Dashboard&lt;/a&gt; if you don't already have one!&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://nodejs.org/download/release/latest-v12.x/" rel="noopener noreferrer"&gt;Node.js v12.22.1&lt;/a&gt; or higher installed.&lt;/li&gt;
&lt;li&gt;A &lt;a href="https://dashboard.ngrok.com/signup" rel="noopener noreferrer"&gt;ngrok&lt;/a&gt; account.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://ngrok.com/download" rel="noopener noreferrer"&gt;ngrok&lt;/a&gt; installed and set up.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Build the Client Application to Link Cards
&lt;/h2&gt;

&lt;p&gt;You'll first build a React client to use the Fidel Web SDK and give your application the ability to link cards to your Fidel program.&lt;/p&gt;

&lt;h3&gt;
  
  
  Create React Application
&lt;/h3&gt;

&lt;p&gt;Let's go ahead and create a new React application using &lt;code&gt;create-react-app&lt;/code&gt;. After you've generated a new project called &lt;code&gt;fidel-card-linking-tutorial&lt;/code&gt;, run it using the generated &lt;code&gt;npm start&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;npx create-react-app fidel-card-linking-tutorial
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;fidel-card-linking-tutorial
&lt;span class="nv"&gt;$ &lt;/span&gt;npm start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should have a blank new React application running in your browser on port 3000. The generated files should look similar to this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
├── README.md
├── package.json
├── node_modules
├── public
│   ├── favicon.ico
│   ├── index.html
│   ├── logo192.png
│   ├── logo512.png
│   ├── manifest.json
│   └── robots.txt
├── src
│   ├── App.css
│   ├── App.js
│   ├── App.test.js
│   ├── index.css
│   ├── index.js
│   ├── logo.svg
│   ├── reportWebVitals.js
│   └── setupTests.js
└── yarn.lock

2 directories, 17 files
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Add Tailwind CSS
&lt;/h3&gt;

&lt;p&gt;You'll want to create a nice-looking application, and for that, a CSS framework is probably the simplest to use option. Let's go ahead and add &lt;a href="https://tailwindcss.com/" rel="noopener noreferrer"&gt;TailwindCSS&lt;/a&gt; to the empty React application. Add a line in the &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; section of the &lt;code&gt;/public/index.html&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://unpkg.com/tailwindcss@^2/dist/tailwind.min.css"&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"stylesheet"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Add Empty Layout
&lt;/h3&gt;

&lt;p&gt;After you've included Tailwind into the empty project, let's remove the boilerplate code in the &lt;code&gt;/src/App.js&lt;/code&gt; file and replace it with an empty application shell. It's already set up to have a header and a table to display the transaction data you'll get from Fidel.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ReactComponent&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;Logo&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./assets/logo.svg&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;App&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Amount&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Cashback&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Scheme&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Card&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Brand&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Location&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Status&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Date↓&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"App h-full"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"h-full overflow-x-hidden"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;nav&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"bg-white shadow"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"flex flex-col container mx-auto md:flex-row md:items-center md:justify-between"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"flex justify-between items-center"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
              &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"flex justify-between items-center"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt; &lt;span class="na"&gt;href&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"https://fidel.uk/docs"&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"w-full"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                  &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Logo&lt;/span&gt; &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;90px&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;60px&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
                &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;
                  &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"ml-10 w-full bg-blue-700 hover:bg-blue-900 text-white py-2 px-4 rounded"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                  Add Card
                  &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
              &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"md:flex flex-col md:flex-row md:-mx-4"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
              &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt;
                &lt;span class="na"&gt;href&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"https://fidel.uk/docs/web-sdk"&lt;/span&gt;
                &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"my-1 hover:text-gray-800 text-blue-700 md:mx-4 md:my-0"&lt;/span&gt;
              &lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                Documentation ↗
              &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;nav&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;

        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"px-6 py-2 py-8"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"flex justify-between container mx-auto"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"w-full"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
              &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"flex items-center justify-between"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"text-xl text-gray-700 md:text-2xl"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                  Transactions
                &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
              &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
              &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"-my-2 py-2 overflow-x-auto sm:-mx-6 sm:px-6 py-2 lg:-mx-8 pr-10 lg:px-8"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;

                &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"align-middle"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                  &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;table&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"min-w-full"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;thead&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;tr&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                        &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;header&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
                          &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;th&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"px-6 py-2 py-3 text-left text-gray-400 font-light text-sm"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;header&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;th&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                        &lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
                      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;tr&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;thead&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;tbody&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"bg-white"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;tbody&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                  &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;table&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
              &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Add Logo Components
&lt;/h3&gt;

&lt;p&gt;You've probably noticed your application is failing to compile now. And that's because you haven't yet added the logo component that's being used in the empty application shell above. To do that, create a new &lt;code&gt;assets&lt;/code&gt; folder inside the &lt;code&gt;/src&lt;/code&gt; directory, and create an empty &lt;code&gt;logo.svg&lt;/code&gt; file. Now&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;src/assets
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;touch &lt;/span&gt;src/assets/logo.svg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your application is still going to fail to compile, but with a new error. And that's because the empty SVG file should actually be a valid SVG. Replace the contents of &lt;code&gt;/src/assets/logo.svg&lt;/code&gt; with the Fidel logo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;svg&lt;/span&gt; &lt;span class="na"&gt;version=&lt;/span&gt;&lt;span class="s"&gt;"1.1"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"Layer_1"&lt;/span&gt; &lt;span class="na"&gt;xmlns=&lt;/span&gt;&lt;span class="s"&gt;"http://www.w3.org/2000/svg"&lt;/span&gt; &lt;span class="na"&gt;xmlns:xlink=&lt;/span&gt;&lt;span class="s"&gt;"http://www.w3.org/1999/xlink"&lt;/span&gt; &lt;span class="na"&gt;x=&lt;/span&gt;&lt;span class="s"&gt;"0px"&lt;/span&gt; &lt;span class="na"&gt;y=&lt;/span&gt;&lt;span class="s"&gt;"0px"&lt;/span&gt;
   &lt;span class="na"&gt;width=&lt;/span&gt;&lt;span class="s"&gt;"802px"&lt;/span&gt; &lt;span class="na"&gt;height=&lt;/span&gt;&lt;span class="s"&gt;"407.6px"&lt;/span&gt; &lt;span class="na"&gt;viewBox=&lt;/span&gt;&lt;span class="s"&gt;"0 0 802 407.6"&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"enable-background:new 0 0 802 407.6;"&lt;/span&gt; &lt;span class="na"&gt;xml:space=&lt;/span&gt;&lt;span class="s"&gt;"preserve"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;style &lt;/span&gt;&lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text/css"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/style&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;g&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;g&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;path&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"st0"&lt;/span&gt; &lt;span class="na"&gt;d=&lt;/span&gt;&lt;span class="s"&gt;"M101.3,286.7h45v-65.3h30.8l17.9-36.2h-48.7v-27.5H195v-36.2h-93.7V286.7z M231.7,286.7h45.5V121.5h-45.5
      V286.7z M422.7,141.4c-7.8-6.7-17.1-11.8-27.7-15.2c-10.6-3.4-22.1-5.2-34-5.2h-42.9v165.7H361c14.8,0,27.9-2.2,38.9-6.6
      c10.9-4.3,20-10.4,27.1-17.9c7.1-7.6,12.4-16.5,15.9-26.6c3.5-10.3,5.3-21.3,5.3-32.9c0-13.6-2.3-25.7-6.9-35.9
      C436.7,156.5,430.4,148,422.7,141.4z M392.9,236.9c-6.9,7.9-16.9,11.9-29.7,11.9h-3.6v-90h3.6c26.2,0,40,15.6,40,45.1
      C403.2,218,399.7,229.1,392.9,236.9z M482.3,286.7H576v-37.9h-48.7v-27.4H576v-36.2h-48.7v-27.5H576v-36.2h-93.7V286.7z
       M660.9,248.8V121.5h-44.9v165.2h84.8v-37.9H660.9z"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/g&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/g&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/svg&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Add the Fidel Web SDK
&lt;/h2&gt;

&lt;p&gt;Now that your application compiles successfully, you'll see an empty table layout with a button above that prompts you to "Add Card". At this stage, the button doesn't do anything, so you'll need to add that capability to the React application. This is where the Fidel Web SDK comes in handy. We'll add the SDK to the application, so we can start registering cards on the Fidel Platform.&lt;/p&gt;

&lt;p&gt;First, at the top of your &lt;code&gt;/src/App.js&lt;/code&gt; file, import &lt;code&gt;useEffect&lt;/code&gt; from React.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useEffect&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Fidel Web SDK is a JavaScript file hosted at &lt;code&gt;https://resources.fidel.uk/sdk/js/v2/fidel.js&lt;/code&gt;. The required attributes for functioning correctly are the Fidel SDK Key, the Program Id and the company name. &lt;/p&gt;

&lt;p&gt;You can find the SDK Key in the &lt;a href="https://dashboard.fidel.uk/account/plan" rel="noopener noreferrer"&gt;"Account" section of the Fidel Dashboard&lt;/a&gt;. For the purpose of this tutorial, use the Test SDK Key. It should start with &lt;code&gt;pk_test_&lt;/code&gt;. The Program Id can be found in the &lt;a href="https://dashboard.fidel.uk/programs" rel="noopener noreferrer"&gt;"Program" section of the Dashboard&lt;/a&gt;. The Demo Program that comes with each new account has a contextual menu that you can use to copy the program ID. For the company name, you can use anything you want. For the purposes of this tutorial, use something generic like "Fidel Card-Linking Application".&lt;/p&gt;

&lt;p&gt;To add the SDK to your application, use an effect that runs only once at startup to create a &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; tag with the Fidel SDK, add the required attributes to it, and then append it to the document body. In the &lt;code&gt;App()&lt;/code&gt; function of the &lt;code&gt;/src/App.js&lt;/code&gt; file, add the effect:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;App&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Amount&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Cashback&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Scheme&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Card&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Brand&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Location&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Status&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Date↓&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

  &lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;fidel-form&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)?.&lt;/span&gt;&lt;span class="nf"&gt;remove&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sdkScript&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;script&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;sdkScript&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;src&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://resources.fidel.uk/sdk/js/v2/fidel.js&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;sdkScript&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;fidel-form&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;attributes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;data-auto-open&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;false&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;data-key&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;REACT_APP_FIDEL_SDK_KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;data-program-id&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;REACT_APP_FIDEL_PROGRAM_ID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;data-company-name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Fidel Card-Linking Application&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;

    &lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;attributes&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
      &lt;span class="nx"&gt;sdkScript&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;attributes&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;appendChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sdkScript&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[]);&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;
  &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Because you've set &lt;code&gt;auto-open&lt;/code&gt; to false in the SDK attributes, the SDK overlay will only show if called, with &lt;code&gt;Fidel?.openForm()&lt;/code&gt;. Add a &lt;code&gt;onClick&lt;/code&gt; handler to the "Add Card" button to open the SDK overlay when clicked.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;
  &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Fidel&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nf"&gt;openForm&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
  &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"ml-10 w-full bg-blue-700 hover:bg-blue-900 text-white py-2 px-4 rounded"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  Add Card
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Create Environment File
&lt;/h3&gt;

&lt;p&gt;You might have noticed the example code didn't hardcode the values of the SDK key and program id but rather used environment variables. The generated React application already has support for environment variables. To use them, you need to create an &lt;code&gt;.env&lt;/code&gt; file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;touch&lt;/span&gt; .env
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add variables to it, and fill out the values for your SDK key and program Id in &lt;code&gt;REACT_APP_FIDEL_SDK_KEY&lt;/code&gt; and &lt;code&gt;REACT_APP_FIDEL_PROGRAM_ID&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;PORT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;3001
&lt;span class="nv"&gt;REACT_APP_SERVER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://127.0.0.1:3000
&lt;span class="nv"&gt;REACT_APP_FIDEL_SDK_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;
&lt;span class="nv"&gt;REACT_APP_FIDEL_PROGRAM_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Because you've added the &lt;code&gt;PORT&lt;/code&gt; environment variable, your application will now run on port 3001 and leave port 3000 open for the server we'll build in a minute. You'll need to restart your application with&lt;code&gt;npm start&lt;/code&gt;. Your application should compile successfully and run at "&lt;a href="http://localhost:3001/" rel="noopener noreferrer"&gt;http://localhost:3001/&lt;/a&gt;". If you click the "Add Card" button, a model should pop up with a form to link a card.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2FFidelLimited%2Fdocs%2Fmaster%2Fassets%2Fimages%2Ftutorial-card-linking-form.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2FFidelLimited%2Fdocs%2Fmaster%2Fassets%2Fimages%2Ftutorial-card-linking-form.png" title="Card-Linking Form" alt="Card-Linking Form" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Test Card Numbers
&lt;/h3&gt;

&lt;p&gt;Because you're using the Test SDK key in your application, you won't be able to link a real card in the SDK. There are a few options for test card numbers available in the &lt;a href="https://fidel.uk/docs/cards/#test-card-numbers" rel="noopener noreferrer"&gt;documentation&lt;/a&gt;. You can add a test Visa card, for example, by using the card number &lt;code&gt;4444 0000 0000 4001&lt;/code&gt; and set an expiration date in the future, with a participating country of issue from the dropdown.&lt;/p&gt;

&lt;p&gt;Congratulation, you have successfully added the ability to register cards to your React application and used it to link your first card on the Fidel platform!&lt;/p&gt;

&lt;h2&gt;
  
  
  Server Listening For Webhook Events
&lt;/h2&gt;

&lt;p&gt;To start receiving transactions from your linked card, you'll need to register webhooks in the Fidel Dashboard. Before you can register them, you'll need to build them. Create a new &lt;code&gt;server.js&lt;/code&gt; file at the root of your &lt;code&gt;fidel-card-linking-tutorial&lt;/code&gt; folder.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;touch &lt;/span&gt;server.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let's go ahead and implement a fairly standard Node.js server, using &lt;code&gt;express&lt;/code&gt;, that listens on port 3000. First, install the dependencies with &lt;code&gt;$ npm install express cors&lt;/code&gt; and then add some boilerplate code to the &lt;code&gt;server.js&lt;/code&gt; file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;express&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;express&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createServer&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;http&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;cors&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;cors&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;PORT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3000&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;json&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;express&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;express&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;cors&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;server&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createServer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;PORT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Server listening at http://localhost:&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;PORT&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Fidel platform can register a multitude of webhooks, so let's add a generic catch-all route &lt;code&gt;/api/webhooks/:type&lt;/code&gt; that deals with webhooks and sends back a &lt;code&gt;200 OK&lt;/code&gt; response. If your webhook doesn't return a 200 status, the Fidel platform retries sending the webhook until it receives a 200 status.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/api/webhooks/:type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;next&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;end&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you try to run the server as is right now, you'll get an error saying you "Cannot use import statement outside a module". And that's because you're using modern import statements in your Node.js code. You'll need to update the &lt;code&gt;package.json&lt;/code&gt; with a new line to support imports.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;module&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It would also be helpful if you could run both the React client and the Node.js server with the same command. Update the &lt;code&gt;start&lt;/code&gt; script inside &lt;code&gt;package.json&lt;/code&gt; to run the server and the client at the same time. You'll need to run &lt;code&gt;npm start&lt;/code&gt; again after you're done.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;scripts&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;start&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;node server.js &amp;amp; react-scripts start&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Register Webhooks with Fidel
&lt;/h3&gt;

&lt;p&gt;Now that you have created a server listening for webhooks, it's time to register those webhooks on the Fidel platform. Your webhooks need to be publicly accessible on the Internet for Fidel to be able to access them. Sadly, &lt;code&gt;localhost&lt;/code&gt; is not publicly accessible, so you'll need to use &lt;code&gt;ngrok&lt;/code&gt; to make it so. &lt;/p&gt;

&lt;p&gt;There are a few other options here. Usually, with production code, you'll have it deployed somewhere with a URL. Or you'll have a load balancer in front of your code, and that will be publicly accessible. But for exposing local code, there aren't many options that don't involve a deployment. This is where &lt;code&gt;ngrok&lt;/code&gt; comes in handy. It's a tunnelling software that creates a connection between a public URL they host, like &lt;code&gt;https://someRandomId.ngrok.io&lt;/code&gt;, and a port on your local machine.&lt;/p&gt;

&lt;p&gt;Because the server is running on port 3000, you'll start &lt;code&gt;ngrok&lt;/code&gt; on that port with the &lt;code&gt;http&lt;/code&gt; option. You'll get back a random-looking URL that is publicly accessible on the Internet, and you can use it as the base of your webhook URLs. For example, &lt;code&gt;https://a709be896425.ngrok.io&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2FFidelLimited%2Fdocs%2Fmaster%2Fassets%2Fimages%2Ftutorial-card-linking-ngrok.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2FFidelLimited%2Fdocs%2Fmaster%2Fassets%2Fimages%2Ftutorial-card-linking-ngrok.png" title="Card-Linking ngrok" alt="Card-Linking ngrok" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After you've got a ngrok URL, you can go ahead and register a couple of webhooks in the &lt;a href="https://dashboard.fidel.uk/webhooks" rel="noopener noreferrer"&gt;Fidel Dashboard&lt;/a&gt;. For the purposes of this tutorial, register the &lt;code&gt;transaction.auth&lt;/code&gt; webhook on the "Demo Program" to &lt;a href="https://a709be896425.ngrok.io/api/webhooks/transaction.auth" rel="noopener noreferrer"&gt;https://a709be896425.ngrok.io/api/webhooks/transaction.auth&lt;/a&gt;. Follow the same URL convention for registering the &lt;code&gt;transaction.clearing&lt;/code&gt; and &lt;code&gt;transaction.refund&lt;/code&gt; webhooks as well.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2FFidelLimited%2Fdocs%2Fmaster%2Fassets%2Fimages%2Ftutorial-card-linking-webhooks.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2FFidelLimited%2Fdocs%2Fmaster%2Fassets%2Fimages%2Ftutorial-card-linking-webhooks.png" title="Card-Linking Webhooks" alt="Card-Linking Webhooks" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Congratulations, you've registered your first webhooks with Fidel. You can start receiving transaction data!&lt;/p&gt;

&lt;h2&gt;
  
  
  Socket.io to Glue It All Together
&lt;/h2&gt;

&lt;p&gt;You've probably noticed your server can receive transaction data from Fidel, but it doesn't do anything with that data. That's because what you do with that data depends heavily on your application use case. For the purpose of this tutorial, let's send that transaction data from the server to the React client, so you can display it in the UI.&lt;/p&gt;

&lt;p&gt;Because the data comes from a webhook, your server doesn't have a lot of control over when it receives the data. Hence, your client can't keep asking for data that isn't there. Because of the event-driven nature of webhooks, long polling is not a great mechanism to pass data. There are a few options, mainly HTTP/2 Server Push, Node.js streams or Web Sockets. You can use something like &lt;code&gt;socket.io&lt;/code&gt;, which combines WebSockets with long polling to ensure maximum browser compatibility while you pass the transaction data from the server to the client. And you'll use just that for this tutorial. Let's go ahead and install the dependencies with &lt;code&gt;$ npm install socket.io socket.io-client&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Add Socket.io to the Server
&lt;/h3&gt;

&lt;p&gt;You'll need to add the socket mechanism to the server first. Import the &lt;code&gt;Server&lt;/code&gt; from &lt;code&gt;socket.io&lt;/code&gt; at the top of your &lt;code&gt;server.js&lt;/code&gt; file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Server&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;socket.io&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Before the webhook route is defined, instantiate a new socket Server, and log to the console every time a client connects to the socket. Update the webhook route handler to emit on the socket every time there is new transaction data coming from Fidel.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;io&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Server&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;cors&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;origin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;http://localhost:3001&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;methods&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;GET&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="nx"&gt;io&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;connection&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;a client connected&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/api/webhooks/:type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;next&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;io&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;emit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;end&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now that the server is completed restart it with &lt;code&gt;npm start&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Add Socket.io to the Client
&lt;/h3&gt;

&lt;p&gt;You'll need to add &lt;code&gt;socket.io&lt;/code&gt; to the client as well, in order to receive the transaction data and display it. At the top of your &lt;code&gt;/src/App.js&lt;/code&gt; file, import &lt;code&gt;socketIOClient&lt;/code&gt; from &lt;code&gt;socket.io-client&lt;/code&gt; and &lt;code&gt;useState&lt;/code&gt; from react.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useEffect&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;socketIOClient&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;socket.io-client&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After you've imported the socket in your &lt;code&gt;/src/App.js&lt;/code&gt;, you need to create a new socketIOClient in an effect. And register a listener that sets the transactions state on any incoming data.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;App&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;transactions&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setTransactions&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;([]);&lt;/span&gt;

  &lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;socket&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;socketIOClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;REACT_APP_SERVER&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nx"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;onAny&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;transaction&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nf"&gt;setTransactions&lt;/span&gt;&lt;span class="p"&gt;([{&lt;/span&gt; &lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;transaction&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;transactions&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;disconnect&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;
  &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Create Transaction Component
&lt;/h3&gt;

&lt;p&gt;Now that we've got the data coming into the React client, let's create a &lt;code&gt;Transaction&lt;/code&gt; component that displays it. First, create a &lt;code&gt;components&lt;/code&gt; folder inside the &lt;code&gt;src&lt;/code&gt; folder, and create an empty &lt;code&gt;Transaction.js&lt;/code&gt; file in it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;src/components
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;touch &lt;/span&gt;src/components/Transaction.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A transaction has a type and information about the currency, amount, card scheme, card number, store brand, name and location, and date of creation. Let's create a component that displays all that data to match the empty table we used in the initial empty shell for our application.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;formatCard&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;../utils&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ReactComponent&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;Amex&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;../assets/amex-icon.svg&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ReactComponent&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;Visa&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;../assets/visa-icon.svg&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ReactComponent&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;Mastercard&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;../assets/mastercard-icon.svg&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;TransactionStatus&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./TransactionStatus&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Transaction&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;transaction&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;transactions&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;tr&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;td&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"px-6 py-2 whitespace-no-wrap border-b border-gray-200 text-sm"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"flex items-center justify-between"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"text-gray-400"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;transaction&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;currency&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; 
          &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;transaction&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;amount&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;td&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;td&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"px-6 py-2 whitespace-no-wrap border-b border-gray-200 text-sm"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"text-gray-400"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;--&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;td&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;td&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"px-6 py-2 whitespace-no-wrap border-b border-gray-200 text-sm"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;transaction&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;card&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;scheme&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toUpperCase&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;AMEX&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;(&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Amex&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
        &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;transaction&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;card&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;scheme&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toUpperCase&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;VISA&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;(&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Visa&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
        &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;transaction&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;card&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;scheme&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toUpperCase&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;MASTERCARD&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;(&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Mastercard&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;td&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;td&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"px-6 py-2 whitespace-no-wrap border-b border-gray-200 text-sm text-gray-400"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;formatCard&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;transaction&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;card&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;td&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;td&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"px-6 py-2 whitespace-no-wrap border-b border-gray-200 text-sm"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;transaction&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;brand&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;td&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;td&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"px-6 py-2 whitespace-no-wrap border-b border-gray-200 text-sm"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;transaction&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;location&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;address&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;td&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;td&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"px-6 py-2 whitespace-no-wrap border-b border-gray-200 text-sm"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;TransactionStatus&lt;/span&gt; &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;td&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;td&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"px-6 py-2 whitespace-no-wrap border-b border-gray-200 text-sm"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;transaction&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;created&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toLocaleString&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;td&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;tr&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;Transaction&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For the application to compile, you'll need to create a few of the things we already used in the Transaction component. Start with the &lt;code&gt;TransactionStatus&lt;/code&gt; component in the same folder as the &lt;code&gt;Transaction&lt;/code&gt; component.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;touch &lt;/span&gt;src/components/TransactionStatus.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A transaction can have three statuses: authorized, cleared and refunded. The information is contained in the transaction type being passed from the server in the socket. Let's use that data to have a different coloured pill for the status and make it instantly recognizable in the UI.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;TransactionStatus&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;transaction.auth&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"relative inline-block px-3 py-1 font-semibold text-yellow-500"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt; &lt;span class="na"&gt;aria-hidden&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"absolute inset-0 bg-yellow-200 opacity-50 rounded-full"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"relative text-xs"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Auth&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
    &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;transaction.clearing&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"relative inline-block px-3 py-1 font-semibold text-green-500"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt; &lt;span class="na"&gt;aria-hidden&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"absolute inset-0 bg-green-200 opacity-50 rounded-full"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"relative text-xs"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Cleared&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
    &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;transaction.refund&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"relative inline-block px-3 py-1 font-semibold text-red-500"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt; &lt;span class="na"&gt;aria-hidden&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"absolute inset-0 bg-red-200 opacity-50 rounded-full"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"relative text-xs"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Refund&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;TransactionStatus&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You'll also need to create the icons for the three card networks in the assets folder as SVGs, the same as you did for the Fidel logo. &lt;/p&gt;

&lt;p&gt;First, create the Amex icon.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;touch &lt;/span&gt;src/assets/amex-icon.svg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;svg&lt;/span&gt; &lt;span class="na"&gt;width=&lt;/span&gt;&lt;span class="s"&gt;"34"&lt;/span&gt; &lt;span class="na"&gt;height=&lt;/span&gt;&lt;span class="s"&gt;"8"&lt;/span&gt; &lt;span class="na"&gt;viewBox=&lt;/span&gt;&lt;span class="s"&gt;"0 0 34 8"&lt;/span&gt; &lt;span class="na"&gt;fill=&lt;/span&gt;&lt;span class="s"&gt;"none"&lt;/span&gt; &lt;span class="na"&gt;xmlns=&lt;/span&gt;&lt;span class="s"&gt;"http://www.w3.org/2000/svg"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;path&lt;/span&gt; &lt;span class="na"&gt;fill-rule=&lt;/span&gt;&lt;span class="s"&gt;"evenodd"&lt;/span&gt; &lt;span class="na"&gt;clip-rule=&lt;/span&gt;&lt;span class="s"&gt;"evenodd"&lt;/span&gt; &lt;span class="na"&gt;d=&lt;/span&gt;&lt;span class="s"&gt;"M30.8291 0L29.0156 2.53729L27.2136 0H25L27.951 3.99979L25.0099 8H27.1602L28.9735 5.42863L30.7864 8H33L30.0379 3.96571L32.9789 0H30.8291Z"&lt;/span&gt; &lt;span class="na"&gt;fill=&lt;/span&gt;&lt;span class="s"&gt;"#2D6EB6"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;path&lt;/span&gt; &lt;span class="na"&gt;fill-rule=&lt;/span&gt;&lt;span class="s"&gt;"evenodd"&lt;/span&gt; &lt;span class="na"&gt;clip-rule=&lt;/span&gt;&lt;span class="s"&gt;"evenodd"&lt;/span&gt; &lt;span class="na"&gt;d=&lt;/span&gt;&lt;span class="s"&gt;"M19 0V8H25V6.38813H20.8003V4.77733H24.9038V3.17724H20.8003V1.62323H25V0H19Z"&lt;/span&gt; &lt;span class="na"&gt;fill=&lt;/span&gt;&lt;span class="s"&gt;"#2D6EB6"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;path&lt;/span&gt; &lt;span class="na"&gt;fill-rule=&lt;/span&gt;&lt;span class="s"&gt;"evenodd"&lt;/span&gt; &lt;span class="na"&gt;clip-rule=&lt;/span&gt;&lt;span class="s"&gt;"evenodd"&lt;/span&gt; &lt;span class="na"&gt;d=&lt;/span&gt;&lt;span class="s"&gt;"M14.895 0L13.5001 5.66873L12.0946 0H9V8H10.7101V2.53765L10.6678 0.37783L12.7028 8H14.2976L16.3322 0.423478L16.2905 2.52586V8H18V0H14.895Z"&lt;/span&gt; &lt;span class="na"&gt;fill=&lt;/span&gt;&lt;span class="s"&gt;"#2D6EB6"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;path&lt;/span&gt; &lt;span class="na"&gt;fill-rule=&lt;/span&gt;&lt;span class="s"&gt;"evenodd"&lt;/span&gt; &lt;span class="na"&gt;clip-rule=&lt;/span&gt;&lt;span class="s"&gt;"evenodd"&lt;/span&gt; &lt;span class="na"&gt;d=&lt;/span&gt;&lt;span class="s"&gt;"M3.29308 0L0 8H1.96474L2.61245 6.28552H6.26715L6.92556 8H9L5.71824 0H3.29308ZM3.87452 2.98299L4.43455 1.48624L4.99396 2.98299L5.6744 4.75448H3.2052L3.87452 2.98299Z"&lt;/span&gt; &lt;span class="na"&gt;fill=&lt;/span&gt;&lt;span class="s"&gt;"#2D6EB6"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/svg&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Second, create the Mastercard icon.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;touch &lt;/span&gt;src/assets/mastercard-icon.svg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;svg&lt;/span&gt; &lt;span class="na"&gt;width=&lt;/span&gt;&lt;span class="s"&gt;"21"&lt;/span&gt; &lt;span class="na"&gt;height=&lt;/span&gt;&lt;span class="s"&gt;"13"&lt;/span&gt; &lt;span class="na"&gt;viewBox=&lt;/span&gt;&lt;span class="s"&gt;"0 0 21 13"&lt;/span&gt; &lt;span class="na"&gt;fill=&lt;/span&gt;&lt;span class="s"&gt;"none"&lt;/span&gt; &lt;span class="na"&gt;xmlns=&lt;/span&gt;&lt;span class="s"&gt;"http://www.w3.org/2000/svg"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;path&lt;/span&gt; &lt;span class="na"&gt;fill-rule=&lt;/span&gt;&lt;span class="s"&gt;"evenodd"&lt;/span&gt; &lt;span class="na"&gt;clip-rule=&lt;/span&gt;&lt;span class="s"&gt;"evenodd"&lt;/span&gt; &lt;span class="na"&gt;d=&lt;/span&gt;&lt;span class="s"&gt;"M7.64941 11.4892H13.32V1.3754H7.64941V11.4892Z"&lt;/span&gt; &lt;span class="na"&gt;fill=&lt;/span&gt;&lt;span class="s"&gt;"#F75B1B"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;path&lt;/span&gt; &lt;span class="na"&gt;fill-rule=&lt;/span&gt;&lt;span class="s"&gt;"evenodd"&lt;/span&gt; &lt;span class="na"&gt;clip-rule=&lt;/span&gt;&lt;span class="s"&gt;"evenodd"&lt;/span&gt; &lt;span class="na"&gt;d=&lt;/span&gt;&lt;span class="s"&gt;"M8.01018 6.43222C8.01018 4.38046 8.97821 2.5532 10.4854 1.37531C9.38287 0.513856 7.99213 0 6.48032 0C2.90126 0 0 2.87996 0 6.43222C0 9.98447 2.90126 12.8644 6.48032 12.8644C7.99213 12.8644 9.38287 12.3506 10.4854 11.4891C8.97821 10.3113 8.01018 8.48397 8.01018 6.43222Z"&lt;/span&gt; &lt;span class="na"&gt;fill=&lt;/span&gt;&lt;span class="s"&gt;"#E20025"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;path&lt;/span&gt; &lt;span class="na"&gt;fill-rule=&lt;/span&gt;&lt;span class="s"&gt;"evenodd"&lt;/span&gt; &lt;span class="na"&gt;clip-rule=&lt;/span&gt;&lt;span class="s"&gt;"evenodd"&lt;/span&gt; &lt;span class="na"&gt;d=&lt;/span&gt;&lt;span class="s"&gt;"M20.769 10.4177V10.1683H20.7032L20.6278 10.34L20.5524 10.1683H20.4866V10.4177H20.5327V10.2294L20.6035 10.3919H20.6517L20.7225 10.229V10.4177H20.769ZM20.353 10.4177V10.2106H20.4372V10.1686H20.2228V10.2106H20.3069V10.4177H20.353ZM20.9713 6.43179C20.9713 9.98447 18.07 12.864 14.491 12.864C12.9792 12.864 11.5884 12.3501 10.4863 11.4887C11.9935 10.3113 12.9612 8.48361 12.9612 6.43179C12.9612 4.38003 11.9935 2.55278 10.4863 1.37489C11.5884 0.513856 12.9792 0 14.491 0C18.07 0 20.9713 2.87954 20.9713 6.43179Z"&lt;/span&gt; &lt;span class="na"&gt;fill=&lt;/span&gt;&lt;span class="s"&gt;"#F0A029"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/svg&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And third, the Visa icon.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;touch &lt;/span&gt;src/assets/visa-icon.svg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;svg&lt;/span&gt; &lt;span class="na"&gt;width=&lt;/span&gt;&lt;span class="s"&gt;"29"&lt;/span&gt; &lt;span class="na"&gt;height=&lt;/span&gt;&lt;span class="s"&gt;"10"&lt;/span&gt; &lt;span class="na"&gt;viewBox=&lt;/span&gt;&lt;span class="s"&gt;"0 0 29 10"&lt;/span&gt; &lt;span class="na"&gt;fill=&lt;/span&gt;&lt;span class="s"&gt;"none"&lt;/span&gt; &lt;span class="na"&gt;xmlns=&lt;/span&gt;&lt;span class="s"&gt;"http://www.w3.org/2000/svg"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;path&lt;/span&gt; &lt;span class="na"&gt;fill-rule=&lt;/span&gt;&lt;span class="s"&gt;"evenodd"&lt;/span&gt; &lt;span class="na"&gt;clip-rule=&lt;/span&gt;&lt;span class="s"&gt;"evenodd"&lt;/span&gt; &lt;span class="na"&gt;d=&lt;/span&gt;&lt;span class="s"&gt;"M14.7771 3.18797C14.762 4.57733 15.9235 5.35133 16.7987 5.81318C17.6979 6.28578 17.9996 6.5891 17.9962 7.01173C17.9894 7.65913 17.2786 7.94439 16.614 7.95551C15.4534 7.97511 14.7796 7.61668 14.2427 7.34624L13.8247 9.45988C14.3637 9.72733 15.3597 9.96058 16.3923 9.9723C18.8181 9.9723 20.4043 8.67787 20.412 6.67207C20.4222 4.12684 17.1548 3.98636 17.1772 2.84902C17.1846 2.50327 17.4892 2.13551 18.1565 2.04106C18.4871 1.99479 19.3995 1.95869 20.4328 2.47278L20.8385 0.427536C20.2826 0.209585 19.5682 0 18.6783 0C16.3964 0 14.79 1.31105 14.7771 3.18797ZM24.7395 0.176346C24.296 0.176346 23.9223 0.454791 23.7566 0.883759L20.2919 9.82142H22.716L23.1977 8.38041H26.1596L26.4386 9.82142H28.574L26.71 0.176346H24.7395ZM25.0777 2.78243L25.7772 6.40391H23.8622L25.0777 2.78243ZM11.8397 0.176346L9.92964 9.82142H12.2386L14.148 0.176346H11.8397ZM8.42354 0.176346L6.02029 6.74094L5.04824 1.15945C4.93439 0.536328 4.48377 0.176346 3.98336 0.176346H0.054434L0 0.455986C0.80632 0.645602 1.72283 0.951192 2.2779 1.27686C2.61777 1.47628 2.71458 1.65024 2.82632 2.12404L4.66732 9.82142H7.10774L10.8486 0.176346H8.42354Z"&lt;/span&gt; &lt;span class="na"&gt;fill=&lt;/span&gt;&lt;span class="s"&gt;"url(#paint0_linear)"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;defs&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;linearGradient&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"paint0_linear"&lt;/span&gt; &lt;span class="na"&gt;x1=&lt;/span&gt;&lt;span class="s"&gt;"28.574"&lt;/span&gt; &lt;span class="na"&gt;y1=&lt;/span&gt;&lt;span class="s"&gt;"0.259826"&lt;/span&gt; &lt;span class="na"&gt;x2=&lt;/span&gt;&lt;span class="s"&gt;"0"&lt;/span&gt; &lt;span class="na"&gt;y2=&lt;/span&gt;&lt;span class="s"&gt;"0.259826"&lt;/span&gt; &lt;span class="na"&gt;gradientUnits=&lt;/span&gt;&lt;span class="s"&gt;"userSpaceOnUse"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;stop&lt;/span&gt; &lt;span class="na"&gt;stop-color=&lt;/span&gt;&lt;span class="s"&gt;"#21489F"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;stop&lt;/span&gt; &lt;span class="na"&gt;offset=&lt;/span&gt;&lt;span class="s"&gt;"1"&lt;/span&gt; &lt;span class="na"&gt;stop-color=&lt;/span&gt;&lt;span class="s"&gt;"#261A5E"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/linearGradient&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/defs&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/svg&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The only piece missing is a little utils function to format the card number in the UI. Create a &lt;code&gt;utils&lt;/code&gt; folder inside the &lt;code&gt;src&lt;/code&gt; folder, and then an &lt;code&gt;index.js&lt;/code&gt; file inside.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;src/utils
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;touch &lt;/span&gt;src/utils/index.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Fidel uses a tokenization mechanism for the card numbers and doesn't store the entire card number. You'll receive the first six, and last four numbers from the card number, and the six in between are missing. You'll replace those with asterisks and then split the long card number every other 4 characters to display. In the &lt;code&gt;index.js&lt;/code&gt; file, create a &lt;code&gt;formatCard&lt;/code&gt; method that contains the logic.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;formatCard&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;card&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;card&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;firstNumbers&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;******&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;card&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;lastNumbers&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/.&lt;/span&gt;&lt;span class="se"&gt;{4}&lt;/span&gt;&lt;span class="sr"&gt;/g&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now that you've created all the missing pieces for the &lt;code&gt;Transaction&lt;/code&gt; component go ahead and add it to your main application. At the top of the &lt;code&gt;/src/App.js&lt;/code&gt; file, import the &lt;code&gt;Transaction&lt;/code&gt; component.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Transaction&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./components/Transaction&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Inside the render function, there is currently an empty &lt;code&gt;&amp;lt;tbody&amp;gt;&lt;/code&gt; tag. Replace it to iterate over the &lt;code&gt;transactions&lt;/code&gt; data, and map a &lt;code&gt;Transaction&lt;/code&gt; component for each entry.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;tbody&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"bg-white"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;transactions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(({&lt;/span&gt; &lt;span class="nx"&gt;transaction&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="nx"&gt;idx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Transaction&lt;/span&gt; &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;idx&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;transaction&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;transaction&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;transactions&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;transactions&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;tbody&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Congratulations, you can now display incoming transactions from Fidel!&lt;/p&gt;

&lt;h2&gt;
  
  
  Simulate Transactions
&lt;/h2&gt;

&lt;p&gt;Because you're using a Test Fidel key, and because you're using test cards, you won't receive live transactions. There are &lt;a href="https://fidel.uk/docs/transactions/#test-transactions" rel="noopener noreferrer"&gt;different ways you can simulate test transactions&lt;/a&gt; on the Fidel platform thought to test this tutorial. One of the simplest ones is to use the &lt;a href="https://dashboard.fidel.uk/playground" rel="noopener noreferrer"&gt;API Playground&lt;/a&gt; in the Fidel Dashboard. Go in there and use the &lt;code&gt;transactions /create&lt;/code&gt; endpoint to create a few different transactions. If you create one with a positive amount, followed by one with a similar but negative amount, it will be matched as a refunded transaction. This way, you'll get to experience all three transaction statuses in the UI. Because you've set up the webhook endpoints already, all transactions you create are passed from Fidel to your ngrok URL, to your local server and then to your React client via socket.io. You should see them showing up in the UI, similar to this.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2FFidelLimited%2Fdocs%2Fmaster%2Fassets%2Fimages%2Ftutorial-card-linking.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2FFidelLimited%2Fdocs%2Fmaster%2Fassets%2Fimages%2Ftutorial-card-linking.png" title="Card-Linked Application Demo" alt="Card-Linked Application Demo" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I hope you've had a great time following along this tutorial, and you've learnt the basics of building your first card-linked application on the Fidel platform, using the Fidel Web SDK, Node.js, React and socket.io. If you want to take a look at the code, it's &lt;a href="https://github.com/FidelLimited/fidel-card-linking-tutorial" rel="noopener noreferrer"&gt;available on GitHub&lt;/a&gt;!&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>node</category>
      <category>react</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>The Books and Podcasts We Love - That You Should Too 📚</title>
      <dc:creator>TomKFidel</dc:creator>
      <pubDate>Fri, 26 Mar 2021 10:50:08 +0000</pubDate>
      <link>https://forem.com/fidel/the-books-and-podcasts-we-love-that-you-should-too-3amc</link>
      <guid>https://forem.com/fidel/the-books-and-podcasts-we-love-that-you-should-too-3amc</guid>
      <description>&lt;blockquote&gt;&lt;em&gt;“In the case of good books, the point is not to see how many of them you can get through, but rather how many can get through to you.”&lt;/em&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;span&gt;So true. How about ‘&lt;em&gt;You are what you read&lt;/em&gt;’ - which I just made up. Here at Fidel, we love our books and podcasts. As a fintech company, we exist in an industry that constantly twists and turns as new innovations arise and keeping up with those developments is essential. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Being able to actively learn new skills to grow as a professional in this changing industry is so important to us we ended up arranging subscriptions to Audible and Udemy for the whole Fidel team, too.&lt;/p&gt;
&lt;p&gt;Therefore, when I asked everyone for some suggestions on what they’re reading and listening to, our #goodreads slack channel ‘blew up’ as the kids say. My post went viral.&lt;/p&gt;
&lt;p&gt;From the science behind happiness to the quiet art of sleeping, here are ten of our favorite books and podcasts - and why we came to love them.&lt;/p&gt;

&lt;h3 id="1-why-we-sleep-by-matthew-walker"&gt;1 | &lt;strong&gt;Why We Sleep&lt;/strong&gt; by Matthew Walker  &lt;br&gt;&lt;br&gt;
&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;In a nutshell &lt;/strong&gt;| &lt;em&gt;Why the quality of your sleep could shape your entire life. &lt;/em&gt;&lt;br&gt;&lt;br&gt;&lt;strong&gt;Why it’s great &lt;/strong&gt;| If you’re curious about science and health, it's a very easy read that explains why we sleep, the health benefits that come with it, and what can happen if we don't prioritise it. Using real data, it also gives very realistic, practical advice on how to improve your sleep patterns. I personally loved that you’re taken on a journey of explanation about why certain cultures and systems are wrong in not prioritising something so important&lt;/p&gt;

&lt;h3 id="2-make-time-how-to-focus-on-what-matters-every-day-by-jake-knapp-and-john-zeratsky"&gt;2 | &lt;strong&gt;Make Time: How to Focus on What Matters Every Day&lt;/strong&gt; by Jake Knapp and John Zeratsky&lt;br&gt;&lt;br&gt;
&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;In a nutshell | &lt;/strong&gt;&lt;em&gt;How to make those 24 hours truly count.&lt;/em&gt; &lt;br&gt;&lt;br&gt;&lt;strong&gt;Why it’s great | &lt;/strong&gt;What I liked the most was that it gave me courage to try out some of their amazing tips, albeit not in the most radical ways recommended in the book.&lt;br&gt;&lt;br&gt;Here are some of the things I actually did after reading this book:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I bought a simple analogue wristwatch - to stop checking the time on my phone&lt;/li&gt;
&lt;li&gt;Turned off almost all push notifications&lt;/li&gt;
&lt;li&gt;Deleted ‘time-waster’ apps like Facebook, Twitter,  Instagram, BBC news and others&lt;/li&gt;
&lt;li&gt;Cleared the first 2 screens of my phone from any apps&lt;/li&gt;
&lt;li&gt;Started using a usage-timer&lt;/li&gt;
&lt;li&gt;Took more “silent” and “no-screen” walks&lt;/li&gt;
&lt;li&gt;Started scheduling time in my calendar for the most important priorities&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id="3-the-culture-map-by-erin-meyer"&gt;3 | &lt;strong&gt;The Culture Map &lt;/strong&gt;by Erin Meyer &lt;br&gt;&lt;br&gt;
&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;In a nutshell |&lt;/strong&gt; &lt;em&gt;A Brazilian engineering team at a steel company tries to convince their US-based colleagues to adopt a new process created in their Latin American offices.&lt;/em&gt;&lt;br&gt;&lt;br&gt;&lt;strong&gt;Why it’s great | &lt;/strong&gt;As someone that has experienced many different cultures and has felt so-called "culture shock" many times, it was very entertaining and informative to read ‘The Culture Map.’ You can gain insights from someone that dedicates herself to informing companies about how to better navigate and manage people from different cultures. The book does not attempt to generalize and is also aware of the fact that people are different, even those from the same cultural sphere, but still captures the universal impact culture has on us all.&lt;/p&gt;

&lt;h3 id="4-clean-code-a-handbook-of-agile-software-craftsmanship-by-robert-cecil-martin"&gt;4 | &lt;strong&gt;Clean Code A Handbook of Agile Software Craftsmanship&lt;/strong&gt; by Robert Cecil Martin &lt;br&gt;&lt;br&gt;
&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;In a nutshell&lt;/strong&gt; | &lt;em&gt;Even bad code can work sometimes. But when that code isn’t clean, it can weigh heavily on a developer companies’ ambitions.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why it’s great | &lt;/strong&gt;Regarding the book Clean Code, by Uncle Bob (as he’s known), for me, it’s a must read for any software developer that wants to improve their skill. As programming is both a creative and structured endeavour, Clean Code targets the latter by defining and explaining all the best practices you should follow to write "clean code". This means code that is well organized, easy to build, simple to understand and ultimately maintainable. It is proven that this so-called "clean code" is what allows software organizations to survive in the long-run as the software evolves and developers rotate. Individually, it also teaches you pragmatic skills that you can use to build better software.&lt;/p&gt;

&lt;h3 id="5-creativity-inc-by-ed-catmull"&gt;5 | &lt;strong&gt;Creativity, inc.&lt;/strong&gt; by Ed Catmull&lt;br&gt;&lt;br&gt;
&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;In a nutshell&lt;/strong&gt; | &lt;em&gt;Fail as fast as you can.&lt;/em&gt; &lt;br&gt;&lt;br&gt;&lt;strong&gt;Why it’s great&lt;/strong&gt; | President of Walt Disney Animation Studios, Ed Catmull, advises on how to promote creativity based on Pixar’s own journey. It’s interesting to walk through the creative-thinking process behind the creation of famous movies like ToyStory, Up, Wall-E and Finding Nemo. One of my favourite excerpts was the following; “He [Ed] thinks of failure like learning to ride a bike; it isn’t conceivable that you would learn to do this without making mistakes—without toppling over a few times. If you apply this mindset to everything new you attempt, you can begin to subvert the negative connotations associated with making mistakes.”&lt;/p&gt;

&lt;h3 id="6-atomic-habits-by-james-clear"&gt;6 | &lt;strong&gt;Atomic Habits&lt;/strong&gt; by James Clear&lt;/h3&gt;
&lt;p&gt;&lt;br&gt;&lt;strong&gt;In a nutshell |&lt;/strong&gt; &lt;em&gt;How to change your life, one tiny step at a time.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why it’s great |&lt;/strong&gt; This is easily one of my favourite books of all time. I feel like I already followed a lot of the principles, so it worked as inspiration, but also validation. It’s written in a very down-to-earth and realistic style that could really empower anyone, regardless of their context, to make better decisions and be more set up for success. For anyone who is a big fan of routine or is looking for more in their life, this is an excellent read.&lt;/p&gt;

&lt;h3 id="7-the-happiness-lab-podcast"&gt;7 | &lt;strong&gt;&lt;a href="https://www.happinesslab.fm/"&gt;The Happiness Lab&lt;/a&gt; Podcast &lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;In a nutshell&lt;/strong&gt; | &lt;em&gt;‘The Happiness Lab’ was created by the same woman who created the ‘Science of Happiness’ course at Yale, helping showcase science-backed ways of becoming happier.&lt;/em&gt;&lt;br&gt;&lt;br&gt;&lt;strong&gt;Why it’s great&lt;/strong&gt; | I find it helpful, not only in my personal life, but also for making better product decisions for our customers. There is one episode on the burden of choice that tends to push me to constantly strive towards the simplest solution for our customers.&lt;/p&gt;

&lt;h3&gt;
&lt;br&gt;
&lt;strong&gt;8&lt;/strong&gt; | &lt;strong&gt;Invisible Women&lt;/strong&gt; by Caroline Criado Pérez &lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;In a nutshell&lt;/strong&gt; | &lt;em&gt;How the world we live is designed with men in mind, in more ways than you might think.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why it’s great | &lt;/strong&gt;Invisible Women was an eye-opener to me. Data is one of our most powerful tools and it was quite scary to find out through the book how little data we have about women in many industries, from healthcare to public transportation. I liked to believe that in the developed world we're very close to closing the gap, and while it's true that we're getting closer, this book makes it clear that there's still much to be done.&lt;/p&gt;

&lt;h3 id="9-factfulness-by-hans-rosling"&gt;9 | &lt;strong&gt;Factfulness &lt;/strong&gt;by Hans Rosling &lt;br&gt;&lt;br&gt;
&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;In a nutshell |&lt;/strong&gt; &lt;em&gt;Why we perceive a much poorer, scarier and unhealthy world - and why we’re pretty much all wrong.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;strong&gt;Why it’s great | ‘&lt;/strong&gt;Factfulness’ helps me think critically about how I build my opinions. While a product requires a bit of intuition, I find it helpful to ground myself in facts. Factfulness shows the ten instincts we have that steer us away from using information properly. I’ve found it helpful to know these ten human instincts so I can catch myself when I drift towards them.&lt;/p&gt;

&lt;h3 id="10-indie-hackers-podcast"&gt;10 | &lt;strong&gt;&lt;a href="https://www.indiehackers.com/podcasts"&gt;Indie Hackers&lt;/a&gt; Podcast&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;In a nutshell |&lt;/strong&gt;  &lt;em&gt;Indie Hackers is a podcast featuring discussions on diverse online and tech-related business ideas and projects, but most importantly, as they are depicted and analyzed through their plans, strategies and processes.&lt;/em&gt;&lt;br&gt;&lt;br&gt;&lt;strong&gt;Why it’s great&lt;/strong&gt; | The show explores many different tech-related stories. For example, how certain companies go from zero to millions of subscribers, how certain services reinvented traditional processes, or even mistakes made that lead to failures of profitable businesses. Moreover, it’s hosted by the creators themselves in a laid-back style, which makes it fun and easy listening.&lt;/p&gt;

&lt;p&gt;💡 You can view our full reading list &lt;a href="https://www.notion.so/fidelapi/Shelf-Indulgence-The-Official-Fidel-Reading-List-e87dc81d564e464cb51147dbc4da6a88"&gt;here&lt;/a&gt;, covering a range of topics that inspired us and helped us become the team of unique individuals who, together, make Fidel. You can subscribe to our blog &lt;a href="https://fidel.uk/blog"&gt;here&lt;/a&gt; to never miss a beat.&lt;br&gt;&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>startup</category>
      <category>learning</category>
    </item>
    <item>
      <title>The Post-Pandemic World is More Agile</title>
      <dc:creator>Janis</dc:creator>
      <pubDate>Wed, 10 Mar 2021 12:22:28 +0000</pubDate>
      <link>https://forem.com/fidel/the-post-pandemic-world-is-more-agile-5ca1</link>
      <guid>https://forem.com/fidel/the-post-pandemic-world-is-more-agile-5ca1</guid>
      <description>&lt;h3&gt;
  
  
  The global pandemic might have just taught us all some of the basics of the Agile Manifesto.
&lt;/h3&gt;

&lt;p&gt;The values and principles enshrined in the &lt;a href="https://agilemanifesto.org/"&gt;Agile Manifesto&lt;/a&gt; 20 years ago have become more relevant today than ever. As Agile has been preaching all along - we're now actually more prone to responding to change rather than following a plan. We're putting individuals and interactions over processes or tools. We're motivating individuals by giving them the environment and support they need and trust them to get the job done. Let’s look at some of these in more detail, as they are some of the famous values and &lt;a href="https://agilemanifesto.org/principles.html"&gt;principles&lt;/a&gt; behind the Agile Manifesto.&lt;/p&gt;

&lt;h2&gt;
  
  
  Responding to change over following a plan
&lt;/h2&gt;

&lt;p&gt;Forget “The Plan”. In the post-Covid world, it's all about responding to change over following “The Plan”. What's your timeframe of certainty today? How far ahead are you willing to plan? By current measures, even our governments are only confident about the next one to four weeks. It took more than two decades for Scrum Masters to preach this way of thinking. Now it's the default state of mind without the added effort of Scrum Masters.&lt;/p&gt;

&lt;p&gt;With that said - planning is not forgotten. Eisenhower's saying that “plans are useless, but planning is indispensable” - has been reborn in the global pandemic context. Like many companies, Fidel has adopted the &lt;a href="https://en.wikipedia.org/wiki/OKR"&gt;OKRs (Objectives and Key Results) framework&lt;/a&gt; for annual strategic planning. In fact, we did it for the first time in 2020 - right in the middle of the pandemic. Looking back at the OKRs of the Engineering and Product teams, it’s clear that the discussion around the objectives and their key results is valid. It fine-tuned our mindset and we've continued to refine the OKR planning framework in 2021. &lt;/p&gt;

&lt;p&gt;Last year's experience added a touch of reality to our strategic planning. Our Engineering and Product key results experienced multiple thunderstorms, exacerbated by the pandemic. We had to refocus - enabling our existing customer base and providing custom solutions to some of our big strategic partners. In a nutshell, our key results were regularly changing in response to our customers’ shifting needs in light of the global pandemic. &lt;/p&gt;

&lt;p&gt;Changing the key results during the year might not sound like a textbook approach. The global health crisis helped everyone to look at these decisions from a more grounded, down-to-earth and rational standpoint. We saw that remaining focussed on irrelevant key results was a greater risk than responding to change by adjusting our key results in flight. Equally, this has been the way for building great products by Agile teams - responding to change rather than following a plan. However, reality has helped us to scale this approach to the strategic planning level of Fidel.&lt;/p&gt;

&lt;h2&gt;
  
  
  Individuals and interactions over processes and tools
&lt;/h2&gt;

&lt;p&gt;In response to the global lockdown, most industries have experimented and adopted some brand of online communication and collaboration tool. It doesn’t really matter which one, it’s always about enhancing interaction rather than the specific combination of processes or tools you’re using. &lt;/p&gt;

&lt;p&gt;For example, we started to run the traditional Scrum events shortly before the lockdowns kicked in. However, their importance as a binding structure became apparent as the year progressed - people needed structure in their ‘work-from-home’ life. Structure provides predictability, which is subconsciously linked with the feeling of security and safety. &lt;/p&gt;

&lt;p&gt;Our engineers know that after the current Sprint, there'll always be a Next Sprint. They know when we'll have a dedicated time to close this Sprint, discuss lessons learnt, and plan the next Sprint; engineers also know that the scope for the 2 weeks of the Sprint will be largely fixed; finally, everyone knows that we'll have a chance to discuss any obstacles for reaching the Sprint Goal during the Daily Standup calls. This predictability creates peace of mind - a feeling that one's work life is steady and structured. A feeling we all crave during these times.&lt;/p&gt;

&lt;p&gt;Growing the company by 100% during the global pandemic has meant that we've had to add more interactions on top of the Agile structures - just to learn more about each other. I started to run short quizzes (&lt;a href="https://www.thoughtco.com/2-truths-lie-idea-list-1-31144"&gt;two truths and a lie&lt;/a&gt;) before each Retrospective to help us learn more about each other. Many of our product teams started to run weekly coffee calls (20-30 min) with a single rule that you're not allowed to talk about work on that call. We set up a monthly engineering call to discuss the latest happenings, where they might be relevant to other Fidel teams. &lt;/p&gt;

&lt;p&gt;Since many people at Fidel were hired during lockdown - most of us had never met in person. Therefore, additional opportunities to interact were important. On top of the weekly company-wide meetings, we introduced self-run Zoom fitness classes, game nights and a happy hour. Oh yes - we did fear death-by-too-many-meetings, so we agreed on a ‘no-meetings-Tuesday’ for product teams. Now, Tuesdays are reserved for focussed work without ANY calls.&lt;/p&gt;

&lt;h2&gt;
  
  
  Provide a supportive environment and trust
&lt;/h2&gt;

&lt;p&gt;What do you do as a manager when all your employees are working from home? You learn to trust them. You have no other option but to completely trust them if you want to keep the lights on. You want to motivate them, support them in creating the online and offline environment they need to get the job done - entirely virtually. &lt;/p&gt;

&lt;p&gt;Early on in the pandemic, Fidel supported employees in improving their work environment at home. We allowed everyone to bring any of their office equipment home, as well as a generous allowance to purchase any additional equipment for a productive work environment. &lt;/p&gt;

&lt;p&gt;However, by now, we all learned that it's not just about the physical environment that is important for long-lasting high performance. It's also about psychological wellbeing and time to decompress and relax. Our CEO Dev spent significant time &lt;a href="https://fidel.uk/blog/a-message-from-fidel-founder-ceo-dev-subrata"&gt;sharing his personal experiences&lt;/a&gt; managing his mental health. All the company received a subscription to the Headspace app. On the week of World Mental Health Day, we even took a mandatory day off for the entire company to rest busy minds.&lt;/p&gt;

&lt;h2&gt;
  
  
  More Agile Not Less
&lt;/h2&gt;

&lt;p&gt;It's too early to talk about a post-Agile world. Before the global pandemic, we had a rather poor recognition of Agile values and principles outside the Engineering world. However, now it looks like 20 years of warming up - preparing the grounds for wider recognition of Agile values and principles. &lt;/p&gt;

&lt;p&gt;The global pandemic has created conditions for a fantastic stress test to the resilience of Agile values, principles and structures. Agile not only passed this test but proved that it's more relevant to the wider audience than we had ever imagined. My hope is that the world’s desire to come back to “normal” after the global pandemic might just mean that we come to a “more Agile world” as the new default instead. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;P.S. Tune into the &lt;a href="https://2021.aginext.io/Session/post-agile-panel/"&gt;Post Agile Panel &lt;/a&gt;on the next &lt;a href="https://2021.aginext.io/"&gt;Aginext London 2021&lt;/a&gt; conference on 17 March to hear other practitioners and me discuss Agile’s future.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>agile</category>
      <category>career</category>
      <category>beginners</category>
      <category>productivity</category>
    </item>
    <item>
      <title>How a Good Onboarding is Improving the Developer Experience</title>
      <dc:creator>Alex Lakatos 🥑</dc:creator>
      <pubDate>Wed, 09 Dec 2020 11:16:00 +0000</pubDate>
      <link>https://forem.com/fidel/how-a-good-onboarding-is-improving-the-developer-experience-1l9m</link>
      <guid>https://forem.com/fidel/how-a-good-onboarding-is-improving-the-developer-experience-1l9m</guid>
      <description>&lt;p&gt;You've probably noticed &lt;a href="https://twitter.com/FidelHQ/status/1336273292458594309" rel="noopener noreferrer"&gt;the new and shiny&lt;/a&gt; &lt;a href="https://dashboard.fidel.uk/" rel="noopener noreferrer"&gt;Fidel Dashboard&lt;/a&gt; we released recently. There were a few reasons we came up with a whole new dashboard experience, and &lt;a href="https://fidel.uk/blog/fresh-take-fidel-dashboard" rel="noopener noreferrer"&gt;Katherine goes over all those reasons&lt;/a&gt; in her blog post. One of those reasons was that new users had trouble quickly unlocking the power of Fidel. When using our API, the "Aha!" moment comes when you see your first test transaction. But getting there wasn't the easiest of journeys for everyone.&lt;/p&gt;

&lt;p&gt;We pride ourselves on how easy the Fidel API is to work with and often get feedback on the ease of the integration. That being said, before someone even starts integrating with the API, they tend to explore our dashboard to help them understand how Fidel works.&lt;/p&gt;

&lt;p&gt;With our old dashboard, we lost users in the middle of their onboarding because we had no onboarding experience in the Dashboard. We had hoped they would find their way around, but we should’ve been better hosts. Let me walk you through it.&lt;/p&gt;

&lt;p&gt;The first thing a user needs to do is create a Program. But, the old dashboard landed people on the Transactions page. And while that is a valid action for all accounts that have gone through the setup steps, because that's where most people need to land, it was proving confusing for first-time users. Let's assume first time users managed to create a Program. They would try to add a Location to that program, but that wasn't possible before first creating a Brand. They needed to figure than one out on their own, and then come back and create a Location. Let's assume some users managed to do that, and create a Location.&lt;/p&gt;

&lt;p&gt;Now, you'd imagine you can create one of those fabled test transactions. You couldn't create one on the Transactions tab, you needed to explore around the Dashboard and land on the API Playground tab. And there, you have a menu entry to create your first transaction. In the UI, you'll notice you needed a Program, a Location and a Card.&lt;/p&gt;

&lt;p&gt;Wait a minute, we didn't talk about Cards yet. That's because users haven’t added any yet. So users needed to add a Card before they could make a test transaction. On the Dashboard though, we didn't mention that users could only use test card numbers, or what those numbers were for the three card networks: Visa, Mastercard and Amex. Users had to poke around the Fidel Documentation to figure out what those test card numbers were, and then add a test Card. You could add a card both with the UI (which uses the &lt;a href="https://fidel.uk/docs/web-sdk" rel="noopener noreferrer"&gt;Fidel Web SDK&lt;/a&gt;), or in the API playground. After you'd have done all that, congratulations, you could finally create your first test transaction.&lt;/p&gt;

&lt;p&gt;As you can imagine, this wasn't an easy discovery journey, and we had quite a few people dropping off at various steps in this user journey. And we couldn't really blame them. Some of them were highly motivated, so they reached out to Support. For those users, we either had to do a bit of handholding or send them to our various blog posts or documentation explaining these steps. The blog posts and the documentation help you get set up using the API without using the Dashboard for most of those steps. While that was proving successful, it was also proving time-consuming for our small team.&lt;/p&gt;

&lt;p&gt;We've decided to take all that we learned from those hand-holding sessions and put them into an automated onboarding process that shows up first thing for all new users. Here's a video of it. We'll go through the steps we took, and why in a minute.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F371oyv263m7hao46fa0r.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F371oyv263m7hao46fa0r.gif" alt="Fidel Dashboard Onboarding Flow" width="720" height="423"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We've decided to take a few steps to alleviate these problems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Instead of having everyone create the same setup data on their own, we are now doing that for every new account. Now every new account gets enough demo data so they can make their first transaction: a demo Program, a demo Brand, 3 Locations in the UK and a Visa test Card. There's also one Auth Transaction in there. We've actually added the new demo data while we were developing the new dashboard, and we saw a slight increase in the number of users that were getting to their first transaction in the old Dashboard.&lt;/li&gt;
&lt;li&gt;The second step we took was to add a tour for first-time users on the new dashboard that walks people through the data and explains that:

&lt;ul&gt;
&lt;li&gt;Programs are containers, where you add brands, locations and link payment cards.
&lt;/li&gt;
&lt;li&gt;Brands are the parent object of Locations and require consent from an authorized merchant to track Transactions in their locations.
&lt;/li&gt;
&lt;li&gt;Locations are geolocation data points and you can simply add them to a Program.
&lt;/li&gt;
&lt;li&gt;Cards are linked to a Program, and you can conveniently use &lt;a href="https://fidel.uk/docs/mobile-sdks" rel="noopener noreferrer"&gt;our SDKs&lt;/a&gt; to link cards in your apps.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;After the onboarding flow tells you all about the setup blocks and the particularities of running in test mode versus live mode, it drops you off in the new API Playground, where you can make your first test transaction. We've redesigned the API playground as part of the developer experience as well, giving it a more modern look and feel.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F2l1k8csleaaw292125vv.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F2l1k8csleaaw292125vv.gif" alt="Fidel Dashboard API Playground" width="720" height="423"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The last bit of the onboarding flow is also doing a bit of off-boarding, letting people know they can access more resources for working with the API in the &lt;a href="https://fidel.uk/docs/" rel="noopener noreferrer"&gt;Documentation&lt;/a&gt;, on the &lt;a href="https://reference.fidel.uk/" rel="noopener noreferrer"&gt;API reference&lt;/a&gt; pages, and on &lt;a href="https://fidel.uk/blog" rel="noopener noreferrer"&gt;the blog&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;Adding this onboarding flow has improved our average “Time to First Transaction” from days to minutes. And because our users are developers, this has been one of the best things we have done to improve the developer experience.&lt;/p&gt;

&lt;p&gt;We've got some more things planned, and I don't want to spoil the surprise, so stay tuned for our next little DX chat. In the meantime, feel free to &lt;a href="https://twitter.com/FidelHQ" rel="noopener noreferrer"&gt;reach out on Twitter&lt;/a&gt; or in the &lt;a href="https://community.fidel.uk/" rel="noopener noreferrer"&gt;Fidel Developer Community&lt;/a&gt; forum.&lt;/p&gt;

</description>
      <category>ux</category>
      <category>dx</category>
      <category>devrel</category>
      <category>showdev</category>
    </item>
    <item>
      <title>A Fresh Take on the Fidel Dashboard</title>
      <dc:creator>kdegnen</dc:creator>
      <pubDate>Wed, 25 Nov 2020 15:02:00 +0000</pubDate>
      <link>https://forem.com/fidel/a-fresh-take-on-the-fidel-dashboard-37ie</link>
      <guid>https://forem.com/fidel/a-fresh-take-on-the-fidel-dashboard-37ie</guid>
      <description>&lt;p&gt;In January of 2020, Fidel was a very different company.&lt;/p&gt;

&lt;p&gt;We were a small team of 36 employees, working mostly in our offices in London and Lisbon. We’d just returned from a holiday gathering in our London office, where we talked about the future, celebrated 2019, and focused on what we wanted to accomplish in the coming year. While a lot of those plans changed with the coming of Covid-19, one project remained - we wanted to revamp our user dashboard.&lt;/p&gt;

&lt;p&gt;For those of you new to the Fidel experience, you may not have much insight into working with our old dashboard. We certainly do. Our team works with the dashboard day in, day out, as much - if not more - than our users. It soon became clear our old dashboard was preventing a lot of our clients from scaling their programs successfully. It also wasn’t helping new users get to know Fidel and how we can help. So we made a plan to revamp the Dashboard from top to bottom.&lt;/p&gt;

&lt;p&gt;They always say the first step to change is understanding where you need to improve, so we set off on a journey of discovery. With the help of our amazing customer team, we talked with our clients to understand their pain points. What made their jobs more difficult? What would help them move faster? Most importantly, how can Fidel help them innovate better?&lt;/p&gt;

&lt;p&gt;Through this journey, we were able to better understand how our current customers are using our product. We also have users who use the dashboard to explore and discover what Fidel has to offer. For these users, we took a more quantitative approach to understand their user journey - looking at the activation funnel to help us understand where people were dropping off.&lt;/p&gt;

&lt;p&gt;With this discovery under our belt, a few trends surfaced in the quantitative and qualitative data we were looking at:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Merchant onboarding was slow and opaque.&lt;/strong&gt; When we started this project, the time from giving Fidel merchant data to having real-time transactions flowing through for a location could be weeks. And worse, there was no communication on our end of how long this would take, which could leave our users hanging… for quite some time. In the cases where we couldn’t find a location’s merchant ID (aka the MID), users were forced to reach out to Support to get help. Basically, we weren’t following through on our own internal values of transparency.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Users of our Offers platform couldn’t easily access offer data.&lt;/strong&gt; Since we’ve launched our &lt;a href="https://fidel.uk/docs/offers"&gt;Offers API&lt;/a&gt;, we’ve made great strides in allowing our customers to use Fidel to qualify transactions based on specific parameters of an offer. However, in the old dashboard, it was difficult to see if a transaction had qualified for an offer and which offer it had qualified for. This made offer management quite difficult for our users.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dbnXJU-A--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://lh3.googleusercontent.com/e_J5hK6nkZLeSeAX0Q_FkbOIm6eotYdIBl_BNTyc1e68D9o2Gp2w6-u6StH_XSwVW2WcJGXtrxe2ERES48Lu0JWzgpMoCpDPtRwTM8sIgz0xdDwqsLZdwSz34lsPu7jDVpZ8Xhgi" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dbnXJU-A--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://lh3.googleusercontent.com/e_J5hK6nkZLeSeAX0Q_FkbOIm6eotYdIBl_BNTyc1e68D9o2Gp2w6-u6StH_XSwVW2WcJGXtrxe2ERES48Lu0JWzgpMoCpDPtRwTM8sIgz0xdDwqsLZdwSz34lsPu7jDVpZ8Xhgi" alt="A Fresh Take on the Fidel Dashboard"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;New users had trouble quickly unlocking the power of Fidel.&lt;/strong&gt; With our old dashboard, we lost users who signed up for a test account in the middle of their onboarding. And that’s because we had no onboarding experience in the Dashboard. We had hoped they would find their way around, but we should’ve been better hosts. Users had trouble understanding how the Fidel API all fit together, and therefore, how to best utilize all the functionality Fidel had to offer.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When we first started this project, we thought we would make a few changes to features that would help improve on these pain points. However, as we went down that path, we realized that in order to have the impact we wanted, this was going to need a bigger overhaul. We also decided to migrate our dashboard from Angular to React, but we’ll save those details for another blog post. Given this, we gave ourselves permission to think a bit more freely about how might we solve our users’ problems.&lt;/p&gt;

&lt;p&gt;This freedom sparked creativity, and we ended up including a ton of features, UX / UI improvements, and more in the new dashboard. To solve the problems we talked about earlier, we:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Updated the merchant onboarding process to be faster.&lt;/strong&gt; We looked at various ways that we could make the merchant onboarding process faster. We automated a few workflows that were previously done manually by our Customer team. During our conversations with our users, we also heard how frustrating it was to only be able to sync one batch of locations at a time. In the new dashboard, not only can users send locations to sync as frequently as they like, they also can automatically sync new locations. So far, this has brought our time to onboard a new merchant location down to a few days.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Increased the transparency around merchant onboarding.&lt;/strong&gt; Hearing that location sync felt a bit like a big black box, we wanted to help users feel more in control of their own destiny. We now have a countdown with an estimated number of days until the location will be synced. In the case when a location fails, we now allow users to submit a MID to help move the investigation along more quickly.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1TaFIWMo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://lh5.googleusercontent.com/36aWP04zLxONnmVAKJG_MremXK9vU93rZC7D0RCu5XwFZbAo7HJg2jgCM8JR_53-Qarr7vyAmkAmgZ1ABtNGnDWsjhEl5VqvoEvSM1Xdy9yne_mev8jjAWexv4bBeLZy7BBHWZHd" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1TaFIWMo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://lh5.googleusercontent.com/36aWP04zLxONnmVAKJG_MremXK9vU93rZC7D0RCu5XwFZbAo7HJg2jgCM8JR_53-Qarr7vyAmkAmgZ1ABtNGnDWsjhEl5VqvoEvSM1Xdy9yne_mev8jjAWexv4bBeLZy7BBHWZHd" alt="A Fresh Take on the Fidel Dashboard"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Improved visibility of qualified transactions.&lt;/strong&gt; We updated our transactions table to seamlessly integrate with offers. Now, when a user is running an offer on their program, they’ll be able to see qualified transactions, the offer they qualified for, and any other offer details in a single view.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Xd9hircR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://lh3.googleusercontent.com/jLWlkBOMBIkVGRZ6h-bx3JRJUm-CDQEBUHE479C5ScgeIjAPbn1l1U_cuca6knaftmyyxNWrV9aGOCQV82z8oCwoW1hJsmQvLJ8JrTh30AxVykjZPDcuKd90AlSmFtC5M2p1AyjB" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Xd9hircR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://lh3.googleusercontent.com/jLWlkBOMBIkVGRZ6h-bx3JRJUm-CDQEBUHE479C5ScgeIjAPbn1l1U_cuca6knaftmyyxNWrV9aGOCQV82z8oCwoW1hJsmQvLJ8JrTh30AxVykjZPDcuKd90AlSmFtC5M2p1AyjB" alt="A Fresh Take on the Fidel Dashboard"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Made things more secure.&lt;/strong&gt; Multiple employees at each of our clients tend to work on their Fidel account in the dashboard. To help improve the security of each account, we’ve introduced new user management features. There are now two levels of permissions within each account - Admin and Developer. Admins have full control over their team’s Fidel settings, from billing to security. Developers can work in the account, but do not have access to some of the more sensitive settings within the account. The best part is, each person can have their own login information!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--tFJF1T8I--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://lh4.googleusercontent.com/KlKiAirEWNwayppVlHg1AnukZSMDr2_iTVrE306qvMfGCUnOam4VTjGqMtaN60suY4kowj8zc4aQhiFPn2_vRKjOL8RsudGX-N2Z-Y_isov3P1FMzgM8Nv1tEUcL5ggTBV_WFd4d" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--tFJF1T8I--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://lh4.googleusercontent.com/KlKiAirEWNwayppVlHg1AnukZSMDr2_iTVrE306qvMfGCUnOam4VTjGqMtaN60suY4kowj8zc4aQhiFPn2_vRKjOL8RsudGX-N2Z-Y_isov3P1FMzgM8Nv1tEUcL5ggTBV_WFd4d" alt="A Fresh Take on the Fidel Dashboard"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Did a bit of handholding.&lt;/strong&gt; We wanted to do more for our new users, including giving them an onboarding tour. It shows them exactly how Fidel works, and hopefully sparks some creativity on how it could work for them! We now show users how to create a brand and location, add a card, and run a test transaction in our new playground to help them get to success more quickly. We’ve also added test data for new users, creating a demo program, brand and locations. It helps them get to the point where they can make their first real-time transaction faster.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--KTRDPgR---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://lh4.googleusercontent.com/YBUQ9Op5qtOOJRefuBfSbSHom8SrkL2JvJwmhTC3JljnsEldGfZtNsdSzAxG1RUqUVmg5nWpLBXxgq98q5yekWVSoRSyOdnoF62eB2Be6aMU2ZYI3Gtgmo5mp0UnVCxqYYemeVW7" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KTRDPgR---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://lh4.googleusercontent.com/YBUQ9Op5qtOOJRefuBfSbSHom8SrkL2JvJwmhTC3JljnsEldGfZtNsdSzAxG1RUqUVmg5nWpLBXxgq98q5yekWVSoRSyOdnoF62eB2Be6aMU2ZYI3Gtgmo5mp0UnVCxqYYemeVW7" alt="A Fresh Take on the Fidel Dashboard"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Made the whole thing a heck of a lot prettier and easier to navigate.&lt;/strong&gt; This one goes unsaid in its importance. At Fidel, we strive to make developers’ lives easier, and this includes in their experience with our dashboard. We restructured our navigation, updated our UI, and added a bunch of new, user-focused features.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--cjTfw5Do--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://lh5.googleusercontent.com/PBFNt024_tGCJbiZ3OSvZpgO2F4TKAgkZj9ZYluDaP_8A7R3N15ygIc0KOb5ncuyV8AOxY-dJCdP-QnSgRdum8f7bxsQQsVwyF7VHmXLiU1GOD-OYdmO9DfbgYmlHqc_fZgkVLpo" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--cjTfw5Do--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://lh5.googleusercontent.com/PBFNt024_tGCJbiZ3OSvZpgO2F4TKAgkZj9ZYluDaP_8A7R3N15ygIc0KOb5ncuyV8AOxY-dJCdP-QnSgRdum8f7bxsQQsVwyF7VHmXLiU1GOD-OYdmO9DfbgYmlHqc_fZgkVLpo" alt="A Fresh Take on the Fidel Dashboard"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After doing all this work, we were really eager to release it to the masses. However, we realized how critical our dashboard is to many peoples’ workflows, so we decided to be a bit more careful and do a staged release. We first developed a dog-fooding feature that allowed our employees to use the dashboard for their day-to-day tasks. Feedback was critical for fast iteration, so we implemented a  widget to help us quickly gather insights  and see trends. Through this, we realized we had a few things to improve before sharing with clients (namely that no one could figure out how to get to their account settings - an important thing!). After weeks of testing with our employees, we were able to release to a group of beta users.&lt;/p&gt;

&lt;p&gt;We want to extend a huge thank you to everyone who participated - these users gave us the feedback we needed  to get the dashboard to where we are today: ready for launch to all of you.&lt;/p&gt;

&lt;p&gt;Almost the entire company - now 55 strong - touched a piece of this dashboard as we brought it to life. We’re excited to keep building upon this experience and making it even better for our users. Our only ask of you is that you check out our feedback widget; it’s a major factor in helping us continuously improve. We’re proud to prioritize our users, and our mission is to help them be as successful as possible - this new dashboard brings us another critical step closer to that goal.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>productivity</category>
      <category>showdev</category>
      <category>ux</category>
    </item>
    <item>
      <title>How Fidel Is Converting to Agile From the Bottom-Up</title>
      <dc:creator>Janis</dc:creator>
      <pubDate>Wed, 28 Oct 2020 12:48:17 +0000</pubDate>
      <link>https://forem.com/fidel/how-fidel-is-converting-to-agile-from-the-bottom-up-a41</link>
      <guid>https://forem.com/fidel/how-fidel-is-converting-to-agile-from-the-bottom-up-a41</guid>
      <description>&lt;p&gt;“We need more process at Fidel”, said Andre, Fidel's co-founder and CTO, when we first met about a year ago.&lt;/p&gt;

&lt;p&gt;Having witnessed three major Agile transformations in some of the most prominent Nordic banks - i.e. now knowing what NOT to do -  Fidel was an opportunity to get it right. For once I would not need to beg to convert siloed departments into small and nimble cross-functional product teams that are focussed on delivering value to customers fast. Joining Fidel was an opportunity for me to combine the best there is about Agile ways of working (WoW) with the unique culture of an ambitious company - all from the bottom-up. Naturally, - I was up for the challenge.&lt;/p&gt;

&lt;p&gt;It helped a lot to find out that the ten engineers at Fidel - when I first started there - were already quite experienced. Perhaps that was the reason behind Andre’s sense that "we need more process". You see, ten engineers isn't a lot, but even then there were some warning signs that things weren’t operating smoothly.&lt;/p&gt;

&lt;p&gt;Firstly, the product roadmap was not aligned with the team structure, so many of the planned products had no people working towards them. Second, the engineers had split themselves into the traditional frontend and backend teams, mixing only occasionally. Hidden work was slowing down the most senior members of the engineering team (everyone knew which developers could fix anything and fast). Professional task and information management tools were not in place. The only product owner we had was Andre, who was becoming increasingly busy with strategic projects. The perception was that engineers work on the technical stuff rather than contributing to creating the value we deliver to our customers.&lt;/p&gt;

&lt;p&gt;From the reaction I provoked after suggesting some fundamental improvements, I quickly learned that introducing new things at Fidel should all be done bottom-up. This was in stark contrast with the large corporations where Agile WoW  are usually pollinated by management consultants who sell buzzwords (e.g. "&lt;a href="https://www.youtube.com/watch?v=Yvfz4HGtoPc"&gt;Spotify Model&lt;/a&gt;") to the top management. Then it either grows into a full-blown Godzilla Agile transformation (e.g. introducing &lt;a href="https://www.scaledagileframework.com/"&gt;SAFe&lt;/a&gt;) or trickles down into some diluted version of Agile without changing any actual thinking or, more importantly, our processes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Getting Started&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;OK, so, no top-down approach - but where do we start? I started with a half-day ideation workshop during our 2019 Christmas get-together in London. This was an opportunity for all engineers to figure out the biggest pain points and in many cases even their own possible solutions to their problems. This was bottom-up Agile transformation. And yes, I was excited.&lt;/p&gt;

&lt;p&gt;In a very simplified &lt;a href="https://dandypeople.com/blog/the-speedboat-retrospective-free-download-of-poster/"&gt;speedboat retrospective&lt;/a&gt;, we first identified five fundamental areas where improvements are needed:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Backlog management and setting of priorities&lt;/li&gt;
&lt;li&gt;Effective teamwork&lt;/li&gt;
&lt;li&gt;Improving planning &amp;amp; predictability&lt;/li&gt;
&lt;li&gt;Showing our work to others and engaging stakeholders&lt;/li&gt;
&lt;li&gt;Continuous improvements&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Then, engineers worked in pairs by applying elements from the &lt;a href="https://www.youtube.com/watch?v=XCPZ5iQLlnA"&gt;open space model&lt;/a&gt; to ideate on these pain points. We ended up with tons of ideas which we were able to distil, discuss and prioritise in concrete agreements and actions. Some of the agreements were easily implemented, for example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reflect all work in backlogs (make work visible)&lt;/li&gt;
&lt;li&gt;Move only prioritised work into Sprints&lt;/li&gt;
&lt;li&gt;Don't work on tasks that don't contribute to the sprint goal&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We also agreed on what we need to do in the longer term - such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Decide on the definition of ‘done’ and definition of ‘ready’&lt;/li&gt;
&lt;li&gt;Introduce &lt;a href="https://www.atlassian.com/software/jira"&gt;Jira&lt;/a&gt; &amp;amp; &lt;a href="https://www.atlassian.com/software/confluence"&gt;Confluence&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Re-organise into product teams&lt;/li&gt;
&lt;li&gt;Agree on estimation techniques&lt;/li&gt;
&lt;li&gt;Create a buddy system&lt;/li&gt;
&lt;li&gt;Organise regular re-factoring weeks and others&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Fast forward to now - we have all this and much more. Fidel has four full-blown product teams working in Scrum, guided by three hyper-charged product owners. We have well integrated the new process management tools and there is a stable velocity across the teams giving us confidence of two new product deliveries this year.&lt;/p&gt;

&lt;p&gt;Most importantly - we've preserved the high spirits and desire to reinvent ourselves for the continuous betterment of our collaboration at Fidel.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Good Habits&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Even now, I still  introduce future improvements in the same original way: bottom-up. We start with a little workshop for all engineers where I explain the best practices that are out there; sometimes engineers trial them a bit to get the taste of what the new process means in practice (e.g. &lt;a href="https://www.agilealliance.org/glossary/relative-estimation/#q=~(infinite~false~filters~(postType~(~'page~'post~'aa_book~'aa_event_session~'aa_experience_report~'aa_glossary~'aa_research_paper~'aa_video)~tags~(~'relative*20estimation))~searchTerm~'~sort~false~sortDirection~'asc~page~1)"&gt;relative vs absolute estimation&lt;/a&gt; technique). This is always followed by a discussion with the objective to decide which pieces of the "best practice" we adopt and in what way. Usually, it's the "best practice" with a characteristic (blue?) Fidel flourish added on top. For example, we're committed  about having some &lt;a href="https://www.scrumguides.org/scrum-guide.html#events"&gt;Scrum events&lt;/a&gt; such as Sprint Reviews, Retrospectives and Sprint Planning. However, we try to limit the time for these events to two hours altogether; it's part of a wider goal to minimise  time spent in meetings (hence, we also have ‘no-meetings Tuesdays’ across product teams).&lt;/p&gt;

&lt;p&gt;You could call it ‘Agile + common sense’. That’s because Agile and Scrum are just tools, not rules, so we use the tools to support the best outcomes for us. At the end of the day, what matters is that we work better and people are happier. I am proud to say that, at Fidel, we’re able to work towards that goal every day.&lt;/p&gt;

</description>
      <category>agile</category>
      <category>productivity</category>
      <category>career</category>
      <category>startup</category>
    </item>
    <item>
      <title>Adding the Fidel Android SDK to Your Kotlin Android Application</title>
      <dc:creator>Doug Sillars</dc:creator>
      <pubDate>Thu, 20 Aug 2020 12:50:43 +0000</pubDate>
      <link>https://forem.com/fidel/adding-the-fidel-android-sdk-to-your-kotlin-android-application-4b5f</link>
      <guid>https://forem.com/fidel/adding-the-fidel-android-sdk-to-your-kotlin-android-application-4b5f</guid>
      <description>&lt;p&gt;Fidel's real-time transaction monitoring allows you to monitor your customers' purchasing patterns. The first step, is of course, for customers to opt-in their credit cards for tracking at your locations. Dealing with card numbers opens up a requirement of "PCI Compliance."  This is the &lt;a href="https://en.wikipedia.org/wiki/Payment_Card_Industry_Data_Security_Standard" rel="noopener noreferrer"&gt;Payment Card Industry Security Standard&lt;/a&gt; and requires regular security checks to ensure your systems are adequately protected.&lt;/p&gt;

&lt;p&gt;If your systems are not PCI compliant, or you'd rather not worry about handling card numbers for real-time transactions, you can use &lt;a href="https://fidel.uk/docs/mobile-sdks" rel="noopener noreferrer"&gt;Fidel's PCI compliant SDKs&lt;/a&gt; to link the cards. Thus absolving you of any security requirements for the process.  Our documentation walks through the steps to add our SDK to a Java-based Android app, so in this post, we'll use Kotlin to accomplish the same.&lt;/p&gt;

&lt;h3&gt;
  
  
  Kotlin Android App
&lt;/h3&gt;

&lt;p&gt;To add the SDK to an application, we'll build a basic "Hello World" Android app.&lt;/p&gt;

&lt;p&gt;In Android Studio, start a new project:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.fidel.uk%2Fcontent%2Fimages%2F2020%2F08%2FStart_new_project.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.fidel.uk%2Fcontent%2Fimages%2F2020%2F08%2FStart_new_project.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Create an empty Activity from the templates:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.fidel.uk%2Fcontent%2Fimages%2F2020%2F08%2Fproject_template.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.fidel.uk%2Fcontent%2Fimages%2F2020%2F08%2Fproject_template.png" alt="Screenshot of Android Studio Activity creation"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Finally, name your application, choose Kotlin as your language, and use API 19 or higher (or use legacy support libraries to support older versions of Android).&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.fidel.uk%2Fcontent%2Fimages%2F2020%2F08%2Fproject_config.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.fidel.uk%2Fcontent%2Fimages%2F2020%2F08%2Fproject_config.png" alt="Screenshot of Android Studio Project configuration"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Android Studio will chug for a bit but will create the working "Hello World" application for you.  &lt;/p&gt;

&lt;h3&gt;
  
  
  Running the 'Hello World' app on your phone.
&lt;/h3&gt;

&lt;p&gt;If you are new to Android development, you'll need to &lt;a href="https://developer.android.com/training/basics/firstapp/running-app" rel="noopener noreferrer"&gt;setup ADB debugging&lt;/a&gt; on your phone, and connect your phone to your computer.  You can then click the "run" button in Android Studio to start the Hello World app:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.fidel.uk%2Fcontent%2Fimages%2F2020%2F08%2Frun_app.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.fidel.uk%2Fcontent%2Fimages%2F2020%2F08%2Frun_app.png" alt="start app"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The app will soon start up on your phone:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.fidel.uk%2Fcontent%2Fimages%2F2020%2F08%2Fhw.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.fidel.uk%2Fcontent%2Fimages%2F2020%2F08%2Fhw.jpg" alt="screenshot of app running on phone"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Adding in the Fidel SDK
&lt;/h3&gt;

&lt;p&gt;Adding the Fidel SDK is easy: while the instructions in the documentation are for Java - Android Studio converts the code into Kotlin for you.&lt;/p&gt;

&lt;p&gt;Let's walk through all of the steps we need to walk through to add the Fidel Card linking SDK to our sample app.  Following the documentation, we need to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Add &lt;code&gt;maven { url 'https://jitpack.io' }&lt;/code&gt; to our repositories section of our &lt;code&gt;build.grade&lt;/code&gt; file.&lt;/li&gt;
&lt;li&gt;Add &lt;code&gt;implementation 'com.github.FidelLimited:android-sdk:1.3.1'&lt;/code&gt; to the App build.gradle dependencies.&lt;/li&gt;
&lt;li&gt;Since you've updated your dependencies - sync your project.
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.fidel.uk%2Fcontent%2Fimages%2F2020%2F08%2Fproject_Sync.png" alt="Sync Project"&gt;
&lt;/li&gt;
&lt;li&gt;Now we can begin adding in our code to the MainActivity (and update the apiKey with your &lt;strong&gt;public&lt;/strong&gt; key and the appropriate &lt;code&gt;programId&lt;/code&gt;). You can find all this information in your &lt;a href="https://dashboard.fidel.uk/account?utm_source=blog&amp;amp;utm_medium=aksdk&amp;amp;utm_campaign=dr" rel="noopener noreferrer"&gt;Fidel Dashboard&lt;/a&gt;.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;Fidel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;apiKey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"pk_test_6e94da6f-145a-47db-b56b-f1314e74aa2e"&lt;/span&gt;
&lt;span class="nc"&gt;Fidel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;programId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"f8d6890e-145d-46ea-b66f-afacfd954580"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Now we add the Company name, privacy policy and deletion instructions.  I also added the country parameter in this step:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;Fidel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;companyName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Star Wars Quotes"&lt;/span&gt; &lt;span class="c1"&gt;// default: "Company Name".&lt;/span&gt;
&lt;span class="nc"&gt;Fidel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;privacyURL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"https://media.giphy.com/media/4560Nv2656Gv0Lvp9F/giphy.gif"&lt;/span&gt;
&lt;span class="c1"&gt;// Maximum 60 characters, default: "going to your account settings."&lt;/span&gt;
&lt;span class="nc"&gt;Fidel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;deleteInstructions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"https://media.giphy.com/media/DrDePYcSohIFG/giphy.gif"&lt;/span&gt; 
&lt;span class="nc"&gt;Fidel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;country&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Fidel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Country&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;UNITED_KINGDOM&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Paste in the result card response:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="n"&gt;override&lt;/span&gt; &lt;span class="n"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;onActivityResult&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;requestCode:&lt;/span&gt; &lt;span class="nc"&gt;Int&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;resultCode:&lt;/span&gt; &lt;span class="nc"&gt;Int&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;data:&lt;/span&gt; &lt;span class="nc"&gt;Intent&lt;/span&gt;&lt;span class="o"&gt;?)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;super&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;onActivityResult&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;requestCode&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;resultCode&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;requestCode&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nc"&gt;Fidel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;FIDEL_LINK_CARD_REQUEST_CODE&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;hasExtra&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Fidel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;FIDEL_LINK_CARD_RESULT_CARD&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;val&lt;/span&gt; &lt;span class="n"&gt;card&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getParcelableExtra&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Parcelable&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="nc"&gt;Fidel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;FIDEL_LINK_CARD_RESULT_CARD&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="n"&gt;as&lt;/span&gt; &lt;span class="nc"&gt;LinkResult&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;
            &lt;span class="nc"&gt;Log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;d&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"d"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"CARD ID = "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;card&lt;/span&gt;&lt;span class="o"&gt;!!.&lt;/span&gt;&lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Finally, make sure to present the Fidel activity:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;Fidel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;present&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="nd"&gt;@MainActivity&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is all there is to it - your app is now ready to run!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.fidel.uk%2Fcontent%2Fimages%2F2020%2F08%2Fapp.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.fidel.uk%2Fcontent%2Fimages%2F2020%2F08%2Fapp.jpg" alt="Screenshot of Fidel SDK running on an Android"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Card Linking on Android
&lt;/h2&gt;

&lt;p&gt;There are 2 techniques to link your card with the Android SDK:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The traditional way of entering the long card number/expiration date/CCV.  Note also that if you have cards stored in Google Pay - your phone will attempt to autofill this for you.  This is convenient for your customers, but real cards will fail in the Fidel test environment:
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.fidel.uk%2Fcontent%2Fimages%2F2020%2F08%2Fapp2.jpg" alt="Screenshot of Fidel SDK running on an Android with Google Pay autofill"&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Entering a test number will sync with the Fidel backend:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.fidel.uk%2Fcontent%2Fimages%2F2020%2F08%2Fapp3.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.fidel.uk%2Fcontent%2Fimages%2F2020%2F08%2Fapp3.jpg" alt="Manually entering a card number"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.fidel.uk%2Fcontent%2Fimages%2F2020%2F08%2Fcard_sync.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.fidel.uk%2Fcontent%2Fimages%2F2020%2F08%2Fcard_sync.png" alt="immediately synced in Fidel"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The Android SDK also has an optical card reader. By giving the application permission to use the camera:
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.fidel.uk%2Fcontent%2Fimages%2F2020%2F08%2Ffidel_OCR.jpg" alt="card scanning with the camera"&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The library in use does not appear to work for test cards found in a Google image search, but it does work with real cards.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;With just a few lines of code, you can add the Fidel Android SDK to your application to allow your customers fast and easy sign up into your card linking service.  Because the card numbers never touch your system, and the Fidel SDK is entirely PCI compliant, there are no security risks to you or your customers.&lt;/p&gt;

&lt;p&gt;Let us know how you are using the Android SDK in your app over in the &lt;a href="https://community.fidel.uk" rel="noopener noreferrer"&gt;community forum&lt;/a&gt;.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Creating a Card Linking Program with the Fidel APIs</title>
      <dc:creator>Doug Sillars</dc:creator>
      <pubDate>Tue, 04 Aug 2020 06:41:47 +0000</pubDate>
      <link>https://forem.com/fidel/creating-a-card-linking-program-with-the-fidel-apis-53c7</link>
      <guid>https://forem.com/fidel/creating-a-card-linking-program-with-the-fidel-apis-53c7</guid>
      <description>&lt;p&gt;We’ve come a long way in the world of payments. The process has become faster and faster, to the point where we’re now talking about service delivery in real-time, occurring almost instantaneously after the users’ action.&lt;/p&gt;

&lt;p&gt;It’s a remarkable leap, but the phrase ‘real-time’ has also begun to become something of a buzzword, lost in its overuse and over-simplification. What does it really mean? How does a ‘real-time’ process work?&lt;/p&gt;

&lt;p&gt;Take the Fidel transaction API as an example. Incredibly useful, easy to integrate - a powerful, real-time transaction-tracking tool.&lt;/p&gt;

&lt;p&gt;In a nutshell, it means that every card enrolled on a program has every transaction (at specific locations) logged in real time. From that, the program owner gains better understanding and context as to how customers shop with their brand - both online and in-person.&lt;/p&gt;

&lt;p&gt;A transaction API ties the customers’ credit card to their account, eliminating the need for “bonus cards,” random QR codes, barcodes or loose coupons. It just happens automatically whenever a transaction is made.&lt;/p&gt;

&lt;p&gt;As the API is improved and developed, the uses and possibilities are, essentially, endless.&lt;/p&gt;

&lt;p&gt;Loyalty card transaction APIs are closely related, where cards that are enrolled in the loyalty card scheme have all transactions immediately entered into the scheme. Our &lt;a href="https://fidel.uk/docs"&gt;documentation&lt;/a&gt; walks you through how to build a loyalty card scheme with the UI in our developer dashboard. However, 95% of creating a loyalty program can be done directly with the Fidel APIs right in your app (or from the terminal).  &lt;/p&gt;

&lt;p&gt;In this post, we’ll walk through the steps to take to create a loyalty card scheme using just Fidel API calls. For simplicity, we’ll use cURL to make all of the API calls. Or, you could use any other HTTP client to do the same. We may, or may not, also explain a lot of this with Star Wars references. Just’ cos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Loyalty Program Basics
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--sejfctIc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/lzfrngq8s67mj80za4zc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--sejfctIc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/lzfrngq8s67mj80za4zc.png" alt="programs_diagram_2020" width="740" height="301"&gt;&lt;/a&gt;&lt;br&gt;
Each loyalty program contains cards, which act as a proxy for your users. They also contain brands that have specific locations (think of your favourite coffee chain, and every place you can go to pick up a latte). When a transaction occurs - it is affiliated with the card and location. Both of which feed back into the program.&lt;/p&gt;

&lt;p&gt;When building a loyalty program, we run the process in reverse - creating a program before adding a brand and locations. Then customers can begin adding cards, and Fidel will record the transactions. Webhooks can be used to monitor the process.&lt;/p&gt;
&lt;h3&gt;
  
  
  Starting out: Creating an Account and Copying Your API Key
&lt;/h3&gt;

&lt;p&gt;It’s super easy to get started using the Fidel API. You just need to sign up for a &lt;a href="https://dashboard.fidel.uk/sign-up?utm_source=blog&amp;amp;utm_medium=cardlinking&amp;amp;utm_campaign=dr"&gt;free account&lt;/a&gt; and grab your API key. (This is &lt;em&gt;technically&lt;/em&gt; a visit to the dashboard, but we’re not building anything yet!) To get your key, use the user menu at the top right to find your account page. Free accounts have full access to the Fidel APIs in our test environment, so you’ll want your Secret Test Key to run the API commands in this post.&lt;/p&gt;
&lt;h3&gt;
  
  
  Creating a Program
&lt;/h3&gt;

&lt;p&gt;Ok - now you’ve got your account and API key - let’s make our first API call - to create a program.&lt;br&gt;
For ease of use, we’ll use cURL to make our API calls.  If you have any questions about the APIs, just take a look at the &lt;a href="https://reference.fidel.uk/reference"&gt;API Reference&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Creating a program involves a POST connection to Fidel with our API Key and the name of the program you’d like to create.  &lt;/p&gt;

&lt;p&gt;In this case, I’m going to name my Program “Star Wars Quotes.”&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://api.fidel.uk/v1/programs &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'content-type: application/json'&lt;/span&gt;  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'fidel-key: sk_test_f0005329-6324-49e5-86c6-429030a9a493'&lt;/span&gt;  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"name": "Star Wars Quotes"}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There are 2 headers added, one indicating JSON, and the other with my test API Key.  The body of the post is the simple JSON with my program name.  We immediately get a response:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"items"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"accountId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"fec57ce7-d161-4c8f-8da0-1ebf841f4739"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"live"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Star Wars Quotes"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"syncStats"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"completed"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"updated"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2020-06-04T12:05:38.169Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"created"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2020-06-04T12:05:38.169Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"b4b6d68f-a05a-4cc5-8b9f-f6e82cd988d0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"active"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"activeDate"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2020-06-04T12:05:38.169Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"sync"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"resource"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/v1/programs"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;201&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"execution"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;18.983461&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Important values here:  the &lt;code&gt;accountId&lt;/code&gt; is your user account id at Fidel. The &lt;code&gt;id&lt;/code&gt; is the programId - which we will use to reference this program in future API calls.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.giphy.com/media/3ornjPaUwr60cYjXuE/giphy.gif"&gt;https://media.giphy.com/media/3ornjPaUwr60cYjXuE/giphy.gif&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Creating our Brand
&lt;/h3&gt;

&lt;p&gt;Brands are independent of Programs and can be reused between different programs.&lt;/p&gt;

&lt;p&gt;For this post, we’ll create a brand called “I’ve got a bad feeling about this”. Since this line is used in every Star Wars Movie - this is clearly a strong brand for my “Star Wars Quote” program. But it could be used in an Indiana Jones Program, Big Bang Theory, or any other show where this line has been used.&lt;/p&gt;

&lt;p&gt;Again - all I need is the name of my Brand, my API key, and if I want - a link to the Brand Logo. Note that there is not currently a way to add an icon after this step, so this is your only chance! As you might expect, the endpoint is &lt;code&gt;/brands&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST  https://api.fidel.uk/v1/brands  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'content-type: application/json'&lt;/span&gt;   &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'fidel-key: sk_test_f0005329-6324-49e5-86c6-429030a9a493'&lt;/span&gt;  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "name": "I’ve got a Bad Feeling about this",
    "logoURL": "https://m.media-amazon.com/images/M/MV5BYzA0MmMxZjQtYzcwZC00MGM3LThkNjEtYTAyNTBlZjI1NWUzXkEyXkFqcGdeQXVyMzI5ODg0OTE@._V1_SY1000_SX1000_AL_.jpg"  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Submitting this - success! We have created the brand! Great, kid! Don’t get cocky.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"items"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"accountId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"fec57ce7-d161-4c8f-8da0-1ebf841f4739"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"consent"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"live"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"logoURL"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://m.media-amazon.com/images/M/MV5BYzA0MmMxZjQtYzcwZC00MGM3LThkNjEtYTAyNTBlZjI1NWUzXkEyXkFqcGdeQXVyMzI5ODg0OTE@._V1_SY1000_SX1000_AL_.jpg"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"I’ve got a Bad Feeling about this"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"updated"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2020-06-04T12:22:21.945Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"created"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2020-06-04T12:22:21.945Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"4aef8401-7014-4ac5-88d7-664a179c40f3"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"resource"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/v1/brands"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;201&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"execution"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;29.559367&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Locations
&lt;/h3&gt;

&lt;p&gt;Each program will be redeemable at various locations where the Program is operating under the specified brand.  In this case, we’ll add a few locations (using just the locations from Episodes 4-6 where someone said “I’ve got a bad feeling about this”:&lt;/p&gt;

&lt;p&gt;Luke Skywalker: Death Star,  USE FRC&lt;br&gt;
Han Solo: Death Star Trash Compactor, TRA SH&lt;br&gt;
Leia Organa; Asteroid Monster  MYN OCK&lt;br&gt;
C3PO: Jabba’s Palace  TAT OIN&lt;br&gt;
Han Solo Ewok Village END OR&lt;/p&gt;

&lt;p&gt;If you look carefully, the endpoint uses the ProgramId in the URL string, and the BrandId is presented as a parameter in the JSON:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt; curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST   https://api.fidel.uk/v1/programs/b4b6d68f-a05a-4cc5-8b9f-f6e82cd988d0/locations   &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'content-type: application/json'&lt;/span&gt;   &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'fidel-key: sk_test_f0005329-6324-49e5-86c6-429030a9a493'&lt;/span&gt;   &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "address": "Luke Skywalker",
    "brandId": "4aef8401-7014-4ac5-88d7-664a179c40f3",
    "city": "Death Star",
    "countryCode": "GBR",
    "postcode": "USE FRC"}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;NOTE: If you are adding locations in production and have a MerchantID (MID) for these locations from the card schemes, adding the MID here can speed up the confirmation of your locations.  In the test environment, your locations are automatically verified and approved.  In the live environment, these need to be verified by the card schemes, using the &lt;a href="https://fidel.uk/docs/locations/#location-sync"&gt;Location Sync&lt;/a&gt; process. And yes, this is, for now, a manual process that &lt;em&gt;must&lt;/em&gt; be done in the Fidel dashboard.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Since we are in test, I did not add a merchantID, but the location was added successfully:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"items"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"accountId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"fec57ce7-d161-4c8f-8da0-1ebf841f4739"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"address"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Luke Skywalker"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"brandId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"4aef8401-7014-4ac5-88d7-664a179c40f3"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"city"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Death Star"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"countryCode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"GBR"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"currency"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"GBP"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"live"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"postcode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"USEFRC"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"programId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"b4b6d68f-a05a-4cc5-8b9f-f6e82cd988d0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"geolocation"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"latitude"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;51.5138332&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"longitude"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;-0.1318224&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"preonboard"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"timezone"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Europe/London"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"updated"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2020-06-04T12:35:23.518Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"created"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2020-06-04T12:35:23.518Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"96eee5fc-704a-4854-9715-e42efce0c379"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"amex"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"clearing"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"auth"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"authTransactionId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"clearingTransactionId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"active"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"mastercard"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"clearing"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"auth"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"authTransactionId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"clearingTransactionId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"active"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"visa"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"clearing"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"auth"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"authTransactionId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"clearingTransactionId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"active"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"activeDate"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2020-06-04T12:35:23.518Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"active"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"resource"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/v1/programs/b4b6d68f-a05a-4cc5-8b9f-f6e82cd988d0/locations"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;201&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"execution"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;101.214404&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For the sake of this post length, trust that I did the same with the other four locations. We have now created our Fidel Card loyalty program using (mostly) just the API.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/lfGKdK1yKPja/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/lfGKdK1yKPja/giphy.gif" alt="everything under control" width="245" height="162"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Adding Cards
&lt;/h3&gt;

&lt;p&gt;For customers to enrol in the card-linked loyalty program, they must register their cards.  Fidel has a PCI compliant Web SDK (and mobile SDKs) that collect the card information from your customers. Which means you never have to worry about properly handling the card numbers - you never see the cards!  For an example of our Web SDK, you can see a working example in our previous post on &lt;a href="https://fidel.uk/blog/real-time-financial-transactions-with-fidel-and-webhooks-2"&gt;using Webhooks&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For simplicity in this post, we will just use the add Card API.  We can use test card numbers to register cards into our Program.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;NOTE: The add card API is used in the WebSDK (and visible in the website source), you must use your public key for this API call.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://api.fidel.uk/v1/programs/b4b6d68f-a05a-4cc5-8b9f-f6e82cd988d0/cards &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'content-type: application/json'&lt;/span&gt;  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'Fidel-Key: pk_test_0367fe38-cdc7-41a2-9d4c-74a1854c171e'&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"number": "4444000000004222", "expMonth": 10, "expYear": 2021, "countryCode": "GBR","termsOfUse": true}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And we see that the card is successfully added:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"items"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"accountId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"fec57ce7-d161-4c8f-8da0-1ebf841f4739"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"countryCode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"GBR"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"expDate"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2021-10-31T23:59:59.999Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"expMonth"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"expYear"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2021&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"firstNumbers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"444400"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"lastNumbers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"4222"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"live"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"programId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"b4b6d68f-a05a-4cc5-8b9f-f6e82cd988d0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"scheme"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"visa"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"visa"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"updated"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2020-06-04T13:05:05.420Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"created"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2020-06-04T13:05:05.420Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"6e03470d-a441-45a4-851e-883b51f28b26"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"resource"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/v1/programs/b4b6d68f-a05a-4cc5-8b9f-f6e82cd988d0/cards"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;201&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"execution"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;35.621642&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Transactions
&lt;/h2&gt;

&lt;p&gt;For testing purposes, there is a Transactions API, where a &lt;code&gt;cardId&lt;/code&gt; and an &lt;code&gt;amount&lt;/code&gt; can be sent to a specific program. I’ll leave that here as an exercise for you. Feel free to use my &lt;code&gt;locationId&lt;/code&gt; from above. I have a very good feeling about this one - you should see your transaction posting successfully in no time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Creating a card linking program is very easy to do, using the Fidel Dashboard, or using our API. In this post, we’ve walked through all the steps to create a card linking program with our APIs. After testing with our API, we know you’ll be itching to get into production and create your own card linking program.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/s3tpyHuSSr98A/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/s3tpyHuSSr98A/giphy.gif" alt="I know" width="480" height="206"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you have any questions, please feel free to reach out to our community at &lt;a href="https://community.fidel.uk"&gt;https://community.fidel.uk&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>api</category>
      <category>cards</category>
      <category>fintech</category>
    </item>
    <item>
      <title>How to Receive Webhook Events With Netlify Functions and JavaScript</title>
      <dc:creator>Alex Lakatos 🥑</dc:creator>
      <pubDate>Mon, 27 Jul 2020 08:22:48 +0000</pubDate>
      <link>https://forem.com/fidel/how-to-receive-webhook-events-with-netlify-functions-and-javascript-jl3</link>
      <guid>https://forem.com/fidel/how-to-receive-webhook-events-with-netlify-functions-and-javascript-jl3</guid>
      <description>&lt;p&gt;If you're building event-driven applications, you've probably considered building them in a Serverless platform. It's really well suited for having small functions, running when there's an incoming event, processing the data, and then going dormant. Instead of building your own event loop that sits idle in between events, you're offloading all that logic to a serverless provider. Being a lazy developer, I'm a fan of writing as little code as possible 😅.&lt;/p&gt;

&lt;p&gt;It won't come as a shock that most of my webhooks are running on serverless instead of on my local machine, or on a VM I have to maintain somewhere. We've recently been using Netlify here at Fidel for our &lt;a href="https://github.com/FidelLimited/docs" rel="noopener noreferrer"&gt;documentation previews&lt;/a&gt;, so I thought I'd give &lt;a href="https://www.netlify.com/products/functions/" rel="noopener noreferrer"&gt;Netlify Functions&lt;/a&gt; a try. In this blog post, I'm going to use them with JavaScript to receive webhook events from an API.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Are Webhooks?
&lt;/h2&gt;

&lt;p&gt;Before we begin, let's do a little refresher on what webhooks really are. If you think about APIs as black boxes that allow you to call them up once in a while, webhooks are the mechanism they use to call you back when they've got stuff to tell you. When you want to ask an API to do things for your application, you make an HTTP request to the API endpoint, and send some data. When an API wants to send some data to your application, without you having to ask for it every second (also known as polling), they make an HTTP request to your webhook URL.&lt;/p&gt;

&lt;p&gt;Now that we know what webhooks are, let's look at a few things you'll need to follow along this journey of receiving webhook events with Netlify Functions and JavaScript.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://nodejs.org/en/download/" rel="noopener noreferrer"&gt;Node.js&lt;/a&gt; installed&lt;/li&gt;
&lt;li&gt;&lt;a href="https://app.netlify.com/signup" rel="noopener noreferrer"&gt;A Netlify Account&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dashboard.fidel.uk/sign-up?utm_source=blog&amp;amp;utm_medium=webhooks&amp;amp;utm_campaign=dr" rel="noopener noreferrer"&gt;A Fidel Account&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Creating a Netlify Function
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Set Up Netlify CLI
&lt;/h3&gt;

&lt;p&gt;I'm going to use the &lt;a href="https://docs.netlify.com/cli/get-started/" rel="noopener noreferrer"&gt;Netlify CLI&lt;/a&gt; to create and deploy a Function. In case you don't have it installed, now would be a good time to do so.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install netlify-cli -g
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After you've installed the CLI, you'll also need to authenticate it with your Netlify account.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;netlify login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will open a browser window, asking for permission to access Netlify on your behalf. Go ahead and authorize that.&lt;/p&gt;

&lt;p&gt;We'll also need to create a &lt;code&gt;netlify.toml&lt;/code&gt; file in the root of your project folder, and we'll enable functions there.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[build]
  functions = "functions"
  publish = "dist"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Create a Netlify Function
&lt;/h3&gt;

&lt;p&gt;Now that we're all set up with Netlify, we can go ahead and create a Function with the CLI.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;netlify functions:create
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will create an interactive prompt, asking you for a template. I've chosen &lt;code&gt;[hello-world]&lt;/code&gt;, which is a basic JavaScript function that shows async/await usage, and formats your response. The prompt also asks for a name for your function, I've named mine &lt;code&gt;webhook&lt;/code&gt;. The output of my command looked a little bit like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ netlify functions:create
? Pick a template js-hello-world
? name your function: webhook
◈ Creating function webhook
◈ Created /Users/laka/fidel/fidel-webhooks-netlify/functions/webhook/hello-world.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The command also created a &lt;code&gt;webhook.js&lt;/code&gt; file in the &lt;code&gt;/functions/webhook/&lt;/code&gt; folder. That was boilerplate code, and I've changed it a bit. I'm removing the &lt;code&gt;Hello World&lt;/code&gt; code, and instead of logging the request body, and sending back a &lt;code&gt;200 OK&lt;/code&gt; status on the response. The logic is all wrapped in a &lt;code&gt;try/catch&lt;/code&gt; that sends a &lt;code&gt;500&lt;/code&gt; status and the error on the response in case something happened with the request. Which it shouldn't, but better safe than sorry. Most APIs have a retry mechanism for webhooks, so if we send back anything other than a &lt;code&gt;200&lt;/code&gt;, the API is going to resend the webhook later.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;exports.handler = async (event, context) =&amp;gt; {
  try {
    console.log(event.body)
    return {
      statusCode: 200
    }
  } catch (err) {
    return { statusCode: 500, body: err.toString() }
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Deploying a Netlify Function
&lt;/h3&gt;

&lt;p&gt;This is the most basic webhook example I could think of. It logs or saves the event coming from an API, and sends back a confirmation code. What you do inside of that webhook should be based on your application logic, I'm showing you here the mechanism for this transport pattern.&lt;/p&gt;

&lt;p&gt;The code needs to be deployed before we can use it, so let's go ahead and use the Netlify CLI to do that.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;netlify deploy --prod
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After the deploy finished, the output of my terminal looked a bit like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ netlify deploy --prod   
Deploy path: /Users/laka/fidel/fidel-webhooks-netlify/dist
Functions path: /Users/laka/fidel/fidel-webhooks-netlify/functions
Configuration path: /Users/laka/fidel/fidel-webhooks-netlify/netlify.toml
Deploying to main site URL...
✔ Finished hashing 1 files and 1 functions
✔ CDN requesting 0 files and 1 functions
✔ Finished uploading 1 assets
✔ Deploy is live!

Logs: https://app.netlify.com/sites/fidel-webhooks/deploys/5f19b5e49db36302958eeefe
Unique Deploy URL: https://5f19b5e49db36302958eeefe--fidel-webhooks.netlify.app
Website URL: https://fidel-webhooks.netlify.app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once the deploy is live, you'll be able to access your webhook logs in your &lt;a href="https://app.netlify.com/sites/fidel-webhooks/functions" rel="noopener noreferrer"&gt;Netlify dashboard&lt;/a&gt;. If you select your webhook there, you'll see the log window refresh in real-time, and that's where you'll find your function endpoint as well. The naming convention Netlify uses is &lt;a href="https://your-app.netlify.app/.netlify/functions/your-function" rel="noopener noreferrer"&gt;https://your-app.netlify.app/.netlify/functions/your-function&lt;/a&gt;. Mine was &lt;a href="https://fidel-webhooks.netlify.app/.netlify/functions/webhook" rel="noopener noreferrer"&gt;https://fidel-webhooks.netlify.app/.netlify/functions/webhook&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Set Up for the Fidel API
&lt;/h2&gt;

&lt;p&gt;Your webhook is live and ready to receive events, the only thing missing is an API to actually send those events 😅. Don't worry, I've got you covered with an example of using the Fidel API to send transaction authorization events to your webhook.&lt;/p&gt;

&lt;p&gt;The Fidel API is providing real-time transaction data about purchases made on a card issued by Visa, Mastercard or Amex. Because of that real-time component, it wouldn't be wise to keep polling it every second or so to see if there are any new transactions. The API implements a webhook mechanism to send that data to your application whenever a new event happens. It actually supports quite a few webhooks for different types of events, but I won't dig into that here. We'll just focus on transactions for now.&lt;/p&gt;

&lt;p&gt;Before we begin, you'll need to grab your &lt;a href="https://dashboard.fidel.uk/account?utm_source=blog&amp;amp;utm_medium=webhooks&amp;amp;utm_campaign=dr" rel="noopener noreferrer"&gt;Fidel API Key from the Dashboard&lt;/a&gt;. I'm using my Test Key for this, I want to be able to simulate transactions. It should look similar to &lt;code&gt;sk_test_50ea90b6-2a3b-4a56-814d-1bc592ba4d63&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The API needs you to set up some plumbing before you can receive transactions, and we're going to use cURL commands to do that setup, instead of pointing and clicking in the dashboard. If you're already a Fidel user and have registered a program, brand, location and card, feel free to skip these steps go straight to registering your webhook with the Fidel API.&lt;/p&gt;

&lt;p&gt;The container for your transactions in the Fidel world is a Program. We'll start by creating one. Don't forget to replace &lt;code&gt;fidel-key&lt;/code&gt; with your own before you run the cURL command.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl -X POST \
  https://api.fidel.uk/v1/programs \
  -H 'content-type: application/json' \
  -H 'fidel-key: sk_test_50ea90b6-2a3b-4a56-814d-1bc592ba4d63' \
  -d '{
    "name": "Avocados"
  }'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The command outputs a JSON response from the API, with data about the program we created. We'll look for the &lt;code&gt;id&lt;/code&gt; of it and make a note, we'll be using it later on.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{"items":[{"accountId":"3693ac7e-3e2b-432c-8c60-2b786453ca9b","live":false,"name":"Avocados","syncStats":{"status":"completed"},"updated":"2020-07-24T12:03:00.251Z","created":"2020-07-24T12:03:00.251Z","id":"08a09745-1e75-4ac3-baaf-f8548c31b25e","active":true,"activeDate":"2020-07-24T12:03:00.251Z","sync":false}],"resource":"/v1/programs","status":201,"execution":79.233234}%   
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now that we have a Program, we'll also need to create a Brand for our program.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl -X POST \
  https://api.fidel.uk/v1/brands \
  -H 'content-type: application/json' \
  -H 'fidel-key: sk_test_50ea90b6-2a3b-4a56-814d-1bc592ba4d63' \
  -d '{
    "name": "Bacon Avocados"
  }'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here's the output for that command. We'll make a note of the &lt;code&gt;id&lt;/code&gt; for the brand as well, we'll need to use it later on.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{"items":[{"accountId":"3693ac7e-3e2b-432c-8c60-2b786453ca9b","consent":true,"live":false,"name":"Bacon Avocados","updated":"2020-07-24T12:05:35.868Z","created":"2020-07-24T12:05:35.868Z","id":"59ded730-007e-43a6-8547-7612d31355cb"}],"resource":"/v1/brands","status":201,"execution":15.915342}%     
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now that we have a brand and a program, we can create a Location for that brand. That location represents a physical store, so we can later simulate a live transaction originating there. We'll use the Program id we got from the previous command, and replace it in the URL. We'll also use the &lt;code&gt;brandId&lt;/code&gt; in the request body to link the location to the &lt;code&gt;Bacon Avocados&lt;/code&gt; brand.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl -X POST \
  https://api.fidel.uk/v1/programs/08a09745-1e75-4ac3-baaf-f8548c31b25e/locations \
  -H 'content-type: application/json' \
  -H 'fidel-key: sk_test_50ea90b6-2a3b-4a56-814d-1bc592ba4d63' \
  -d '{
    "address": "2 Avocado Square", 
    "brandId": "59ded730-007e-43a6-8547-7612d31355cb", 
    "city": "London", 
    "countryCode": "GBR",
    "postcode": "W1D 3PX",
    "searchBy": {
        "merchantIds": {
            "visa": ["1234567","7654321"],
            "mastercard": ["1234567","7654321"]
        }
    }
}'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The output for this command has slightly more data, and that's because the location has information for each card network scheme available. We'll need to make a note of the &lt;code&gt;id&lt;/code&gt; as well, that's what we're going to use to identify this location when we're making a transaction.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{"items":[{"accountId":"3693ac7e-3e2b-432c-8c60-2b786453ca9b","address":"2 Avocado Square","brandId":"59ded730-007e-43a6-8547-7612d31355cb","city":"London","countryCode":"GBR","currency":"GBP","live":false,"postcode":"W1D3PX","programId":"08a09745-1e75-4ac3-baaf-f8548c31b25e","geolocation":{"latitude":51.5138332,"longitude":-0.1318224},"preonboard":false,"searchBy":{"merchantIds":{"visa":["1234567","7654321"],"mastercard":["1234567","7654321"]}},"timezone":"Europe/London","updated":"2020-07-24T12:10:17.533Z","created":"2020-07-24T12:10:17.533Z","id":"fe77e7f5-350b-4c34-be68-3e16e7c95d66","amex":{"clearing":false,"auth":false,"authTransactionId":null,"clearingTransactionId":null,"status":"active"},"mastercard":{"clearing":false,"auth":false,"authTransactionId":null,"clearingTransactionId":null,"status":"active"},"visa":{"clearing":false,"auth":false,"authTransactionId":null,"clearingTransactionId":null,"status":"active"},"activeDate":"2020-07-24T12:10:17.533Z","active":true}],"resource":"/v1/programs/08a09745-1e75-4ac3-baaf-f8548c31b25e/locations","status":201,"execution":55.277626}%  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now that we've set up our location, the only piece missing is a card to simulate a transaction from this location. We'll need to replace the program id in the URL here as well. We're not going to register an actual card here, we're using test cards. Depending on the card network we want to use, there are different ranges of card numbers we can use. For example, I'll use a test Visa card. Those follow a wildcard format in the range of &lt;code&gt;4444 0000 0000 4***&lt;/code&gt;. I'll use &lt;code&gt;4444000000004001&lt;/code&gt; as my card number. The cards API also uses a different key for authorization, so instead of using your Secret API Key, you'll need to use your Public SDK Key from the &lt;a href="https://dashboard.fidel.uk/account?utm_source=blog&amp;amp;utm_medium=webhooks&amp;amp;utm_campaign=dr" rel="noopener noreferrer"&gt;Dashboard&lt;/a&gt;. It looks similar to the other one, the main difference is it starts with &lt;code&gt;pk&lt;/code&gt; instead of &lt;code&gt;sk&lt;/code&gt;. My example uses &lt;code&gt;pk_test_62f02030-0409-4eb5-ab94-6eff05b3d888&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl -X POST \
  https://api.fidel.uk/v1/programs/08a09745-1e75-4ac3-baaf-f8548c31b25e/cards \
  -H 'content-type: application/json' \
  -H 'fidel-key: pk_test_62f02030-0409-4eb5-ab94-6eff05b3d888' \
  -d '{
    "number": "4444000000004222",
    "expMonth": 10,
    "expYear": 2025,
    "countryCode": "GBR",
    "termsOfUse": true
}'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The output from the command should give us an &lt;code&gt;id&lt;/code&gt; for the card, and we'll make a note of it. That's what we'll need when we make a transaction.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{"items":[{"accountId":"3693ac7e-3e2b-432c-8c60-2b786453ca9b","countryCode":"GBR","expDate":"2025-10-31T23:59:59.999Z","expMonth":10,"expYear":2025,"firstNumbers":"444400","lastNumbers":"4222","live":false,"programId":"08a09745-1e75-4ac3-baaf-f8548c31b25e","scheme":"visa","type":"visa","updated":"2020-07-24T12:28:16.957Z","created":"2020-07-24T12:28:16.957Z","id":"bb9b4a67-203c-4eae-8b09-070e819629cc"}],"resource":"/v1/programs/08a09745-1e75-4ac3-baaf-f8548c31b25e/cards","status":201,"execution":47.026675}%                                                          
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Register Webhook
&lt;/h2&gt;

&lt;p&gt;We've set up everything we needed to start receiving transactions via the Fidel API. But for now, they would only show up in the Fidel Dashboard. If we want to use the real-time transactions in our application, we need to register a webhook URL for them. As I mentioned earlier, the Fidel API supports quite a few different webhooks. We're going to use the &lt;code&gt;transaction.auth&lt;/code&gt; event today, and that fires when a transaction is being authorized. That usually happens as soon as you use your card in person or online to shop. Don't forget to replace the program id in the URL with your own. And use your own Netlify webhook URL in the request payload.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl -X POST \
  https://api.fidel.uk/v1/programs/08a09745-1e75-4ac3-baaf-f8548c31b25e/hooks \
  -H 'content-type: application/json' \
  -H 'fidel-key: sk_test_50ea90b6-2a3b-4a56-814d-1bc592ba4d63' \
  -d '{
    "event": "transaction.auth",
    "url": "https://fidel-webhooks.netlify.app/.netlify/functions/webhook"
  }'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The JSON response from the API should be output to the terminal. It looks similar to this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{"items":[{"accountId":"3693ac7e-3e2b-432c-8c60-2b786453ca9b","event":"transaction.auth","live":false,"programId":"08a09745-1e75-4ac3-baaf-f8548c31b25e","url":"https://fidel-webhooks.netlify.app/.netlify/functions/webhook","updated":"2020-07-24T12:39:15.131Z","created":"2020-07-24T12:39:15.131Z","id":"df1ab75a-04f9-4627-9b0a-c08cd28572e5","secretKey":"wh_ta_425e3be6-d7e3-4ad4-b747-5d5c498f171b"}],"resource":"/v1/programs/08a09745-1e75-4ac3-baaf-f8548c31b25e/hooks","status":201,"execution":87.066399}%  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Create Auth Tranzaction
&lt;/h2&gt;

&lt;p&gt;Now that we've registered our webhook with the Fidel API, we can start creating test transactions, and we should see them coming in the Netlify Function logs. We're using the test transactions endpoint in the Fidel API, and this only works in test mode. If your account is live, you'll need to switch it back to test mode to follow along with this tutorial. Don't forget to replace your &lt;code&gt;locationId&lt;/code&gt; and &lt;code&gt;cardId&lt;/code&gt; in the request payload.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl -X POST \
  https://api.fidel.uk/v1/transactions/test \
  -H 'content-type: application/json' \
  -H 'fidel-key: sk_test_50ea90b6-2a3b-4a56-814d-1bc592ba4d63' \
  -d '{
    "amount": 12.34,
    "cardId": "bb9b4a67-203c-4eae-8b09-070e819629cc",
    "locationId": "fe77e7f5-350b-4c34-be68-3e16e7c95d66"
  }'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After you ran this command, you can see the webhook logs in the Netlify Function log. Mine looked a bit like this after I received the event on my webhook:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1:51:56 PM: 2020-07-24T12:51:56.589Z 7989b0a6-f0ce-4985-a45f-7e22ec0ff6c6 INFO {"auth":true,"currency":"GBP","id":"4b549d95-1540-4332-891a-dd2c7603b090","amount":12.34,"wallet":null,"created":"2020-07-24T12:51:55.918Z","accountId":"36081095-2782-4669-8a07-857bbaaeb89b","cleared":false,"updated":"2020-07-24T12:51:55.918Z","programId":"f2c9719a-6433-4ef4-8401-19d7ebf60ab9","datetime":"2020-07-24T13:51:55","card":{"id":"14bda5c9-d5d9-40ef-87e3-158c2f5f2f8d","firstNumbers":"444400","lastNumbers":"4001","scheme":"visa"},"location":{"address":"Titulescu Nr. 16","city":"Bristol","countryCode":"GBR","id":"793f5298-3715-43ef-b89d-1b1cedddd716","geolocation":null,"postcode":"BS16UZ","timezone":"Europe/London","metadata":null},"brand":{"id":"9cd32c61-43ca-4bb7-8aca-0cf491112c28","name":"Avocado","logoURL":"https://developeravocados.net/img/avatar-icon.png","metadata":null},"identifiers":{"MID":"TEST_MID_a7d6bc8f-7837-4f3b-aa43-8c51478ce189","mastercardTransactionSequenceNumber":null,"mastercardRefNumber":null,"amexApprovalCode":null,"visaAuthCode":null}}
1:51:56 PM: Duration: 1.36 ms Memory Usage: 64 MB 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What's Next?
&lt;/h2&gt;

&lt;p&gt;Hopefully, you've followed me along this journey and we've managed to receive webhook events on a Netlify Function using JavaScript. If you've found them interesting, there are a lot more things you can do with them. For example, you could &lt;a href="https://www.netlify.com/blog/2018/07/09/building-serverless-crud-apps-with-netlify-functions-faunadb/" rel="noopener noreferrer"&gt;save that transaction event to a FaunaDB&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If the Fidel API made you curious, and you want to keep exploring, keep in mind all the things I did with cURL today are available either via the &lt;a href="https://dashboard.fidel.uk/playground?utm_source=blog&amp;amp;utm_medium=webhooks&amp;amp;utm_campaign=dr" rel="noopener noreferrer"&gt;Fidel Dashboard&lt;/a&gt; or our API. You can check out the &lt;a href="https://reference.fidel.uk/reference?utm_source=blog&amp;amp;utm_medium=webhooks&amp;amp;utm_campaign=dr" rel="noopener noreferrer"&gt;API Reference&lt;/a&gt; and use your favourite HTTP client to play with it.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>node</category>
      <category>serverless</category>
      <category>netlify</category>
    </item>
    <item>
      <title>Open, Honest, Equal: How we hire at Fidel</title>
      <dc:creator>beatrizatfidel</dc:creator>
      <pubDate>Tue, 14 Jul 2020 16:08:28 +0000</pubDate>
      <link>https://forem.com/fidel/open-honest-equal-how-we-hire-at-fidel-1j69</link>
      <guid>https://forem.com/fidel/open-honest-equal-how-we-hire-at-fidel-1j69</guid>
      <description>&lt;p&gt;When you have great recruitment practices, good things come. The right talent can directly support a companies’ prospects, but it influences the experience of your customers, too. We like to think that, here at Fidel, we’ve taken that message to heart.&lt;/p&gt;

&lt;p&gt;We believe that a great hiring process has to be both agile and scalable. However, we take it a step further. For a hiring process to deliver that exponential value, it really should cover more than that, taking into account diversity and carefully considering the candidate experience.&lt;/p&gt;

&lt;p&gt;In this article, we’re going to explore how we hire at Fidel, the core values of our process and - when we’re popping those champagne corks to celebrate another hire - that our new joiners are supported and can support us in achieving positive growth that sets us on the path for positive exponential growth as a company. Also, the talent team just really likes Champagne.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Diversity in Hiring 🌈&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;This one goes without saying but, at Fidel, we believe that all candidates should be considered, regardless of who they are, be it gender, age, race, religion,  or sexual orientation. In order to put this into practice, we've put a few measures in place.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Job board diversity:&lt;/strong&gt; When it comes to hiring and maintaining a diverse team that distances from any discriminatory biases,  in the first place, we work to ensure that we’re posting our open positions on a diverse range of job boards that make it possible to attract talent from a variety of different backgrounds and locations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Neutral job adverts:&lt;/strong&gt; Every job advert is entirely neutral and assumes absolutely nothing about the candidates’ background. At Fidel, we believe that in an equal workplace and that needs to stand since the moment we post jobs, so everyone feels welcome regardless of gender.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Anonymous mode:&lt;/strong&gt; All Fidel applications are reviewed in an anonymous mode within our Applicant Tracking System (ATS). This means that when reviewing organic applications, the reviewer has no access to the candidates' personal information such as name, photo, location, or age, for example. This helps us to scout talent-based entirely on skillset and character, without unconscious bias.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Interview training:&lt;/strong&gt; All training areas are important. Hiring is no exception. In order to provide the best candidate experience and conduct interviews fairly, we have regular training organized by our Talent Team, as well as resources always available in our knowledge-based tool. Those resources include detailed templates, instructions on how to provide feedback, guidelines on how to conduct interviews, questions that should be avoided, and more information regarding implicit bias.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;The Candidate Experience 🗣&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Hiring is a two-way street. We take measures to guarantee high-quality hiring processes in all the different departments of Fidel. However, we also have guidelines in place to guarantee an exceptional experience for our candidates as well.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Transparent hiring process:&lt;/strong&gt; In order to manage candidates' expectations, we always share what the hiring process will look like, providing guidance for the candidates to prepare. That way, candidates will have insights into how long the process will take and can consider their next steps better.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Timely response:&lt;/strong&gt; When application volume is high,  it can be a real struggle to answer all applications quickly. However, we commit to answering a candidates’  first application within a maximum of a week’s time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;We provide feedback:&lt;/strong&gt; Regardless of whether a candidate is a match or not, we always aim to provide constructive feedback to candidates. We believe that being honest when it comes to hiring can not only help refine our hiring process but also supports our candidates in their job-hunt.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Candidate feedback:&lt;/strong&gt; It’s a two-way street, remember? We have space for candidates to review our hiring process by requesting a Net Promoter Score (NPS)  and an opportunity to give us comments on their experience. Being open to feedback is core to Fidel, and it motivates us to improve our processes, whilst giving a voice to our community.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;The Hiring Process ✍️&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Screening Interviews&lt;/strong&gt;  &lt;/p&gt;

&lt;p&gt;If the application matches the requirements of the job role, firstly: Yay! Once we’ve finished high-fiving we proceed to invite the candidate for their first screening interview. All screening interviews at Fidel are managed by our Talent Team. The main goal is to get to know the candidate's background better and provide context on the team here and the job itself.&lt;/p&gt;

&lt;p&gt;For technical roles like Engineering or Developer positions, if the team believes the candidate might be a good fit, we’ll usually invite the candidate for a technical assessment to make sure they’re comfortable with the particular stack we use. If the candidate isn't familiar with our stack, this can also a great opportunity to test their adaptability skills.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Team Interviews&lt;/strong&gt;  &lt;/p&gt;

&lt;p&gt;Team Interviews can vary between roles, however, they’re super important for every job role we hire for.&lt;/p&gt;

&lt;p&gt;When it comes to commercial roles, if the screening interview goes well, we have two more additional steps with the team. One is a Hiring Manager call -  a chance to ask more specific questions about the job and the team but also to be asked about previous experience and motivations. The other step is a skills-based Interview where we expect the candidates to prepare a very short presentation on a defined topic they’re confident with and discuss it with the panel,  often the team they’re interviewing to join.&lt;/p&gt;

&lt;p&gt;When it comes to Engineering roles, if the technical assessment goes well, this is followed by the technical interview. For this, two of our senior Engineers will conduct a retrospective of the technical assessment and ask questions. It's a great opportunity for candidates to get a bit more detail on Fidel engineering practices and our product roadmap.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Final Steps 🤝&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The final step is usually a founders’ interview. We’ll invite candidates for a final meeting with our founders, where they can gain a holistic view of the company and learn a bit about Fidel’s founding philosophies. Candidates also get a chance to discuss their own experiences and industry knowledge.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;In Summary&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Current challenges have meant some candidates don't get the chance to experience the office atmosphere and meet other team members in person. We’re happy to add extra meetings to provide these candidates with the chance to meet more of us. The same applies for management roles, it's mandatory for those candidates to have a round table with their new teams.&lt;/p&gt;

&lt;p&gt;When we think about scaling a company, we immediately think about growing the workforce. That workforce shall be aligned with the values of the company but also with its needs. A strong hiring process makes it possible to not only target the needed talent but to build a team that shares the same vision and values.&lt;/p&gt;

&lt;p&gt;With quality, scalable, and agile hiring, we can set more ambitious goals for ourselves, too.&lt;/p&gt;

&lt;p&gt;We see the hiring process as the first stage of planting a seed. Without putting in the time and attention, you won’t ever see the flowers at the end. Thanks to our multi-step process we can find talent wherever it might be, nurture that talent and set up both the employee and employer for longer-term success. We want people to choose to stay with Fidel for a long time, too - that’s why we invest in each of our people from day one of hiring, so they want to invest in us right back.&lt;/p&gt;

&lt;p&gt;Bringing in the best people is never just a talent team mission because when we find the right person for the job, everyone benefits - and that’s what Fidel is all about. *Champagne corks pop in background*🍾&lt;/p&gt;

</description>
      <category>career</category>
      <category>advice</category>
    </item>
    <item>
      <title>What's it like to start a new job during a Pandemic? We asked our new starters</title>
      <dc:creator>beatrizatfidel</dc:creator>
      <pubDate>Wed, 01 Jul 2020 10:04:50 +0000</pubDate>
      <link>https://forem.com/fidel/what-s-it-like-to-start-a-new-job-during-a-pandemic-we-asked-our-new-starters-5fco</link>
      <guid>https://forem.com/fidel/what-s-it-like-to-start-a-new-job-during-a-pandemic-we-asked-our-new-starters-5fco</guid>
      <description>&lt;p&gt;If you saw the Talent team’s &lt;a href="https://fidel.uk/blog/theres-no-i-solation-in-team-onboarding-new-colleagues-during-covid-19"&gt;last post&lt;/a&gt;, you’ll know Fidel hasn't slowed down on hiring during Covid-19.&lt;/p&gt;

&lt;p&gt;But we are doing things differently. For obvious reasons, we’re conducting our hiring and onboarding processes fully remotely. That doesn't mean we've changed our focus, though. We're still committed to growing a world-class team while providing a great candidate experience.&lt;/p&gt;

&lt;p&gt;That’s not possible unless we collect feedback in the process and learn from it. The current situation is new to all of us,  and most of us have probably never interviewed fully remotely either. But changed circumstances are no reason to let our standards slip, and we want to make sure we’re providing the best experience we can.&lt;/p&gt;

&lt;h3&gt;
  
  
  What we asked
&lt;/h3&gt;

&lt;p&gt;To help us with our direction, we asked our new starters how they’d found their onboarding experience.  We wanted to know:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What motivated you to apply to Fidel during the Pandemic?&lt;/li&gt;
&lt;li&gt;Did our team make you feel safe and clear about the stability of our company and your role?&lt;/li&gt;
&lt;li&gt;Were we well-enough prepared to conduct our hiring 100% remotely?&lt;/li&gt;
&lt;li&gt;Did we communicate well with you?&lt;/li&gt;
&lt;li&gt;How did you manage to build your understanding of the team, culture and office?&lt;/li&gt;
&lt;li&gt;What do you think could have improved your hiring experience?&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What we did well
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;1. Maintain an agile and fast-paced hiring process&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
100% of our new starters said our remote hiring process worked really well. They said it was not only fast, but efficient and well-adjusted to a remote setting.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What the team said:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;“YES! It felt like the team had experience with a remote environment which also implies that team communication is generally good”.&lt;/em&gt;   &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Marcia M., QA Engineer, Lisbon&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;How we did it:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
We’re proud of this one! Even before Covid-19 struck, we made a point of being fast-paced and agile in our processes. We try to give constructive feedback to candidates as fast as we can, and are flexible around time-zones when it comes to the scheduling of interviews. Now more than ever, we make sure we’re paying attention to the specific needs or situations of our candidates.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Give candidates the chance to get to know Fidel's culture&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
We  asked our new starters if not having the chance to be in the office during the hiring process concerned them when assessing our culture. 100% of them said it didn’t.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What the team said:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;“Not at all. Obviously I would like to have been to the office and met everyone in person, but I don't feel like the lockdown is any detriment to sharing the company culture that everyone absolutely lives by."&lt;/em&gt;  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Carlos F., QA Engineer, Lisbon&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;How we did it:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
We encouraged everyone involved in the hiring process to share their honest feelings about what it’s like to work at Fidel.  We made a point of talking candidates through our &lt;a href="https://fidel.uk/blog/creating-value-with-values-how-we-work-for-you/"&gt;company values&lt;/a&gt; so they understood what we care about as individuals and as professionals (even if they couldn’t experience it in person).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Collect feedback from candidates&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
When we asked our new starters what captivated them about Fidel, the answer was pretty much unanimous:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What the team said:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;“The funding, the people, and the product. All best-in-class!”&lt;/em&gt;  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Simon B., Business Development Manager, London&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;How we did it:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
The best way to improve any process is by looking for feedback. During our hiring processes we send NPS surveys to our candidates to give them a chance to provide us with sincere feedback. After they’ve joined, we ask them to answer a few questions (like these ones!) on how their hiring and onboarding process was.&lt;/p&gt;

&lt;h3&gt;
  
  
  What we could do better
&lt;/h3&gt;

&lt;p&gt;Starting to request feedback from our new starters has been a great learning experience for us. It’s really encouraging to see that most of the feedback we received is aligned with our focus on candidate experience.&lt;/p&gt;

&lt;p&gt;But not everything is rainbows and we also received feedback on the areas where there’s room for improvement.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Share more about what we’re doing:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;What the team said:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;“I remember speaking to Kat and Les about this as the website isn't the most comprehensive in my opinion. The most useful part for me was the case studies. The culture was easy to understand through glassdoor and speaking to individuals.”&lt;/em&gt;  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Simon B., Business Development Manager, London&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;How we’re addressing it:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A key piece of feedback from our new starters was how important it was to get to know our culture early on – even before they spoke with any team members. 70% of our new starters said that they relied mostly on Glassdoor reviews to understand our culture, rather than on materials created by the company. Some of the ideas for how we can improve that included a "meet the team” page, a more culture-oriented section in our blog, or even more team updates on Linkedin. To make our culture more visible, we’ve started this blog series and have some changes to our careers page underway. Watch this space!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Introduce candidates to more team members:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;What the team said:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;“Depending on the office we're hiring for, I would definitely recommend connecting candidates with 'culture carriers' even if not directly involved in day-to-day responsibilities. i.e. interacting with Anna was really helpful for me to gauge culture”&lt;/em&gt;  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Pat N., VP Strategic Initiatives, New York&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;How we’re addressing it:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
During the Pandemic, we’re making sure that candidates get the chance to meet more team members than usual. But the people the talk to in the hiring process are usually those who they’d be working most closely with. We’re now looking into ways for newbies to meet team members from completely different departments, giving them a more holistic view of the company culture. We’ve also started posting team-member spotlight posts on our &lt;a href="https://www.instagram.com/fidelhq/?hl=en"&gt;instagram&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Give more reassurance about the Pandemic:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;What the team said:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;“I mentioned my concern about the current financial situation/pandemic. Although everyone was really helpful in answering my questions, I suppose it would have been good to have some really concrete resources explaining the drive for more recruitment despite the situation just to ease any initial concern without needing to request the extra detail. I think it would be a massive reassurance to a prospective new hire.&lt;/em&gt;”   &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Tom K., Copywriter, London&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;How we’re addressing it:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
In such uncertain times, we’ve been conscious of the need to share more about the outlook of the company. 40% of our new starters said they would have appreciated a more detailed explanation of the current financial situation of the company. We realised that simply asking team members to speak about it during the hiring process might not be enough. Now, we’ve created an internal strategy to allow our top management to share more detail with the team and have formally added it into our interview guidelines.&lt;/p&gt;

&lt;p&gt;Thanks to the feedback from our superstar new joiners, we now feel informed and empowered enough to make the right improvements to our hiring process. We’re ready to take it to the next level. To see what it looks like for yourself, why not apply for one of our open roles?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://fidel.uk/careers"&gt;See our open roles&lt;/a&gt;&lt;/p&gt;

</description>
      <category>career</category>
      <category>beginners</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
