<?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>DEV Community: Arit Developer</title>
    <description>The latest articles on DEV Community by Arit Developer (@aritdeveloper).</description>
    <link>https://dev.to/aritdeveloper</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%2Fuser%2Fprofile_image%2F83655%2F8e31408c-e219-4327-94e3-baf4e8f9e802.png</url>
      <title>DEV Community: Arit Developer</title>
      <link>https://dev.to/aritdeveloper</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/aritdeveloper"/>
    <language>en</language>
    <item>
      <title>Accept E-Commerce Payments Easily with PayPal’s Buttons Component! 💰</title>
      <dc:creator>Arit Developer</dc:creator>
      <pubDate>Wed, 25 Oct 2023 21:39:00 +0000</pubDate>
      <link>https://dev.to/aritdeveloper/accept-e-commerce-payments-easily-with-paypals-buttons-component-494e</link>
      <guid>https://dev.to/aritdeveloper/accept-e-commerce-payments-easily-with-paypals-buttons-component-494e</guid>
      <description>&lt;p&gt;Accepting online payments is now a universal must-have, catering to everyone from solo entrepreneurs to massive global corporations.&lt;/p&gt;

&lt;p&gt;PayPal’s Standard Checkout allows for seamless integration of PayPal’s Payment Buttons component into your e-commerce app, granting you the power to accept online payments. In this guide, I am going to show how to add Standard Checkout to a simple shopping app, built with HTML and NodeJS.&lt;/p&gt;

&lt;h3&gt;
  
  
  Guide Overview
&lt;/h3&gt;

&lt;p&gt;Part 1. Prerequisites&lt;br&gt;
Part 2a. Basic Integration — Code Setup&lt;br&gt;
Part 2b. Basic Integration — Checkout Flow&lt;br&gt;
Part 3a. Custom Integration — Code Setup&lt;br&gt;
Part 3b. Custom Integration — Checkout Flow&lt;br&gt;
Part 4. Conclusion&lt;br&gt;
Part 5. Additional PayPal Payment Integrations&lt;/p&gt;


&lt;h2&gt;
  
  
  Part 1. Prerequisites
&lt;/h2&gt;

&lt;p&gt;To complete this integration, you will need the following information:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;API Credentials (Client ID and Secret) for a PayPal REST app: paste these from your Developer Dashboard. Since we are working in a development environment in this demo, ensure that the Sandbox Toggle is on.&lt;/li&gt;
&lt;/ul&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fthyj2z9u7d1sgyhjc0o4.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fthyj2z9u7d1sgyhjc0o4.png" alt="Obtain Test API Credentials"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The username and password for a Personal Sandbox account: you will need this to complete the checkout process.&lt;/li&gt;
&lt;/ul&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgr876dif4zqyaqzxfpvo.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgr876dif4zqyaqzxfpvo.png" alt="Navigate to Sandbox Accounts under Testing Tools"&gt;&lt;/a&gt;&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fabko5qiyyynasu2p1hou.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fabko5qiyyynasu2p1hou.png" alt="Obtain Personal Sandbox Account login details"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Part 2a. Basic Integration — Code Setup
&lt;/h2&gt;

&lt;p&gt;Navigate to PayPal’s &lt;a href="https://developer.paypal.com/docs/checkout/standard/integrate/" rel="noopener noreferrer"&gt;Integrate Checkout documentation&lt;/a&gt;. The documentation shows you how to set your development environment up: installing &lt;strong&gt;npm&lt;/strong&gt;, verifying your &lt;strong&gt;package.json&lt;/strong&gt; file, and setting up your &lt;strong&gt;.env&lt;/strong&gt; file.&lt;/p&gt;

&lt;p&gt;Next, you will set up your back-end server and front-end code. The documentation presents the contents of three files: &lt;strong&gt;server.js&lt;/strong&gt; (for the back-end server), &lt;strong&gt;app.js&lt;/strong&gt; (for the client-side logic) and &lt;strong&gt;checkout.html&lt;/strong&gt; (for the user interface).&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzz6npfq26826cbqgzc2m.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzz6npfq26826cbqgzc2m.png" alt="Obtain the Required Code"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Grab these code snippets and paste them into your IDE (Integrated Development Environment). I strongly recommend that you implement the basic integration first, and ensure that you are able to complete the Standard Checkout Flow successfully, before adding your custom e-commerce code. I find that this approach reduces potential errors and associated frustrations. 😅&lt;/p&gt;

&lt;p&gt;In the &lt;strong&gt;checkout.html&lt;/strong&gt; file, replace the word "test" within the Software Development Kit (SDK) script tag with your Client ID.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;script&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://www.paypal.com/sdk/js?client-id=CLIENT_ID&amp;amp;currency=USD&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/script&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the &lt;strong&gt;app.js&lt;/strong&gt; file, note that the "cart" object in the response body is hard-coded with one product’s SKU and quantity information. For important security reasons, we do not pass any transaction or price amounts from the front- end. Instead, we use the SKU/ID and quantity information to look up the product(s) in a datastore and use these product details to calculate the total cart price in our back-end.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;body&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="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;cart&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="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;“&lt;/span&gt;&lt;span class="nx"&gt;YOUR_PRODUCT_ID&lt;/span&gt;&lt;span class="err"&gt;”&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;quantity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;“&lt;/span&gt;&lt;span class="nx"&gt;YOUR_PRODUCT_QUANTITY&lt;/span&gt;&lt;span class="err"&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="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the &lt;strong&gt;server.js&lt;/strong&gt; file, note that the transaction quantity ("100.00") is hardcoded into the createOrder call.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;createOrder&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cart&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="err"&gt;“&lt;/span&gt;&lt;span class="nx"&gt;shopping&lt;/span&gt; &lt;span class="nx"&gt;cart&lt;/span&gt; &lt;span class="nx"&gt;information&lt;/span&gt; &lt;span class="nx"&gt;passed&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="nx"&gt;the&lt;/span&gt; &lt;span class="nx"&gt;frontend&lt;/span&gt; &lt;span class="nf"&gt;createOrder&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="na"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="err"&gt;”&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;cart&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;accessToken&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;generateAccessToken&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;url&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="nx"&gt;base&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/v2/checkout/orders`&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;payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;intent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;CAPTURE&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;purchase_units&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="na"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;currency_code&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;USD&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;100.00&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="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;more&lt;/span&gt; &lt;span class="nx"&gt;code&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;
  
  
  Part 2b. Basic Integration — Checkout Flow
&lt;/h2&gt;

&lt;p&gt;Start your server; on the command line, run "node server/server.js" or whichever shortcut is defined in your package.json file. You should see the PayPal Buttons component displayed on the front- end.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkt3yxe2keruaugdhm3vd.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkt3yxe2keruaugdhm3vd.png" alt="PayPal Button Component — Basic Integration"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click the first PayPal button, which displays the Checkout modal. Note that the URL in the modal shows that we are in a sandbox environment. Sign in using your Personal Sandbox account (if you haven’t already).&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8j0aqizpa6q71fm04i0u.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8j0aqizpa6q71fm04i0u.png" alt="The Checkout Modal starts the checkout process"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You are then presented with the transaction amount (at this point, this should be $100.00) and several payment options.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgon4oig23z08dyspcd8l.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgon4oig23z08dyspcd8l.png" alt="The transaction amount is hardcoded to $100"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Complete the transaction with the PayPal Balance option. A confirmation message should appear in your browser; its location depends on where you place the element with the id "result-message" in your application.&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;p&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;”result-message”&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0412ub8uxqgu9b0xli2a.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0412ub8uxqgu9b0xli2a.png" alt="Status message after completed checkout process&amp;lt;br&amp;gt;
"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Part 3a. Custom Integration — Code Setup
&lt;/h2&gt;

&lt;p&gt;Now, let’s add our custom e-commerce code!&lt;/p&gt;

&lt;p&gt;In the &lt;strong&gt;checkout.html&lt;/strong&gt; file, I added the code for three products being sold at the LiftOff Shop. I styled the code with TailwindCSS:&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;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"en"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;charset=&lt;/span&gt;&lt;span class="s"&gt;"UTF-8"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"viewport"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"width=device-width, initial-scale=1.0"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;PayPal JS SDK Standard Integration Demo&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://cdn.tailwindcss.com"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;body&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"p-6"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;h1&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"text-center text-4xl font-medium"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;LiftOff Shop&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;main&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"products flex flex-wrap justify-center"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt;
        &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"product text-center m-3 p-3 border border-slate-400 rounded-md"&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://picsum.photos/id/21/200"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"rounded-md"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;h2&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"text-xl my-2"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Galaxy Shoes&lt;span class="nt"&gt;&amp;lt;/h2&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"text-green-600 font-medium text-lg mb-2"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;$100&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"mb-3"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"text-lg"&lt;/span&gt; &lt;span class="na"&gt;for=&lt;/span&gt;&lt;span class="s"&gt;"quantity1"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Quantity:&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;select&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"text-lg"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"quantity1"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;option&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"0"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;0&lt;span class="nt"&gt;&amp;lt;/option&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;option&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"1"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;1&lt;span class="nt"&gt;&amp;lt;/option&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;option&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"2"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;2&lt;span class="nt"&gt;&amp;lt;/option&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;option&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"3"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;3&lt;span class="nt"&gt;&amp;lt;/option&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;/select&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt;
          &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"product-btn py-1 px-3 rounded-md bg-indigo-200 hover:bg-indigo-300"&lt;/span&gt;
          &lt;span class="na"&gt;data-product-id=&lt;/span&gt;&lt;span class="s"&gt;"hdqgapq9"&lt;/span&gt;
          &lt;span class="na"&gt;data-quantity-id=&lt;/span&gt;&lt;span class="s"&gt;"quantity1"&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
          Add to Cart
        &lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

      &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt;
        &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"product text-center m-3 p-3 border border-slate-400 rounded-md"&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://picsum.photos/id/104/200"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"rounded-md"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;h2&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"text-xl my-2"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Spaceship Earrings&lt;span class="nt"&gt;&amp;lt;/h2&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"text-green-600 font-medium text-lg mb-2"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;$40&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"mb-3"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"text-lg"&lt;/span&gt; &lt;span class="na"&gt;for=&lt;/span&gt;&lt;span class="s"&gt;"quantity2"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Quantity:&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;select&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"text-lg"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"quantity2"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;option&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"0"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;0&lt;span class="nt"&gt;&amp;lt;/option&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;option&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"1"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;1&lt;span class="nt"&gt;&amp;lt;/option&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;option&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"2"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;2&lt;span class="nt"&gt;&amp;lt;/option&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;option&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"3"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;3&lt;span class="nt"&gt;&amp;lt;/option&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;/select&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt;
          &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"product-btn py-1 px-3 rounded-md bg-indigo-200 hover:bg-indigo-300"&lt;/span&gt;
          &lt;span class="na"&gt;data-product-id=&lt;/span&gt;&lt;span class="s"&gt;"rnfjwsy0"&lt;/span&gt;
          &lt;span class="na"&gt;data-quantity-id=&lt;/span&gt;&lt;span class="s"&gt;"quantity2"&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
          Add to Cart
        &lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

      &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt;
        &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"product text-center m-3 p-3 border border-slate-400 rounded-md"&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://picsum.photos/id/342/200"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"rounded-md"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;h2&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"text-xl my-2"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Martian Tote&lt;span class="nt"&gt;&amp;lt;/h2&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"text-green-600 font-medium text-lg mb-2"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;$75&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"mb-3"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"text-lg"&lt;/span&gt; &lt;span class="na"&gt;for=&lt;/span&gt;&lt;span class="s"&gt;"quantity3"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Quantity:&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;select&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"text-lg"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"quantity3"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;option&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"0"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;0&lt;span class="nt"&gt;&amp;lt;/option&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;option&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"1"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;1&lt;span class="nt"&gt;&amp;lt;/option&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;option&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"2"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;2&lt;span class="nt"&gt;&amp;lt;/option&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;option&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"3"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;3&lt;span class="nt"&gt;&amp;lt;/option&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;/select&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt;
          &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"product-btn py-1 px-3 rounded-md bg-indigo-200 hover:bg-indigo-300"&lt;/span&gt;
          &lt;span class="na"&gt;data-product-id=&lt;/span&gt;&lt;span class="s"&gt;"zytkddw5"&lt;/span&gt;
          &lt;span class="na"&gt;data-quantity-id=&lt;/span&gt;&lt;span class="s"&gt;"quantity3"&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
          Add to Cart
        &lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/main&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"result-message"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"mx-auto text-center text-red-600 w-1/2"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/p&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;section&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"mt-8 mx-auto flex flex-wrap w-1/2"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"mb-3 w-1/2 text-center"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"cart"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;h2&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"text-xl font-medium"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Cart&lt;span class="nt"&gt;&amp;lt;/h2&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;ul&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"cart-items"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/ul&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;TOTAL $&lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"cart-total"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;0&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt;
          &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"clear-cart"&lt;/span&gt;
          &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"py-1 px-3 mt-3 rounded-md bg-gray-200 hover:bg-gray-300"&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
          Clear Cart
        &lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"text-center"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"paypal-button-container"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/section&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://www.paypal.com/sdk/js?client-id=AYCd0wKOWs9itZ23_2XEZUhZpbZdHT_c1qcMCjqTnb6fxFE7tQBnUQGSPh3_PVQkgoBamFV1KgPUI9B4&amp;amp;currency=USD"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"module"&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"app.js"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq3eqwksxl5vu6e4hq9jb.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq3eqwksxl5vu6e4hq9jb.png" alt="E-Commerce App with PayPal Buttons Component"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the &lt;strong&gt;app.js&lt;/strong&gt; file, I added code that brings the Add-To-Cart, Calculate-Cart-Total and Clear-Cart functionalities. To calculate my cart total, I imported my product information from the &lt;strong&gt;products.js&lt;/strong&gt; file, which serves as my makeshift datastore. I also updated the cart object in the response body to the &lt;strong&gt;cartItems&lt;/strong&gt; array (instead of the hard-coded product from earlier).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&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;PRODUCTS&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;./products.js&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;cartItems&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;cartTotal&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="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;addToCart&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;productId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;quantityId&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;quantitySelect&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;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;quantityId&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;selectedQuantity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;parseInt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;quantitySelect&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;selectedQuantity&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="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;cartItems&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;productId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;quantity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;selectedQuantity&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="nx"&gt;cartTotal&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;calculateCartTotal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cartItems&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nf"&gt;updateCart&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cartItems&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="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;calculateCartTotal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cartItems&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;total&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="nx"&gt;cartItems&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;item&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;total&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;quantity&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;PRODUCTS&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;price&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="nx"&gt;total&lt;/span&gt;&lt;span class="p"&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;updateCart&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cartItems&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;cartItemsList&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;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;cart-items&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;cartTotalElement&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;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;cart-total&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nx"&gt;cartItemsList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerHTML&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nx"&gt;cartTotalElement&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;cartTotal&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nx"&gt;cartItems&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;item&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;li&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;li&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;li&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textContent&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="nx"&gt;PRODUCTS&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;name&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;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;quantity&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;cartItemsList&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;li&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="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;paypal&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Buttons&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;createOrder&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;try&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;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/api/orders&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="na"&gt;method&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="na"&gt;headers&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;Content-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;application/json&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="c1"&gt;// use the "body" param to optionally pass additional order information&lt;/span&gt;
          &lt;span class="c1"&gt;// like product ids and quantities&lt;/span&gt;
          &lt;span class="na"&gt;body&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="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
            &lt;span class="na"&gt;cart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;cartItems&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="nx"&gt;more&lt;/span&gt; &lt;span class="nx"&gt;code&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;

&lt;span class="p"&gt;...&lt;/span&gt; &lt;span class="nx"&gt;more&lt;/span&gt; &lt;span class="nx"&gt;code&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="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;#paypal-button-container&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Example function to show a result to the user. Your site's UI library can be used instead.&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;resultMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;message&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;container&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;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;#result-message&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;container&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerHTML&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Event Listeners&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;productBtns&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;querySelectorAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;.product-btn&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;productBtns&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;btn&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;btn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;click&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;e&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;productId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;productId&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;quantityId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;quantityId&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nf"&gt;addToCart&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;productId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;quantityId&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="c1"&gt;// clear cart&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;clear-cart&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;click&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="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// clear cart items, without reassigning the array&lt;/span&gt;
  &lt;span class="nx"&gt;cartItems&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&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="nx"&gt;cartTotal&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="nf"&gt;updateCart&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cartItems&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;In the &lt;strong&gt;server.js&lt;/strong&gt; file, I imported my products from &lt;strong&gt;products.js&lt;/strong&gt; and added a function that calculates the transaction amount using the cart contents. In the &lt;strong&gt;createOrder&lt;/strong&gt; call, I replaced the hardcoded transaction value with the calculated cart value.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&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="s2"&gt;express&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;fetch&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;node-fetch&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;dotenv/config&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;path&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;path&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;PRODUCTS&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;../client/products.js&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;more&lt;/span&gt; &lt;span class="nx"&gt;code&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt; &lt;span class="nx"&gt;more&lt;/span&gt; &lt;span class="nx"&gt;code&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;calculateTotalPrice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cart&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;totalPrice&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="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;i&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="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;cart&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&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;totalPrice&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nx"&gt;PRODUCTS&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;cart&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;price&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;cart&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;quantity&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="nx"&gt;totalPrice&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="cm"&gt;/**
 * Create an order to start the transaction.
 * @see https://developer.paypal.com/docs/api/orders/v2/#orders_create
 */&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;createOrder&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cart&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="c1"&gt;// use the cart information passed from the front-end to calculate the purchase unit details&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="s2"&gt;shopping cart information passed from the frontend createOrder() callback:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;cart&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;accessToken&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;generateAccessToken&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;url&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="nx"&gt;base&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/v2/checkout/orders`&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;payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;intent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;CAPTURE&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;purchase_units&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="na"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;currency_code&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;USD&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;calculateTotalPrice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cart&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="p"&gt;};&lt;/span&gt;

  &lt;span class="p"&gt;...&lt;/span&gt; &lt;span class="nx"&gt;more&lt;/span&gt; &lt;span class="nx"&gt;code&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;more&lt;/span&gt; &lt;span class="nx"&gt;code&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Part 3b. Custom Integration — Checkout Flow
&lt;/h2&gt;

&lt;p&gt;Restart the server and add some products to the cart; I chose one of each item, totaling $215.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff71bqhhvg779mudoridz.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff71bqhhvg779mudoridz.png" alt="Cart total showing total amount of cart items"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click the gold PayPal button to activate Checkout (signing in with your Personal Sandbox account, if necessary). You should see that the transaction amount is the value of your cart.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5wv2eg9eyzbg69y4mdxt.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5wv2eg9eyzbg69y4mdxt.png" alt="Transaction value in the Checkout modal is equal to the cart amount"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Go ahead and complete the purchase. You should see a confirmation message in the browser.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg7l23i31elskipggiro4.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg7l23i31elskipggiro4.png" alt="Confirmation of successful checkout in browser"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 4. Conclusion
&lt;/h2&gt;

&lt;p&gt;This demo introduced a straightforward integration of PayPal’s Standard Checkout, using the PayPal Buttons component. You may customize your further, to meet your use cases. Read our Checkout Documentation for &lt;a href="https://developer.paypal.com/docs/checkout/standard/customize/" rel="noopener noreferrer"&gt;examples of these customizations&lt;/a&gt;. The PayPal Developer &lt;a href="https://github.com/paypaldev" rel="noopener noreferrer"&gt;GitHub repository&lt;/a&gt; also has several examples of integrations within various code environments, such as React and Angular.&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 5. Additional PayPal Payment Integrations
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developer.paypal.com/docs/checkout/pay-later/us/" rel="noopener noreferrer"&gt;Pay Later&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Custom Debit/Credit Card fields (&lt;a href="https://developer.paypal.com/docs/checkout/advanced/integrate/" rel="noopener noreferrer"&gt;Advanced Checkout&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;




&lt;blockquote&gt;
&lt;p&gt;Join the PayPal Developer Community!&lt;br&gt;
Our Developer Community members support each other in integrating PayPal technologies, contributing to open source, expanding knowledge and networks, and improving PayPal’s products and documentation. We’d love to have you join us! 💙&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developer.paypal.com/" rel="noopener noreferrer"&gt;Website&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/paypaldev" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/paypal" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

</description>
      <category>paypal</category>
      <category>node</category>
    </item>
    <item>
      <title>PayPal Nocode Estimates: Get On The Same Page!</title>
      <dc:creator>Arit Developer</dc:creator>
      <pubDate>Thu, 01 Jun 2023 14:01:46 +0000</pubDate>
      <link>https://dev.to/paypaldeveloper/paypal-nocode-estimates-get-on-the-same-page-44lm</link>
      <guid>https://dev.to/paypaldeveloper/paypal-nocode-estimates-get-on-the-same-page-44lm</guid>
      <description>&lt;p&gt;There is a useful precursor to sending a client an invoice, and that is sending an estimate. Estimates allow you to establish full agreement with your clients regarding expected products and/or services, such that nothing in the subsequent invoice comes as a surprise.&lt;/p&gt;

&lt;p&gt;PayPal offers a powerful Estimate Builder to improve your business or organizational flows. The builder is no-code, which makes it straightforward for both technical and non-technical people to use. Plus, once your client accepts your Estimate, you can convert it to an Invoice with ONE click! Quite convenient if you ask me! 😎&lt;/p&gt;

&lt;p&gt;In this guide, I show you how to create an Estimate using PayPal, and how to convert your Estimate to an Invoice. If you are interested in no-code Invoicing, check out our guide &lt;a href="https://dev.to/paypaldeveloper/paypal-no-code-invoicing-to-simplify-your-life-d8m"&gt;here&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Guide Overview
&lt;/h2&gt;

&lt;p&gt;Part 1. Access Estimate Builder &lt;br&gt;
Part 2. Build Estimate &lt;br&gt;
-- 2a. Choose Template and Currency &lt;br&gt;
-- 2b. Add or Edit Customer &lt;br&gt;
-- 2c. Add and Customize Items &lt;br&gt;
-- 2d. Edit Your Business Info, Estimate Date and Number &lt;br&gt;
-- 2e. Make Price Adjustments and Enable Tips and Partial Payments &lt;br&gt;
-- 2f. Preview Finished Estimate &lt;br&gt;
Part 3. SEND IT! 🚀 &lt;/p&gt;




&lt;h3&gt;
  
  
  Part 1. Access Estimate Builder
&lt;/h3&gt;

&lt;p&gt;Sign in to your Business PayPal account. If you do not have one, &lt;a href="https://www.paypal.com/bizsignup/#/singlePageSignup" rel="noopener noreferrer"&gt;sign up&lt;/a&gt; for one; bear in mind that this is different from a &lt;strong&gt;&lt;em&gt;Personal&lt;/em&gt;&lt;/strong&gt; PayPal account. &lt;/p&gt;

&lt;p&gt;We access the Estimate Builder from the Invoicing section. From the navigation bar, navigate to Invoicing. Your navigation layout may vary; I have reproduced two variations in the images below. &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%2Fuploads%2Farticles%2Fb0jiaksvi7u9t6d91bka.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb0jiaksvi7u9t6d91bka.png" alt="Navigate to Invoicing 1" width="800" height="312"&gt;&lt;/a&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F67a142ytn1vsdyk6is9h.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F67a142ytn1vsdyk6is9h.png" alt="Navigate to Invoicing 2" width="800" height="352"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Then click on 'Estimates', followed by the 'Create Estimate' button: &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%2Fuploads%2Farticles%2F3840b6w3chk17a18lezn.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3840b6w3chk17a18lezn.png" alt="Navigate to Estimates" width="800" height="388"&gt;&lt;/a&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fds07lapzzfdqqgv1ck5k.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fds07lapzzfdqqgv1ck5k.png" alt="Click Create Estimate Button" width="800" height="402"&gt;&lt;/a&gt; &lt;/p&gt;




&lt;h3&gt;
  
  
  Part 2. Build Estimate
&lt;/h3&gt;

&lt;h4&gt;
  
  
  2a. Choose Template and Currency
&lt;/h4&gt;

&lt;p&gt;PayPal offers three ways to present your Estimate's items: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Quantity&lt;/strong&gt;: list items, their quantity and their per-unit cost. This option is the default. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Amount&lt;/strong&gt;: list items and their associated cost. This option is suitable when you do not need to specify quantity; for example, a unique painting. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hours&lt;/strong&gt;: list items, their duration in hours, and the per-hour rate. This option is perfect for time-based services, such as counseling. &lt;/li&gt;
&lt;/ul&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%2Fuploads%2Farticles%2Fdw0talvdtgjz1a0wofas.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdw0talvdtgjz1a0wofas.png" alt="Choose Template and Currency" width="800" height="266"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;h4&gt;
  
  
  2b. Add or Edit Customer
&lt;/h4&gt;

&lt;p&gt;Add your customer - either create a new one or choose from previously created customers. You may also choose if and where to ship the items, and whether to add additional people to receive the estimate. &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%2Fuploads%2Farticles%2F2bc1d55etxj2og0gftlo.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2bc1d55etxj2og0gftlo.png" alt="Add Customer" width="800" height="318"&gt;&lt;/a&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdtq4mp48ve1x3ucnjodn.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdtq4mp48ve1x3ucnjodn.png" alt="Shipping and Additional Recipients" width="800" height="166"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;h4&gt;
  
  
  2c. Add and Customize Items
&lt;/h4&gt;

&lt;p&gt;Add the items you wish to estimate costs for. You may include a custom message to your customer, terms and conditions, and a reference number. You may also attach any relevant documents to the estimate and add a private note for yourself (your customer will not be able to view this note). &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%2Fuploads%2Farticles%2Folaasqba8nq69cycd5xu.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Folaasqba8nq69cycd5xu.png" alt="Add Items" width="800" height="285"&gt;&lt;/a&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvvmyh48pzckbkecuu9og.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvvmyh48pzckbkecuu9og.png" alt="Message to Customer" width="800" height="194"&gt;&lt;/a&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyy1vjkiuzcd17htmjdk6.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyy1vjkiuzcd17htmjdk6.png" alt="Add Attachments and Private Note" width="800" height="352"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;h4&gt;
  
  
  2d. Edit Your Business Info, Estimate Date and Number
&lt;/h4&gt;

&lt;p&gt;You may edit your business information and select which business details to show or hide. You may also select an Estimate Date (which defaults to the current date) and set a custom Estimate Number (which, by default, automatically increments from your last estimate). &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%2Fuploads%2Farticles%2F0kbcgq3cv2ewwyyoqnfb.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0kbcgq3cv2ewwyyoqnfb.png" alt="Edit Business Info Estimate Date and Number" width="800" height="800"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;h4&gt;
  
  
  2e. Make Price Adjustments and Enable Tips and Partial Payments
&lt;/h4&gt;

&lt;p&gt;You may adjust your Estimate total by adding discounts, fees, surcharges, etc. You can also turn on Tipping and Partial Payments. &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%2Fuploads%2Farticles%2Foiqxajmpvnfutinc4lst.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foiqxajmpvnfutinc4lst.png" alt="Price Adjustments" width="412" height="622"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;h4&gt;
  
  
  2f. Preview Finished Estimate
&lt;/h4&gt;

&lt;p&gt;When you're done building your Estimate, you can preview what it looks like from your customer's perspective. Click the Eye Icon at the top corner of the Estimate Builder. When your customer views their Estimate, they will have the option to either request changes or accept the Estimate. &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%2Fuploads%2Farticles%2F0ne99ztpsa5xxo21ap9b.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0ne99ztpsa5xxo21ap9b.png" alt="Estimate Preview" width="800" height="274"&gt;&lt;/a&gt; &lt;/p&gt;




&lt;h3&gt;
  
  
  Part 3. SEND IT! 🚀
&lt;/h3&gt;

&lt;p&gt;All looks good? Then SEND your Estimate - click the Send button. There are some actions available prior to sending the Estimate: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Share the Estimate link &lt;/li&gt;
&lt;li&gt;Save Estimate as a draft &lt;/li&gt;
&lt;li&gt;Save Estimate as a template &lt;/li&gt;
&lt;/ul&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%2Fuploads%2Farticles%2Fxma2r8on5533kufipqq5.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxma2r8on5533kufipqq5.png" alt="View After Sending Estimate" width="531" height="407"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;After sending, the next view shows you the activity on your estimate. You can add further memos to yourself. &lt;/p&gt;

&lt;p&gt;When your customer accepts the Estimate, the Estimate status will be updated. Then you can convert it to an Invoice in one click and send back to your customer for payment. &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%2Fuploads%2Farticles%2Fsopplyinl3y3mt0vator.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsopplyinl3y3mt0vator.png" alt="Accepted Estimate" width="800" height="143"&gt;&lt;/a&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Felo2ny3hrxsoijv6ucq0.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Felo2ny3hrxsoijv6ucq0.png" alt="Convert Estimate to Invoice" width="800" height="283"&gt;&lt;/a&gt; &lt;/p&gt;




&lt;blockquote&gt;
&lt;h4&gt;
  
  
  Join the PayPal Developer Community
&lt;/h4&gt;

&lt;p&gt;Our Developer Community members support each other in integrating PayPal technologies, contributing to open source, expanding knowledge and networks, and improving PayPal's products and documentation. We'd love to have you join us! 💙 &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Website: &lt;a href="https://developer.paypal.com" rel="noopener noreferrer"&gt;https://developer.paypal.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Twitter: &lt;a href="https://twitter.com/paypaldev" rel="noopener noreferrer"&gt;@paypaldev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/paypal" rel="noopener noreferrer"&gt;@paypal&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

</description>
      <category>career</category>
      <category>mentalhealth</category>
    </item>
    <item>
      <title>PayPal Has Updated Its Webhook Verification Endpoint</title>
      <dc:creator>Arit Developer</dc:creator>
      <pubDate>Thu, 01 Jun 2023 13:48:48 +0000</pubDate>
      <link>https://dev.to/paypaldeveloper/paypal-has-updated-its-webhook-verification-endpoint-n6l</link>
      <guid>https://dev.to/paypaldeveloper/paypal-has-updated-its-webhook-verification-endpoint-n6l</guid>
      <description>&lt;h3&gt;
  
  
  TL;DR;
&lt;/h3&gt;

&lt;p&gt;PayPal requires that all the webhook notification messages it sends be verified by the webhook listener receiving these messages.&lt;br&gt;
This requirement enhances security by ensuring that your webhook listener is receiving authentic PayPal webhook messages.&lt;br&gt;
PayPal has updated its endpoint for verifying PayPal webhook notification messages, and its old webhook verification method is now deprecated. The updated endpoint simplifies the process of verifying PayPal webhook messages, which improves the developer experience.&lt;br&gt;
The update also incorporates a lot more of our REST APIs (such as the Orders API). You may learn more about the update rationale &lt;a href="https://github.com/paypal/PayPal-node-SDK/blob/2.0-beta/docs/FAQ.md" rel="noopener noreferrer"&gt;here&lt;/a&gt;. &lt;/p&gt;




&lt;p&gt;A webhook is an automated HTTP request sent from an application when triggered by an event. This request carries a message (called a payload) to a unique destination URL (called a webhook listener), and the receiving application can take further actions based on the payload content. Webhooks allow applications to communicate seamlessly with each other and enable speed in processing and service delivery. &lt;/p&gt;

&lt;p&gt;PayPal’s REST APIs use webhooks to notify your application that an event has occurred; for example, a new order has been placed, or a payment has been processed. You can create a webhook associated with an event in your PayPal Developer Portal account. PayPal webhooks support an &lt;a href="https://developer.paypal.com/api/rest/webhooks/event-names/" rel="noopener noreferrer"&gt;extensive list of event types&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;An unscrupulous player could spoof a webhook notification message and attempt to make the message appear as it originated from PayPal. Therefore, to ensure security, PayPal requires that applications verify all webhook notifications received from PayPal. &lt;/p&gt;

&lt;p&gt;To verify the PayPal webhook message, your application sends a POST request to PayPal’s &lt;code&gt;verify-webhook-signature&lt;/code&gt; &lt;a href="https://developer.paypal.com/docs/api/webhooks/v1/#verify-webhook-signature_post" rel="noopener noreferrer"&gt;endpoint&lt;/a&gt; with a payload containing several required parameters: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;auth_algo&lt;/code&gt; extracted from the &lt;code&gt;PAYPAL-AUTH-ALGO&lt;/code&gt; value in the webhook response header.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cert_url&lt;/code&gt; extracted from the &lt;code&gt;PAYPAL-CERT-URL&lt;/code&gt; value in the webhook response header.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;transmission_id&lt;/code&gt; extracted from the &lt;code&gt;PAYPAL-TRANSMISSION-ID&lt;/code&gt; value in the webhook response header.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;transmission_sig&lt;/code&gt; extracted from the &lt;code&gt;PAYPAL-TRANSMISSION-SIG&lt;/code&gt; value in the webhook response header.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;transmission_time&lt;/code&gt; extracted from the &lt;code&gt;PAYPAL-TRANSMISSION-TIME&lt;/code&gt; value in the webhook response header.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;webhook_id&lt;/code&gt; The ID of the webhook as configured in your PayPal Developer Portal account. &lt;/li&gt;
&lt;li&gt;
&lt;code&gt;webhook_event&lt;/code&gt; This is the webhook notification response received from PayPal, which you are now verifying.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here is a sample webhook verification payload: &lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;

&lt;span class="p"&gt;{&lt;/span&gt; 
&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;auth_algo&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;SHA256withRSA&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;cert_url&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;cert_url&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;transmission_id&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;69cd13f0-d67a-11e5-baa3-778b53f4ae55&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;transmission_sig&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;lmI95Jx3Y9nhR5SJWlHVIWpg4AgFk7n9bCHSRxbrd8A9zrhdu2rMyFrmz+Zjh3s3boXB07VXCXUZy/UFzUlnGJn0wDugt7FlSvdKeIJenLRemUxYCPVoEZzg9VFNqOa48gMkvF+XTpxBeUx/kWy6B5cp7GkT2+pOowfRK7OaynuxUoKW3JcMWw272VKjLTtTAShncla7tGF+55rxyt2KNZIIqxNMJ48RDZheGU5w1npu9dZHnPgTXB9iomeVRoD8O/jhRpnKsGrDschyNdkeh81BJJMH4Ctc6lnCCquoP/GzCzz33MMsNdid7vL/NIWaCsekQpW26FpWPi/tfj8nLA==&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;transmission_time&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;2016-02-18T20:01:35Z&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;webhook_id&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;1JE4291016473214C&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;webhook_event&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;id&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;8PT597110X687430LKGECATA&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;create_time&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;2013-06-25T21:41:28Z&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;resource_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;authorization&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;event_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;PAYMENT.AUTHORIZATION.CREATED&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;summary&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;A payment authorization was created&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;resource&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;id&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;2DC87612EK520411B&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;create_time&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;2013-06-25T21:39:15Z&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;update_time&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;2013-06-25T21:39:17Z&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;state&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;authorized&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;amount&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;total&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;7.47&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;currency&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;USD&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;details&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;subtotal&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;7.47&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;parent_payment&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;PAY-36246664YD343335CKHFA4AY&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;valid_until&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;2013-07-24T21:39:15Z&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;links&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;href&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;https://api-m.paypal.com/v1/payments/authorization/2DC87612EK520411B&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;rel&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;self&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;method&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;GET&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;href&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;https://api-m.paypal.com/v1/payments/authorization/2DC87612EK520411B/capture&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;rel&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;capture&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;method&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;href&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;https://api-m.paypal.com/v1/payments/authorization/2DC87612EK520411B/void&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;rel&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;void&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;method&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;href&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;https://api-m.paypal.com/v1/payments/payment/PAY-36246664YD343335CKHFA4AY&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;rel&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;parent_payment&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;method&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;GET&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="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;Here is a sample POST request verifying a PayPal webhook notification, sent from a NodeJS application:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;

&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;fetch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;node-fetch&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; 
&lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://api-m.sandbox.paypal.com/v1/notifications/verify-webhook-signature&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="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;headers&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="s1"&gt;Content-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="s1"&gt;application/json&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="s1"&gt;Authorization&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="s1"&gt;Bearer ECvJ_yBNz_UfMmCvWEbT_2ZWXdzbFFQZ-1Y5K2NGgeHn&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; 
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;body&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="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;transmission_id&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;69cd13f0-d67a-11e5-baa3-778b53f4ae55&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;transmission_time&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;2016-02-18T20:01:35Z&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;cert_url&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;cert_url&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;auth_algo&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;SHA256withRSA&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;transmission_sig&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;lmI95Jx3Y9nhR5SJWlHVIWpg4AgFk7n9bCHSRxbrd8A9zrhdu2rMyFrmz+Zjh3s3boXB07VXCXUZy/UFzUlnGJn0wDugt7FlSvdKeIJenLRemUxYCPVoEZzg9VFNqOa48gMkvF+XTpxBeUx/kWy6B5cp7GkT2+pOowfRK7OaynuxUoKW3JcMWw272VKjLTtTAShncla7tGF+55rxyt2KNZIIqxNMJ48RDZheGU5w1npu9dZHnPgTXB9iomeVRoD8O/jhRpnKsGrDschyNdkeh81BJJMH4Ctc6lnCCquoP/GzCzz33MMsNdid7vL/NIWaCsekQpW26FpWPi/tfj8nLA==&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;webhook_id&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;1JE4291016473214C&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;webhook_event&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;id&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;8PT597110X687430LKGECATA&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;create_time&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;2013-06-25T21:41:28Z&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;resource_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;authorization&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;event_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;PAYMENT.AUTHORIZATION.CREATED&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;summary&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;A payment authorization was created&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;resource&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;id&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;2DC87612EK520411B&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;create_time&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;2013-06-25T21:39:15Z&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;update_time&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;2013-06-25T21:39:17Z&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;state&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;authorized&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;amount&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;total&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;7.47&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;currency&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;USD&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;details&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;subtotal&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;7.47&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;parent_payment&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;PAY-36246664YD343335CKHFA4AY&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;valid_until&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;2013-07-24T21:39:15Z&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;links&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;href&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;https://api-m.paypal.com/v1/payments/authorization/2DC87612EK520411B&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;rel&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;self&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;method&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;GET&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;href&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;https://api-m.paypal.com/v1/payments/authorization/2DC87612EK520411B/capture&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;rel&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;capture&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;method&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;href&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;https://api-m.paypal.com/v1/payments/authorization/2DC87612EK520411B/void&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;rel&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;void&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;method&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;href&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;https://api-m.paypal.com/v1/payments/payment/PAY-36246664YD343335CKHFA4AY&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;rel&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;parent_payment&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;method&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;GET&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="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;p&gt;When your webhook verification request is successful, PayPal responds with the following payload (and an HTTP status of 200):&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;

&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;verification_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;SUCCESS&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;PayPal has a &lt;a href="https://developer.paypal.com/dashboard/webhooksSimulator" rel="noopener noreferrer"&gt;webhook simulator&lt;/a&gt; with which you can quickly test your webhook listener. Grab the URL of your webhook listener, or grab a mock listener URL from services like &lt;a href="https://webhook.site" rel="noopener noreferrer"&gt;https://webhook.site&lt;/a&gt;. In the webhook simulator, enter this URL in the Webhooks URL field, select the Event Type for which you want a notification message, then click Send Test:&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz8n9amafzuerkqz24xd2.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz8n9amafzuerkqz24xd2.png" alt="Screenshot of PayPal Webhook Smmulator"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Your webhook listener should receive a mock payload from PayPal that resembles the examples provided earlier in this post.&lt;/p&gt;




&lt;p&gt;PayPal takes the security of our products very seriously; with this update to our webhook verification endpoint, we continue to provide seamless payment integrations, coupled with mission-critical quality security standards.&lt;/p&gt;




&lt;blockquote&gt;
&lt;h4&gt;
  
  
  Join the PayPal Developer Community
&lt;/h4&gt;

&lt;p&gt;Our Developer Community members support each other in integrating PayPal technologies, contributing to open source, expanding knowledge and networks, and improving PayPal's products and documentation. We'd love to have you join us! 💙 &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Website: &lt;a href="https://developer.paypal.com" rel="noopener noreferrer"&gt;https://developer.paypal.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Twitter: &lt;a href="https://twitter.com/paypaldev" rel="noopener noreferrer"&gt;@paypaldev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/paypal" rel="noopener noreferrer"&gt;@paypal&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>programming</category>
      <category>news</category>
    </item>
    <item>
      <title>PayPal No-code Invoicing to Simplify Your Life! 😮‍💨</title>
      <dc:creator>Arit Developer</dc:creator>
      <pubDate>Wed, 25 Jan 2023 17:50:25 +0000</pubDate>
      <link>https://dev.to/paypaldeveloper/paypal-no-code-invoicing-to-simplify-your-life-d8m</link>
      <guid>https://dev.to/paypaldeveloper/paypal-no-code-invoicing-to-simplify-your-life-d8m</guid>
      <description>&lt;p&gt;Every developer I know (ok, &lt;em&gt;most&lt;/em&gt; developers 😅) seeks ways to accomplish tasks more efficiently. The rise of no- and low-code tooling is empowering both coders and non-coders alike to achieve business and operational goals that deliver just as much value, without requiring as much code. 🎉&lt;/p&gt;

&lt;p&gt;One such area is Invoicing. Invoice management is a crucial part of any enterprise, and no-code invoicing tools allow people to quickly configure their invoicing system, manage open invoices and payments seamlessly, and save precious time to invest in other revenue-generating pursuits.&lt;/p&gt;

&lt;p&gt;In this guide, I show you how to incorporate PayPal's No-node Invoicing system into your business or organizational workflow. In a few minutes, you'll be sending your first invoice!&lt;/p&gt;




&lt;h2&gt;
  
  
  Guide Overview
&lt;/h2&gt;

&lt;p&gt;Part 1. Access Invoice Builder&lt;br&gt;
Part 2. Edit Business Information&lt;br&gt;
Part 3. Build Invoice&lt;br&gt;
-- Part 3b. Edit Invoice Parameters&lt;br&gt;
-- Part 3c. Add Price Adjustments&lt;br&gt;
-- Part 3d. Enable Partial Payments and Tips&lt;br&gt;
-- Part 3e. Preview Finished Invoice&lt;br&gt;
Part 4. SEND IT! 🚀&lt;/p&gt;




&lt;h3&gt;
  
  
  Part 1. Access Invoice Builder
&lt;/h3&gt;

&lt;p&gt;Sign in to your Business PayPal account. If you do not have one, &lt;a href="https://www.paypal.com/bizsignup/#/singlePageSignup" rel="noopener noreferrer"&gt;sign up&lt;/a&gt; for one; bear in mind that this is different from a &lt;strong&gt;&lt;em&gt;Personal&lt;/em&gt;&lt;/strong&gt; PayPal account.&lt;/p&gt;

&lt;p&gt;From the navigation bar, navigate to Invoicing. Your navigation layout may vary; I have reproduced two variations in the images below.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb0jiaksvi7u9t6d91bka.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb0jiaksvi7u9t6d91bka.png" alt="Navigate to Invoicing 1"&gt;&lt;/a&gt;&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F67a142ytn1vsdyk6is9h.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F67a142ytn1vsdyk6is9h.png" alt="Navigate to Invoicing 2"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Part 2. Edit Business Information
&lt;/h3&gt;

&lt;p&gt;Edit your business information so that it displays correctly on your invoices. Click the Gear Icon towards the right, then select Business Information.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fabtsk8i1ofr63qcomqd7.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fabtsk8i1ofr63qcomqd7.png" alt="Open Business Information"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the panel that opens, you may add your business logo and choose which business details display in invoices.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg32un40kv4cvt43qwne4.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg32un40kv4cvt43qwne4.png" alt="Edit Business Details"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Part 3. Build Invoice
&lt;/h3&gt;

&lt;p&gt;Click the Create Invoice button. Next, type in the products or services for which you are creating an invoice. PayPal offers good flexibility in how you define and customize these items: in terms of amounts, quantity, or hours.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh2u6ceeb9slrbein6lox.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh2u6ceeb9slrbein6lox.png" alt="Create Invoice Button"&gt;&lt;/a&gt;&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmeroe4rqsevvhigu31nn.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmeroe4rqsevvhigu31nn.png" alt="Edit Item Details"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You may leave an optional note for your customer, to communicate some details that are not captured in the Item List.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9qak1cinup3wwm9vmsjw.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9qak1cinup3wwm9vmsjw.png" alt="Note To Customer"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You may also attach images or PDF documents to your invoice, and leave yourself a memo. This memo is hidden from your customer; they will not have access to it.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmjp1vojgb1q3d9at1o7s.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmjp1vojgb1q3d9at1o7s.png" alt="Attachments and Self Memo"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Part 3b. Edit Invoice Parameters
&lt;/h3&gt;

&lt;p&gt;Next, to the right of the Invoice Builder, you may specify an Invoice Number, the Invoice Date (defaults to the current date), and the Due Date.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fje5xl6b8mu6kd8hxw3jm.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fje5xl6b8mu6kd8hxw3jm.png" alt="Invoice Parameters"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Part 3c. Add Price Adjustments
&lt;/h3&gt;

&lt;p&gt;You can also add some price adjustments that affect the final Invoice amount, such as discounts, fees, surcharges, etc.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7mlj16oq8e2thsdmshvm.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7mlj16oq8e2thsdmshvm.png" alt="Price Adjustments"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Part 3d. Enable Partial Payments and Tips
&lt;/h3&gt;

&lt;p&gt;I think this is a cool feature: you can allow your customers to make partial payments toward their invoice! 🥳 You can even specify the minimum amount that a partial payment can be. You can also accept tips.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvn3dbqcdi37rateagmc1.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvn3dbqcdi37rateagmc1.png" alt="Partial Payments and Tips"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Part 3e. Preview Finished Invoice
&lt;/h3&gt;

&lt;p&gt;When you're done building your Invoice, you can preview what it looks like from your customer's perspective. Click the Eye Icon at the top corner of the Invoice Builder.&lt;/p&gt;

&lt;p&gt;If you anticipate reusing the structure of the invoice you've built, you can save it as a Template; find this option among others in the dropdown menu next to the Eye Icon.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvpmrocwo9qabd5yjizu3.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvpmrocwo9qabd5yjizu3.png" alt="Preview Finished Invoice"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Part 4. SEND IT! 🚀
&lt;/h3&gt;

&lt;p&gt;All looks good? Then SEND your Invoice - click the Send button. After sending, the next view shows you the activity on your invoice. You can add further memos to yourself.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4l0t61rbk7fsj0lk1emd.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4l0t61rbk7fsj0lk1emd.png" alt="View After Sending Invoice"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There are also some post-invoice actions available to you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Remind your customer about their invoice (click the Remind button at the top-right corner)&lt;/li&gt;
&lt;li&gt;Edit your Invoice using the Pencil Icon&lt;/li&gt;
&lt;li&gt;Access other actions from the 3-dot Dropdown, such as Record Payment (if your customer pays you outside of PayPal) or Download Invoice PDF&lt;/li&gt;
&lt;/ul&gt;




&lt;blockquote&gt;
&lt;h4&gt;
  
  
  Join the PayPal Developer Community
&lt;/h4&gt;

&lt;p&gt;Our Developer Community members support each other in integrating PayPal technologies, contributing to open source, expanding knowledge and networks, and improving PayPal's products and documentation. We'd love to have you join us! 💙 &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Website: &lt;a href="https://developer.paypal.com" rel="noopener noreferrer"&gt;https://developer.paypal.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Twitter: &lt;a href="https://twitter.com/paypaldev" rel="noopener noreferrer"&gt;@paypaldev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/paypal" rel="noopener noreferrer"&gt;@paypal&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;Cover Photo by &lt;a href="https://www.pexels.com/photo/lady-in-beach-silhouette-during-daytime-photography-40192/" rel="noopener noreferrer"&gt;Jill Wellington&lt;/a&gt;&lt;/em&gt; &lt;/p&gt;

</description>
    </item>
    <item>
      <title>Start Selling Subscriptions From Your Website FAST!</title>
      <dc:creator>Arit Developer</dc:creator>
      <pubDate>Mon, 24 Oct 2022 15:03:13 +0000</pubDate>
      <link>https://dev.to/paypaldeveloper/start-selling-subscriptions-from-your-website-fast-1i44</link>
      <guid>https://dev.to/paypaldeveloper/start-selling-subscriptions-from-your-website-fast-1i44</guid>
      <description>&lt;p&gt;In this guide, I will show you how to get subscriptions to your products and services up and running fast! &lt;a href="https://paypal.com" rel="noopener noreferrer"&gt;PayPal&lt;/a&gt; provides a straightforward way to sell subscriptions. You shall configure your subscription plan within PayPal's sandbox environment, so that you can thoroughly test your subscription flow without any financial risk.&lt;/p&gt;

&lt;p&gt;Once your sandbox subscription setup is working properly, you need only to duplicate the steps we took from within your PayPal Business account.&lt;/p&gt;

&lt;h2&gt;
  
  
  Guide Overview
&lt;/h2&gt;

&lt;p&gt;Part 1. Get Sandbox Credentials&lt;br&gt;
Part 2. Create Subscription Product &amp;amp; Plan&lt;br&gt;
Part 3. Generate and Embed Subscription Buttons&lt;br&gt;
Part 4. Test Your Subscription Flow&lt;br&gt;
Part 5. Collect Live PayPal Subscriptions&lt;/p&gt;


&lt;h3&gt;
  
  
  Part 1. Get Sandbox Credentials
&lt;/h3&gt;

&lt;p&gt;Sign into your &lt;a href="https://developer.paypal.com" rel="noopener noreferrer"&gt;PayPal Developer&lt;/a&gt; account. If you do not have one yet, &lt;a href="https://paypal.com" rel="noopener noreferrer"&gt;sign up&lt;/a&gt; for a Business PayPal account, then navigate to the PayPal Developer site.&lt;/p&gt;

&lt;p&gt;From the &lt;a href="https://developer.paypal.com/dashboard/accounts" rel="noopener noreferrer"&gt;Developer Dashboard&lt;/a&gt;, you will grab the credentials for your sandbox accounts.&lt;/p&gt;

&lt;p&gt;PayPal has automatically created 2 sandbox accounts for you: one called &lt;strong&gt;Business&lt;/strong&gt; and the other &lt;strong&gt;Personal&lt;/strong&gt;. The &lt;strong&gt;Business&lt;/strong&gt; sandbox represents the Merchant (seller) perspective, while the &lt;strong&gt;Personal&lt;/strong&gt; sandbox account represents the buyer's perspective.&lt;/p&gt;

&lt;p&gt;For this guide, I shall refer to the Business sandbox account as the &lt;strong&gt;&lt;em&gt;Merchant&lt;/em&gt;&lt;/strong&gt; &lt;strong&gt;sandbox account&lt;/strong&gt;, to avoid clashing terms with the Business-type PayPal account that grants Developer Dashboard access. &lt;/p&gt;

&lt;p&gt;Click on the three dots to the right of each sandbox account type, then choose &lt;code&gt;View/Edit account&lt;/code&gt;. &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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqd4rg2tgwjs9k1itvlff.gif" 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqd4rg2tgwjs9k1itvlff.gif" alt="GIF showing selection of View/Edit account"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Copy the email and password for both sandbox accounts to a safe place for use later. Then sign out of your PayPal Developer account.&lt;/p&gt;


&lt;h3&gt;
  
  
  Part 2. Create Subscription Product &amp;amp; Plan
&lt;/h3&gt;

&lt;p&gt;Next, you shall create both a Subscription product and plan. The product is the item/service you are selling, while the plan governs the details of your customers' subscription to your product.&lt;/p&gt;

&lt;p&gt;Sign into &lt;a href="https://sandbox.paypal.com/signin" rel="noopener noreferrer"&gt;PayPal's Sandbox&lt;/a&gt; using your Merchant sandbox account. Navigate to &lt;strong&gt;Pay &amp;amp; Get Paid&lt;/strong&gt; =&amp;gt; &lt;strong&gt;Accept Payments&lt;/strong&gt; =&amp;gt; &lt;strong&gt;Subscriptions&lt;/strong&gt;. Select &lt;strong&gt;Subscription plans&lt;/strong&gt;, then click the button &lt;strong&gt;Create Plan&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If you already have a subscription product, select it; else, click on &lt;strong&gt;Create a subscription product&lt;/strong&gt;. For this guide, fill out just the required fields: Product name &amp;amp; Product type. The Product ID is filled automatically (unless you desire a specific product ID). Then choose your newly-created product on the next page:&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5s8wvu54z15xstbok6m1.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5s8wvu54z15xstbok6m1.png" alt="Subscription Product selection"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next, you build your Subscription Plan. For the purposes of this guide, I recommend the following features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fixed Pricing&lt;/li&gt;
&lt;li&gt;Unlimited billing cycles&lt;/li&gt;
&lt;li&gt;Billing every 1 month&lt;/li&gt;
&lt;li&gt;1 missed billing cycle before subscription paused&lt;/li&gt;
&lt;li&gt;Auto billing of outstanding payments&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  Part 3. Generate and Embed Subscription Buttons
&lt;/h3&gt;

&lt;p&gt;After configuring your subscription plan, click &lt;strong&gt;Turn Plan On&lt;/strong&gt;. PayPal then generates your Subscription buttons! 🎉 Configure your buttons to your preferred design, then click &lt;code&gt;Copy Code&lt;/code&gt;. This is the code you will paste in your application. A sample of this code is below:&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;div&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"paypal-button-container-P-1M286691T85502507MNG3SQA"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://www.paypal.com/sdk/js?client-id=AQW7aBOHsXSUZx9awY6GCwAlfDlbSvHnOwcSqLl99ZBD4CCsDaht0EAPdhYKkd3fo_Zdk8zYMFnCz7_x&amp;amp;vault=true&amp;amp;intent=subscription"&lt;/span&gt; &lt;span class="na"&gt;data-sdk-integration-source=&lt;/span&gt;&lt;span class="s"&gt;"button-factory"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
  &lt;span class="nx"&gt;paypal&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Buttons&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;shape&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;rect&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;gold&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;layout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;vertical&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;subscribe&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="na"&gt;createSubscription&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;actions&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="nx"&gt;actions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;subscription&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
          &lt;span class="na"&gt;plan_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;P-1M286691T85502507MNG3SQA&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="na"&gt;onApprove&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;actions&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;subscriptionID&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="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#paypal-button-container-P-1M286691T85502507MNG3SQA&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There are 2 &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; tags. The first &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; tag details the PayPal Software Developer Kit (SDK) that you are using, and contains your &lt;code&gt;client-id&lt;/code&gt;, which the button generator inserted automatically for you:&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;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://www.paypal.com/sdk/js?client-id=AQW7aBOHsXSUZx9awY6GCwAlfDlbSvHnOwcSqLl99ZBD4CCsDaht0EAPdhYKkd3fo_Zdk8zYMFnCz7_x&amp;amp;vault=true&amp;amp;intent=subscription"&lt;/span&gt; &lt;span class="na"&gt;data-sdk-integration-source=&lt;/span&gt;&lt;span class="s"&gt;"button-factory"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The second &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; tag confers the buttons' functionality, and also renders your Subscribe buttons at the &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; with an &lt;code&gt;id&lt;/code&gt; that starts &lt;code&gt;paypal-button-container...&lt;/code&gt;:&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;div&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"paypal-button-container-P-1M286691T85502507MNG3SQA"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Move this &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; to where you wish your buttons to be displayed. Just ensure that this location is on the SAME page as the two &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; tags.&lt;/p&gt;

&lt;p&gt;Within the &lt;code&gt;onApprove&lt;/code&gt; value in the 2nd &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; tag, you may configure the action to occur after your customers subscribe. For example, you may want to update your UI with a confirmation message. The default &lt;code&gt;onApprove&lt;/code&gt; behavior displays an alert containing the ID of the newly-activated subscription.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;onApprove&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;actions&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="nf"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;subscriptionID&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;
  
  
  Part 4. Test Your Subscription Flow
&lt;/h3&gt;

&lt;p&gt;Now for the fun part! 💃🏽 Click on the &lt;strong&gt;PayPal Subscribe&lt;/strong&gt; button within your app. A window should popup allowing you to pay with a PayPal account. Sign in with your Personal sandbox account:&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F14lzuzfsbybfzr9ugf7m.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F14lzuzfsbybfzr9ugf7m.png" alt="PayPal Sign-In Popup"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You should see details of your pending subscription purchase, with options to choose either your sandbox bank account, or sandbox credit card, for payment:&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzyor0ki4dh2k6vfkkgrj.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzyor0ki4dh2k6vfkkgrj.png" alt="PayPal Subscription Screens"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Complete the checkout flow. If you left the default behavior for &lt;code&gt;onApprove&lt;/code&gt; in place, you should see an alert popup.&lt;/p&gt;

&lt;p&gt;To verify that your sandbox subscription purchase was successful, sign into your &lt;a href="https://sandbox.paypal.com" rel="noopener noreferrer"&gt;Personal sandbox Account&lt;/a&gt; in an &lt;strong&gt;incognito&lt;/strong&gt; tab, using your Personal sandbox credentials. You should see that your sandbox account was debited by the cost of your subscription. Over in your Merchant sandbox account, you should also see that your balance has increased by the same amount! 🥳&lt;/p&gt;




&lt;h3&gt;
  
  
  Part 5. Collect Live PayPal Subscriptions
&lt;/h3&gt;

&lt;p&gt;To configure a PayPal Subscription Plan that accepts live payments, simply repeat the steps above using your PayPal Business account. Sign into &lt;a href="https://paypal.com" rel="noopener noreferrer"&gt;https://paypal.com&lt;/a&gt; (notice there is no &lt;code&gt;sandbox&lt;/code&gt; subdomain), navigate to  &lt;strong&gt;Pay &amp;amp; Get Paid&lt;/strong&gt; =&amp;gt; &lt;strong&gt;Accept Payments&lt;/strong&gt; =&amp;gt; &lt;strong&gt;Subscriptions&lt;/strong&gt; and continue the steps as above.&lt;/p&gt;

&lt;p&gt;Bear in mind that to test your live Subscription configuration, you would need an actual PayPal account (not the sandbox kind) and/or an actual credit/debit card. Also, the purchase will be real. I strongly recommend using your sandbox accounts to do all the testing and adjustments you wish, before going live with your subscription.&lt;/p&gt;

&lt;p&gt;Have fun! And get that money! 😉&lt;/p&gt;




&lt;blockquote&gt;
&lt;h4&gt;
  
  
  Join the PayPal Developer Community
&lt;/h4&gt;

&lt;p&gt;Our Developer Community members support each other in integrating PayPal technologies, contributing to open source, expanding knowledge and networks, and improving PayPal's products and documentation. We'd love to have you join us! 💙 &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Website: &lt;a href="https://developer.paypal.com" rel="noopener noreferrer"&gt;https://developer.paypal.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Twitter: &lt;a href="https://twitter.com/paypaldev" rel="noopener noreferrer"&gt;@paypaldev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Github: &lt;a href="https://github.com/paypal" rel="noopener noreferrer"&gt;@paypal&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

</description>
      <category>javascript</category>
      <category>beginners</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Feature update: Rich Content Embeds</title>
      <dc:creator>Arit Developer</dc:creator>
      <pubDate>Wed, 16 Feb 2022 21:56:51 +0000</pubDate>
      <link>https://dev.to/devteam/feature-update-rich-content-embeds-390e</link>
      <guid>https://dev.to/devteam/feature-update-rich-content-embeds-390e</guid>
      <description>&lt;p&gt;Hello DEV Community!&lt;/p&gt;

&lt;p&gt;I'm excited to announce a significant improvement in how we embed rich content (such as Tweets and Youtube videos) in Forem posts and comments.🎉&lt;/p&gt;

&lt;p&gt;Now, you need just the &lt;code&gt;embed&lt;/code&gt; keyword and the complete URL of the resource:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{% embed https://... %}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Prior to this change, we embedded rich content by using keywords specific to the type of embed being created. For example, to embed a GitHub repository, we would use the &lt;code&gt;github&lt;/code&gt; keyword and the slug to the repository:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{% github forem/forem %}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With our new approach, all you need is the complete URL to the repository:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{% embed https://github.com/forem/forem %}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Our &lt;a href="https://dev.to/p/editor_guide#liquidtags"&gt;Editor's Guide&lt;/a&gt; contains a list of supported content types. Note that embeds that were created using the former approach will still work for now. Eventually, the former approach will be deprecated.&lt;/p&gt;

&lt;p&gt;Do jump in and try this new rich-content embed approach out! Please &lt;a href="https://github.com/forem/forem/issues/new?assignees=&amp;amp;labels=&amp;amp;template=bug_report.md" rel="noopener noreferrer"&gt;report&lt;/a&gt; any bugs you may encounter - thanks!&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://forem.dev/foremteam/changelog-a-new-and-streamlined-way-to-embed-rich-content-4h58" rel="noopener noreferrer"&gt;Forem.dev&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>changelog</category>
      <category>ux</category>
    </item>
    <item>
      <title>Getting My Groove Back, and Surviving Dysfunctional Startups</title>
      <dc:creator>Arit Developer</dc:creator>
      <pubDate>Sun, 28 Nov 2021 23:39:42 +0000</pubDate>
      <link>https://dev.to/aritdeveloper/getting-my-groove-back-and-surviving-dysfunctional-startups-mbc</link>
      <guid>https://dev.to/aritdeveloper/getting-my-groove-back-and-surviving-dysfunctional-startups-mbc</guid>
      <description>&lt;p&gt;Hello there! 👋🏾&lt;/p&gt;

&lt;p&gt;Y'all are spoiling me with your support; I received several encouraging responses to my last newsletter. I’m grateful! 🧡&lt;/p&gt;

&lt;p&gt;Ok! Jump in below, and enjoy! 😉&lt;/p&gt;

&lt;p&gt;PS &lt;a href="https://calendly.com/arit"&gt;My Calendly&lt;/a&gt; is open again for anyone needing tech career counsel.&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;To enjoy content like this in your inbox, subscribe to the Arit Developer newsletter &lt;a href="https://news.arit.dev"&gt;HERE&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  How Arit Got Her Groove Back 💃🏽
&lt;/h3&gt;

&lt;p&gt;I just completed my first project after quitting a huge one (&lt;a href="https://news.arit.dev/p/quitting-at-work-and-normalizing-burnout-conversations-677391"&gt;click here&lt;/a&gt; if you missed that!). This recent project was more than a mental breather; it was my opportunity to return to feeling like a capable coder who can implement a feature or task from start-to-finish, at a high quality standard. With this new project, I aimed to apply all the competencies I had gained from the last project, and I was also looking forward to learning something new. ✨&lt;/p&gt;

&lt;p&gt;In a nutshell, this project called for the refactor of &lt;a href="https://dev.to"&gt;Forem&lt;/a&gt;‘s Sidebar. Currently, he sidebar displays up to 5 navigation links, with a &lt;code&gt;More...&lt;/code&gt; button underneath; if there are more than 5 navigation links, clicking this &lt;code&gt;More...&lt;/code&gt; button reveals the remaining links. The refactor called for two distinct sections within the sidebar, and all navigation links divvied up between these 2 sections. The &lt;code&gt;More...&lt;/code&gt; button was to be deprecated.&lt;/p&gt;

&lt;p&gt;My first step was to &lt;a href="https://github.com/forem/forem/pull/14213"&gt;implement those project aspects&lt;/a&gt; that wouldn’t affect the user-experience on the front-end:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;add a section column to the navigation_links table&lt;/li&gt;
&lt;li&gt;set a default section value&lt;/li&gt;
&lt;li&gt;backfill the section column for existing links&lt;/li&gt;
&lt;li&gt;ensure that changes to a link’s section persisted to the database&lt;/li&gt;
&lt;li&gt;write/update relevant tests&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;My next step was to &lt;a href="https://github.com/forem/forem/pull/14292/files"&gt;implement the user-facing aspects&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;update the sidebar to display the 2 sections with their links&lt;/li&gt;
&lt;li&gt;update the admin portal (where links are managed) to display the 2 sections as well&lt;/li&gt;
&lt;li&gt;write/update relevant tests&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;During review of my second pull request, my teammate Suzanne left several useful suggestions for enhancing my code’s accessibility. I welcomed her contributions because I do want to improve my accessibility skills.&lt;/p&gt;

&lt;p&gt;With this project done, and with my groove back and humming along nicely, I’m ready to tackle another large project: refactoring all &lt;code&gt;Save Confirmation&lt;/code&gt; functionality in our app. This should be good! 😅&lt;/p&gt;




&lt;h3&gt;
  
  
  Functioning Well At A Dysfunctional Startup
&lt;/h3&gt;

&lt;p&gt;Some time ago, an early-career developer (let’s call them Carey) scheduled a 1:1 chat with me to discuss difficulties they were having at their first (remote) tech job. I looked forward to our talk because I wanted to do all I could to encourage them, and give them practical tools to navigate their situation.&lt;/p&gt;

&lt;p&gt;Carey shared that they worked at an early-stage startup, completely bootstrapped with no short-term plans for venture fund-raising. When they got the job, Carey could hardly contain their excitement! Before their start date, Carey prepared their household, created a schedule and set up their home office, all the while oscillating between anticipation, exhilaration and nervousness.&lt;/p&gt;

&lt;p&gt;Fast-forward to the present, and Carey almost regrets taking the job. The first issue they experienced was the &lt;strong&gt;total lack of project management among the developers&lt;/strong&gt;. Carey was almost in tears as they recounted to me how their code had been overwritten several times by other engineers, only to be asked by the team lead to redo the work. What’s worse, the developers over-writing Carey’s code never acknowledged their actions or expressed any remorse over Carey having to re-code their work.&lt;/p&gt;

&lt;p&gt;Another issue Carey faces is a &lt;strong&gt;company culture that revolves entirely around those employees who were all friends before the startup was established&lt;/strong&gt;. Workers outside of this friendship-circle (Carey included) often feel marginalized or ignored, and there are virtually no regularly-held rapport-building activities. Compounding the situation is the fact that many of the company’s decisions appear to benefit this friendship-circle the most, before other team members are considered. For Carey, this atmosphere extends to their relationship with their manager, who apparently &lt;strong&gt;lacks the power to sponsor or advocate&lt;/strong&gt; for Carey to any meaningful degree, and often replies to Carey’s requests with: &lt;em&gt;I’ll check with  and get back to you&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;I was happy to be Carey’s sounding board because I believe that, especially in the tech industry, &lt;strong&gt;feeling safe enough to vent and emote authentically is vital to career health and progress&lt;/strong&gt;. I asked Carey what their immediate career goals were; they replied that they’d like to get a solid 9-12 months of work experience before hunting for a new job. So I shared the following counsel for the rest of their time at the company:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Document Work and Communication:&lt;/strong&gt; as long as the issue of over-written work continued (without explanation or accountability), I advised Carey to keep records of their work, as proof of their output. I also advised them to follow all verbal communication up with an email summarizing the convo’s key points, as a way of documenting decisions and agreements.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Maintain Boundaries:&lt;/strong&gt; I encouraged Carey not to feel obligated to work overtime or outside of work hours, in order to protect the rest of their life and mental health. I advised them to block off hours in their work calendar to show when they were unavailable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Keep Network Warm:&lt;/strong&gt; even though they were not actively job-hunting, I advised Carey to start warming up their professional contacts; an example of such is to email/text/tweet your contact about whether their company is hiring.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Protect Sense of Professional Worth:&lt;/strong&gt; in a work environment like Carey’s, it is so easy to start feeling incompetent, especially as a first-time developer. I advised Carey to stay involved with other coding communities (like healthy opensource projects) where they could feel better supported, and contribute meaningfully.&lt;/p&gt;

&lt;p&gt;You may wonder why I did not advise Carey to “fight” the issues they were experiencing. &lt;strong&gt;Simply put: I don’t think it is their problem.&lt;/strong&gt; Carey, as a first-time developer, is at the point of their career where they need to focus on their technical growth and opportunities that provide for this. Period. In my humble opinion, becoming distracted with the clearly chronic problems that this company manifests would be a mistake for Carey.&lt;/p&gt;

&lt;p&gt;Carey’s experience is a cautionary tale about how transitioning to a coding career is not always pleasant. What do you think about their experience and my counsel on how to deal? I would love to hear your thoughts - please comment below!&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Photo Credit: Unknown; please comment owner below and I will credit appropriately&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Quitting At Work, and Normalizing Burnout Conversations</title>
      <dc:creator>Arit Developer</dc:creator>
      <pubDate>Wed, 24 Nov 2021 23:52:25 +0000</pubDate>
      <link>https://dev.to/aritdeveloper/quitting-at-work-and-normalizing-burnout-conversations-c6g</link>
      <guid>https://dev.to/aritdeveloper/quitting-at-work-and-normalizing-burnout-conversations-c6g</guid>
      <description>&lt;p&gt;Well, well! This piece reads like a bit of a downer doesn’t it? 😅&lt;/p&gt;

&lt;p&gt;Still, I wanted to share some not-so-glamorous sides of the developer experience (mine included). I believe that being able to feel, accept, process and channel negative experiences, is a vital skill. I hope you enjoy. 🤎&lt;/p&gt;

&lt;p&gt;PS &lt;a href="https://calendly.com/arit/"&gt;My Calendly&lt;/a&gt; is open again for anyone needing tech career guidance. 🎉&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;To enjoy content like this in your inbox, subscribe to the &lt;strong&gt;Arit Developer&lt;/strong&gt; newsletter &lt;a href="https://news.arit.dev"&gt;HERE&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  I Quit A Work Project... And I Felt like Sh*t
&lt;/h3&gt;

&lt;p&gt;Several months ago, I took on a large project &lt;a href="https://forem.com/"&gt;at work&lt;/a&gt;. In summary, my task was to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Migrate the data within ~25 columns from one table, and split them between 2 new tables. There were over 650,000 discrete records that would be affected.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update all related business logic within dozens of files in the backend, so that they read from the 2 new tables, no longer the old.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update all related tests.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Huge task. But I was excited; I had several team members available to help if I got stuck, so I believed I would just advance systematically through each part of the project.&lt;/p&gt;

&lt;h4&gt;
  
  
  Things Get Messy
&lt;/h4&gt;

&lt;p&gt;I was wrong. Even though I divided the work into parts and sections that made sense implementation-wise, I ended up with an &lt;a href="https://github.com/forem/forem/pull/13904"&gt;enormous pull-request&lt;/a&gt; that had over 100 commits, 77 changed files and 60+ comments.&lt;/p&gt;

&lt;p&gt;So many parts of the app were broken. So I put my head down and fixed each break, only to have other parts break in turn. I kept going, but by this time, I was not enjoying the process anymore. I ran out of bandwidth for my other responsibilities (like reviewing my teammates’ work, or fulfilling opensource duty). This one project consumed me.&lt;/p&gt;

&lt;p&gt;The teammates designated to help me were indeed helpful. However, because they weren’t working with me on the project, catching them up with my recent changes became tedious, and they had to do significant amounts of context-switching each time.&lt;/p&gt;

&lt;h4&gt;
  
  
  My Breaking Point
&lt;/h4&gt;

&lt;p&gt;Eventually I fixed all the broken code. Then came the task of fixing the tests. In hindsight, leaving the tests until the end of implementation was my biggest mistake, because I had lost track of the sources of the breaks in each test. One day, as dozens of tests kept failing despite my best efforts to remedy them, I reached my breaking point, called my manager and said:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I’m done. I have nothing left.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;My supportive manager agreed to pass the project onto a more senior developer for completion. I remained engaged by reviewing their work, which allowed me to understand what still needed to be done. When the pull request was finally merged, I was palpably relieved.&lt;/p&gt;

&lt;p&gt;Then the fallout began. I was physically tired; experiencing aches and spasms in my shoulders and back. I was mentally tired; for the first time since I wrote my first line of Ruby, I woke up NOT looking forward to coding.&lt;/p&gt;

&lt;p&gt;I felt like such a failure.&lt;/p&gt;

&lt;p&gt;Why couldn’t I just keep pushing through to the end?&lt;/p&gt;

&lt;p&gt;Why did I grow so tired? Why did I miss all these small mistakes?&lt;/p&gt;

&lt;p&gt;Will I ever become a senior developer?&lt;/p&gt;

&lt;h4&gt;
  
  
  Rest &amp;amp; Recovery
&lt;/h4&gt;

&lt;p&gt;Speaking with my manager and mentors helped me start processing what really happened, not just how I felt about what happened:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Arit, you took that project 90% of the way - that is a victory!&lt;/p&gt;

&lt;p&gt;What you needed was more dedicated support, which was on leadership, not on you.&lt;/p&gt;

&lt;p&gt;This one project is NOT an indicator of your ability; the scope was huge, the finish-line kept extending and you were exhausted.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Now a week or two out from the experience, I’m feeling better.&lt;/p&gt;

&lt;p&gt;I’ve taken smaller-scoped tasks with clearly-defined technical implementation steps. I’m working … no, breezing through them now, applying the competencies I gained from my last project.&lt;/p&gt;

&lt;p&gt;I’m remembering that, yes, I can code and I love coding.&lt;/p&gt;

&lt;p&gt;Eventually I will achieve the technical proficiency &amp;amp; staying power necessary for complex, multi-month projects.&lt;/p&gt;

&lt;p&gt;One line at a time, yeah? 🥰&lt;/p&gt;




&lt;h3&gt;
  
  
  Breaking Burnout Down
&lt;/h3&gt;

&lt;p&gt;My mentor &lt;a href="https://twitter.com/vaidehijoshi"&gt;Vaidehi Joshi&lt;/a&gt; wrote a thought-provoking thread about burnout in a professional setting. Here is her thread’s first tweet:&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1414652532014522373-39" src="https://platform.twitter.com/embed/Tweet.html?id=1414652532014522373"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1414652532014522373-39');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1414652532014522373&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;After the project I wrote about above, taking some time off was presented as a way to help recover from my fatigue.&lt;/p&gt;

&lt;p&gt;However, I didn’t feel like that was a fitting solution, because my fatigue was not merely related to work-volume. Rather, it resulted from feeling increasingly inadequate as I worked to fix code-breaks that kept popping up like whack-a-moles.&lt;/p&gt;

&lt;p&gt;A better solution for me was to choose work that restored my sense of competence and self-efficacy. Once I did, my vigor and interest returned. But if I wasn’t clear on the source of my fatigue, I probably wouldn’t have been able to identify a suitable solution.&lt;/p&gt;

&lt;p&gt;Particularly in the tech industry, I think we need to further normalize conversations around burnout.&lt;/p&gt;

&lt;p&gt;We should empower each other to express feelings of burnout, and support identifying, naming &amp;amp; addressing the true sources of our burnout. We also need to permanently retire beliefs that equate burnout with not being fit for the job.&lt;/p&gt;

&lt;p&gt;Thank you, Vaidehi, for your thought-leadership! 🤎&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Photo Credit: Liza Summer on Pexels&lt;/em&gt;&lt;/p&gt;

</description>
      <category>career</category>
      <category>burnout</category>
      <category>quitting</category>
    </item>
    <item>
      <title>The Joy Of Empowering Others</title>
      <dc:creator>Arit Developer</dc:creator>
      <pubDate>Tue, 02 Nov 2021 23:59:22 +0000</pubDate>
      <link>https://dev.to/aritdeveloper/the-joy-of-empowering-others-3kbh</link>
      <guid>https://dev.to/aritdeveloper/the-joy-of-empowering-others-3kbh</guid>
      <description>&lt;p&gt;I’ve had the privilege of speaking at a few events this year. I linked a couple of them below.&lt;/p&gt;

&lt;p&gt;I don’t think I can ever tire of encouraging those who wish to break into software development! Several people who’ve listened to these talks have reached out, sharing how they related to my journey, and the resulting motivation they received. When it comes to tech: the more, the merrier !&lt;/p&gt;

&lt;p&gt;🎙 ThunderNerds - &lt;a href="https://www.thundernerds.io/2021/05/empowering-women-in-tech-with-arit-amana/"&gt;Empowering Women In Tech&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🎙 CodeNewbie - &lt;a href="https://www.codenewbie.org/podcast/what-it-s-like-to-break-into-tech-as-a-mother/"&gt;Breaking Into Tech As A Mother&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1407043780813938693-531" src="https://platform.twitter.com/embed/Tweet.html?id=1407043780813938693"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1407043780813938693-531');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1407043780813938693&amp;amp;theme=dark"
  }



&lt;br&gt;
&lt;iframe class="tweet-embed" id="tweet-1403064905771614208-953" src="https://platform.twitter.com/embed/Tweet.html?id=1403064905771614208"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1403064905771614208-953');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1403064905771614208&amp;amp;theme=dark"
  }



&lt;/p&gt;




&lt;h3&gt;
  
  
  It's A Wrap!
&lt;/h3&gt;

&lt;p&gt;Whew! We wrapped Cycle 2 of my nonprofit &lt;a href="https://ourtimefortech.org"&gt;Our Time For Tech&lt;/a&gt; up at the end of May. I am so proud of our 7 fellows and their accomplishments!&lt;/p&gt;

&lt;p&gt;Our CodeCollab fellows completed the MVP of their ShiftWork app, and &lt;a href="https://us02web.zoom.us/rec/share/2iQMA6qbRTKoXz25phHeiXYOlq30OpVYAVSnquhBR4V_GC2ryUdkSNEOVIEpg1xq.S2rtluXeMkBwfpMS"&gt;demoed it for the tech community&lt;/a&gt; (password: XJE*PnA9).&lt;/p&gt;

&lt;p&gt;Our BetterPrep fellows landed their first-ever dev jobs 🎉 or built skills and fortitude to better weather their job searches.&lt;/p&gt;

&lt;p&gt;I’m currently retro-ing the Cycle 2 experience and using what I learn to plan for 2022. If you know anyone that may be interested in what we offer, invite them to join the Arit Developer newsletter so they can stay updated on future programs.&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;To enjoy content like this in your inbox, subscribe to the &lt;strong&gt;Arit Developer&lt;/strong&gt; newsletter &lt;a href="https://news.arit.dev"&gt;HERE&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>beginners</category>
      <category>codenewbie</category>
      <category>career</category>
    </item>
    <item>
      <title>Announcing Demo Day! 🎉</title>
      <dc:creator>Arit Developer</dc:creator>
      <pubDate>Wed, 05 May 2021 17:18:02 +0000</pubDate>
      <link>https://dev.to/ourtimefortech/announcing-demo-day-c4c</link>
      <guid>https://dev.to/ourtimefortech/announcing-demo-day-c4c</guid>
      <description>&lt;p&gt;For almost 12 weeks, as part of our CodeCollab track, early-career developers Timi (&lt;a class="mentioned-user" href="https://dev.to/timilehin08"&gt;@timilehin08&lt;/a&gt;), Gabrielle (&lt;a class="mentioned-user" href="https://dev.to/gabrielleeaston"&gt;@gabrielleeaston&lt;/a&gt;), Sara (&lt;a class="mentioned-user" href="https://dev.to/saradotlog"&gt;@saradotlog&lt;/a&gt;) and Cam (&lt;a class="mentioned-user" href="https://dev.to/dordsichord"&gt;@dordsichord&lt;/a&gt;) have been building The Shiftwork App from scratch.&lt;/p&gt;

&lt;p&gt;The process has been exciting. 🥳&lt;/p&gt;

&lt;p&gt;It has also been challenging. 😭&lt;/p&gt;

&lt;p&gt;Above all, this project has expanded the team's technical, communication and collaborations skills like never before. &lt;/p&gt;

&lt;p&gt;On March 27th, the team shall present The Shiftwork App at Our Time For Tech's first-ever Demo Day!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;And YOU are invited!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.tickettailor.com/events/ourtimefortech/519355"&gt;&lt;strong&gt;Grab a free ticket here&lt;/strong&gt;&lt;/a&gt; and please show up to support our hard-working fellows! 🙏🏾&lt;/p&gt;

&lt;p&gt;At the virtual event, the team will summarize the app's features, share on what they learned and how they grew, and entertain questions from the audience.&lt;/p&gt;

&lt;p&gt;We hope you will join us! 🧡&lt;/p&gt;

</description>
      <category>womenintech</category>
      <category>codenewbie</category>
      <category>rails</category>
    </item>
    <item>
      <title>Empowering female developers!</title>
      <dc:creator>Arit Developer</dc:creator>
      <pubDate>Thu, 04 Feb 2021 02:06:42 +0000</pubDate>
      <link>https://dev.to/aritdeveloper/empowering-female-developers-50fa</link>
      <guid>https://dev.to/aritdeveloper/empowering-female-developers-50fa</guid>
      <description>&lt;p&gt;Hello Dev Community!&lt;/p&gt;

&lt;p&gt;I'd like to introduce &lt;a href="https://ourtimefortech.org"&gt;Our Time For Tech&lt;/a&gt;, my nonprofit tech-empowerment initiative founded to help women-in-Tech level up professionally.&lt;/p&gt;

&lt;p&gt;Right now, we support &lt;strong&gt;female aspiring, career-changing or early-career developers&lt;/strong&gt;. We offer two 12-week programs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CodeCollab:&lt;/strong&gt; &lt;em&gt;Real-world experience building web applications&lt;/em&gt; as part of a team, with a senior engineer guiding the process&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;BetterPrep:&lt;/strong&gt; Accountability, mock interviewing, live-coding practice and structured support &lt;em&gt;while job-hunting&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://ourtimefortech.org/#apply"&gt;Applications are now open&lt;/a&gt; for Cycle 2 (which starts in March).&lt;/p&gt;

&lt;p&gt;The cost is a one-time $250 enrollment fee. We have limited scholarships for applicants who can demonstrate financial need.&lt;/p&gt;

&lt;p&gt;Please inbox me or &lt;a href="https://twitter.com/aritamana"&gt;DM me on Twitter&lt;/a&gt; if you have questions. I hope to see you in Cycle 2. And share with your networks, thanks! 🙏&lt;/p&gt;

</description>
      <category>empowerment</category>
      <category>support</category>
      <category>womenintech</category>
      <category>career</category>
    </item>
    <item>
      <title>Introducing Our Time For Tech on Dev.To</title>
      <dc:creator>Arit Developer</dc:creator>
      <pubDate>Thu, 31 Dec 2020 01:23:16 +0000</pubDate>
      <link>https://dev.to/ourtimefortech/introducing-our-time-for-tech-on-dev-to-nmi</link>
      <guid>https://dev.to/ourtimefortech/introducing-our-time-for-tech-on-dev-to-nmi</guid>
      <description>&lt;p&gt;Hello! 👋🏾&lt;/p&gt;

&lt;p&gt;I'd like to introduce the &lt;strong&gt;Our Time For Tech&lt;/strong&gt; organization on Dev.To.&lt;/p&gt;

&lt;p&gt;At Our Time For Tech, we empower the careers of women-in-Tech. We have 2 tracks: &lt;strong&gt;CodeCollab&lt;/strong&gt; and &lt;strong&gt;Better Prep&lt;/strong&gt;. Read more about these tracks &lt;a href="https://ourtimefortech.org"&gt;on our website&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;On Dev.To, our fellows shall be sharing what they're learning during their time with us. I'm excited to witness their breakthroughs, share their frustrations and celebrate their commitment to advancing their Tech careers! 🧡&lt;/p&gt;

&lt;p&gt;So keep watching this space! And, hey, if you think Our Time For Tech can help you, please &lt;a href="https://ourtimefortech.org/#apply"&gt;join our mailing list&lt;/a&gt;, so we can alert you when applications for Cycle 2 open! 🎉&lt;/p&gt;

</description>
      <category>womenintech</category>
      <category>mentorship</category>
      <category>support</category>
      <category>breakintotech</category>
    </item>
  </channel>
</rss>
