<?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: dante</title>
    <description>The latest articles on DEV Community by dante (@danteisshipping).</description>
    <link>https://dev.to/danteisshipping</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%2F2823260%2F4c27ef1b-976b-4d25-9add-43eb50aa3875.jpeg</url>
      <title>DEV Community: dante</title>
      <link>https://dev.to/danteisshipping</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/danteisshipping"/>
    <language>en</language>
    <item>
      <title>[2025]How to Integrate Stripe Payments for your website: Step-By-Step Guide</title>
      <dc:creator>dante</dc:creator>
      <pubDate>Thu, 27 Feb 2025 13:22:56 +0000</pubDate>
      <link>https://dev.to/danteisshipping/2025how-to-integrate-stripe-payments-for-your-website-step-by-step-guide-40a0</link>
      <guid>https://dev.to/danteisshipping/2025how-to-integrate-stripe-payments-for-your-website-step-by-step-guide-40a0</guid>
      <description>&lt;p&gt;Implementing payment processing is often one of the most challenging aspects of building a SaaS application. In this guide, I'll walk you through integrating Stripe with ShipNowKit, a powerful Next.js SaaS starter kit that makes payment integration surprisingly straightforward.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting Started with Stripe
&lt;/h2&gt;

&lt;p&gt;Before diving into the code, you'll need to set up your Stripe account:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Sign up for a &lt;a href="https://stripe.com/" rel="noopener noreferrer"&gt;Stripe account&lt;/a&gt; and activate payments&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Access your API keys from the &lt;a href="https://dashboard.stripe.com/apikeys" rel="noopener noreferrer"&gt;Developer Console&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Tip: Always start with the &lt;a href="https://dashboard.stripe.com/test/apikeys" rel="noopener noreferrer"&gt;test environment&lt;/a&gt; during development.&lt;/p&gt;
&lt;/blockquote&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%2Fvql1lb8uy2j6ndgdbbg0.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%2Fvql1lb8uy2j6ndgdbbg0.png" alt="Stripe API Keys" width="800" height="411"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting Up Stripe Webhooks
&lt;/h2&gt;

&lt;p&gt;Webhooks are crucial for receiving real-time event notifications from Stripe, such as payment confirmations and subscription updates. ShipNowKit also relies on webhooks for price synchronization.&lt;/p&gt;

&lt;p&gt;To set up your Webhook:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Navigate to the Webhooks section in your Stripe Dashboard
&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%2Fy40fscdmqb5mv0nf4e0e.png" alt="image.png" width="800" height="412"&gt;
&lt;/li&gt;
&lt;li&gt;Click "Add destination"
&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%2F39ck0lu9ayzn9b8kyt6y.png" alt="image.png" width="800" height="407"&gt;
&lt;/li&gt;
&lt;li&gt;Select the events you want to listen for (ShipNowKit needs  events as screenshot chose)
&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%2Fztze22a80tlk587cmxcv.png" alt="image.png" width="800" height="409"&gt;
&lt;/li&gt;
&lt;li&gt;Enter your webhook URL
&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%2Fuy5ai4x1jqugei2hudf1.png" alt="image.png" width="800" height="407"&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%2Fc6a7ug02cjo2uwcr00g9.png" alt="image.png" width="800" height="408"&gt;
&amp;gt; For ShipNowKit, it's always the endpoint like &lt;code&gt;https://[YOUR_DOMAIN]/api/payment/stripe/webhooks&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Save your webhook signing secret
&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%2F2fofgr4aagpvlbmti3lr.png" alt="image.png" width="800" height="410"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Configuring ShipNowKit with Your Stripe Keys
&lt;/h2&gt;

&lt;p&gt;After completing the steps above, you'll have three important keys:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;SECRET_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;sk_test_51Qdxxxxx
&lt;span class="nv"&gt;PUBLISHABLE_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;pk_test_51Qxxxx
&lt;span class="nv"&gt;WEBHOOK_SECRET&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;whsec_ytScyxxxx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now let's configure ShipNowKit:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Set Stripe as your payment provider in &lt;code&gt;config/index.ts&lt;/code&gt;:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="nx"&gt;paymentConfig&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="nx"&gt;PaymentConfig&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;paymentProvider&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;stripe&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Add your Stripe environment variables to your &lt;code&gt;.env&lt;/code&gt; file:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;STRIPE_SECRET_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;sk_test_51Qdxxxxx
&lt;span class="nv"&gt;NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;pk_test_51Qxxxx
&lt;span class="nv"&gt;STRIPE_WEBHOOK_SECRET&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;whsec_ytScyxxxx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Remember to restart your development server after updating environment variables for the changes to take effect.&lt;/p&gt;

&lt;h2&gt;
  
  
  Price Configuration
&lt;/h2&gt;

&lt;p&gt;Now it's time to create your products and pricing tiers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create Product in Stripe Dashboard
&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%2F6t28gd347ngtcesj86eo.png" alt="image.png" width="800" height="412"&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%2Fxpde9ihreblp1ald9851.png" alt="image.png" width="800" height="408"&gt;
&lt;/li&gt;
&lt;li&gt;Save and get the Price ID
&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%2F5eihz26kpz81whrv1mxx.png" alt="image.png" width="800" height="410"&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%2Fqc2wlnwtejckuyuzcvnr.png" alt="image.png" width="800" height="409"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Important&lt;/strong&gt;: After updating a product, the price will automatically synchronize to your project database through the webhook you configured earlier.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Configure price components
ShipNowKit offers many kinds of price components. Each  price component  has a &lt;code&gt;priceId&lt;/code&gt; field. Let’s take &lt;code&gt;ShipNow&lt;/code&gt; price component as an example.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// components/price/ShipNow.tsx&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;PriceCardProps&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;features&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;[];&lt;/span&gt;
    &lt;span class="nl"&gt;price&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;priceId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nl"&gt;isSubscription&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;boolean&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="nl"&gt;buttonText&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;ShipNowPriceProps&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;subTitle&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;card&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;PriceCardProps&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;After configuring, update the code and restart the service, you can see the updated amount and currency on the page.&lt;br&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%2Fpisgnypwfhkwkdhijkuj.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%2Fpisgnypwfhkwkdhijkuj.png" alt="image.png" width="800" height="390"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best Practice&lt;/strong&gt;: It's recommended to configure the &lt;code&gt;priceId&lt;/code&gt; variable as an environment variable, so you don't need to modify the code when switching &lt;code&gt;priceId&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  Handling Payment Events
&lt;/h2&gt;

&lt;p&gt;ShipNowKit provides a convenient EventEmitter class that abstracts Stripe's complex event system into simple, easy-to-understand events:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Register event handlers in app/api/payment/eventEmitter.ts&lt;/span&gt;
&lt;span class="nx"&gt;eventEmitter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;subscription.succeeded&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&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;eventId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&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="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Handle new subscription&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Subscription &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="s2"&gt; succeeded`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;eventEmitter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;subscription.renewed&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&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;eventId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&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="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Handle subscription renewal&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Subscription &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="s2"&gt; renewed`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;eventEmitter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;subscription.plan_updated&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&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;eventId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&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="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Handle plan upgrades/downgrades&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Subscription &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="s2"&gt; updated: &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;oldPriceId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; -&amp;gt; &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;newPriceId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;eventEmitter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;payment.succeeded&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&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;eventId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;paymentId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Handle successful one-time payment&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Payment &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;paymentId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; succeeded`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;eventEmitter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;subscription.canceled&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&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;eventId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&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="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Handle subscription cancellation&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Subscription &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="s2"&gt; canceled`&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;This approach is significantly more developer-friendly than handling Stripe's raw webhook events directly.&lt;/p&gt;

&lt;h2&gt;
  
  
  About ShipNowKit
&lt;/h2&gt;

&lt;p&gt;ShipNowKit is a comprehensive Next.js 15 &amp;amp; React 19 SaaS starter kit designed to help developers ship products faster. If you've ever spent days or even weeks setting up the "basics" for your SaaS application, ShipNowKit was built with you in mind.&lt;/p&gt;

&lt;h3&gt;
  
  
  What's Included in ShipNowKit:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Next.js 15 Framework with the latest App Router architecture&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Flexible Authentication supporting multiple providers including social login and magic links&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Unified Payment System that works with both Stripe and Paddle&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ready-to-Use Templates for landing pages, auth flows, and payment screens&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Email Integration with professional React-powered templates&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;SEO Optimization built-in for better discoverability&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;TypeScript Enhanced for end-to-end type safety&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Multiple Database Support via Prisma ORM&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;"Ship Now, Earn Now" -  get your SaaS off the ground quickly so you can start generating revenue faster.&lt;/p&gt;

&lt;p&gt;For more information about ShipNowKit, visit &lt;a href="https://www.shipnowkit.com/docs" rel="noopener noreferrer"&gt;documentation&lt;/a&gt; or check out  &lt;a href="https://www.shipnowkit.com/templates" rel="noopener noreferrer"&gt;available templates&lt;/a&gt;. &lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>tutorial</category>
      <category>devops</category>
    </item>
    <item>
      <title>(2025) How to Get Your Paddle Account Approved in 48 Hours?</title>
      <dc:creator>dante</dc:creator>
      <pubDate>Sun, 09 Feb 2025 09:44:12 +0000</pubDate>
      <link>https://dev.to/danteisshipping/2025-how-to-get-your-paddle-account-approved-in-48-hours-277a</link>
      <guid>https://dev.to/danteisshipping/2025-how-to-get-your-paddle-account-approved-in-48-hours-277a</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;the article first published in &lt;a href="https://shipnowkit.com/docs/blog/paddle-account-apply-guide" rel="noopener noreferrer"&gt;ShipNowKit&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Getting approved for a Paddle merchant account might seem daunting for individual developers. But with the right preparation, you can complete the process in just 1-2 days. This guide walks you through every step to ensure a smooth approval process.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Choose Paddle for Your Payment Processing?
&lt;/h2&gt;

&lt;p&gt;Before diving into the application process, let's understand why Paddle is an excellent choice for developers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Individual Developer Friendly&lt;/strong&gt;: Unlike many payment processors, Paddle actively welcomes individual developers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Global Payment Support&lt;/strong&gt;: Accept payments worldwide with multiple payment methods&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tax Handling&lt;/strong&gt;: Automated VAT/GST handling and compliance&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quick Integration&lt;/strong&gt;: Simple API and ready-to-use checkout solutions&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What You Need Before Applying
&lt;/h2&gt;

&lt;p&gt;To ensure a smooth approval process, prepare these essentials:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A professional website with:

&lt;ul&gt;
&lt;li&gt;Clear product/service description&lt;/li&gt;
&lt;li&gt;Terms of Service page&lt;/li&gt;
&lt;li&gt;Privacy Policy page&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Business domain email address&lt;/li&gt;
&lt;li&gt;Valid passport for identity verification&lt;/li&gt;
&lt;li&gt;Verify that your product complies with &lt;a href="https://www.paddle.com/help/start/intro-to-paddle/what-am-i-not-allowed-to-sell-on-paddle" rel="noopener noreferrer"&gt;Paddle's acceptable use policy&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Helpful Resources:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Need Terms of Service and Privacy Policy templates? Check our &lt;a href="https://shipnowkit.com/docs/Tutorials/policies" rel="noopener noreferrer"&gt;policy generation guide&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Looking for a free business email? Follow our &lt;a href="https://shipnowkit.com/docs/blog/zoho-free-email-setup-guide" rel="noopener noreferrer"&gt;Zoho Mail setup guide&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Phase 1: Registration (15-20 minutes)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Initial Sign-up
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Visit the &lt;a href="https://login.paddle.com/signup" rel="noopener noreferrer"&gt;Paddle registration page&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Select your product type (e.g., SaaS subscription software)
&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%2F3atpabvw93zmb1zkha4n.png" alt="image.png" width="800" height="410"&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Account Information
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Enter your name (matching your passport)&lt;/li&gt;
&lt;li&gt;Use your business domain email
&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%2Fi11ouwy7viy3rhai7n2u.png" alt="image.png" width="800" height="412"&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Business Details
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Enter your business name (this will be visible to customers)&lt;/li&gt;
&lt;li&gt;Select "Individual" for Business Type&lt;/li&gt;
&lt;li&gt;Complete remaining fields as applicable
&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%2Fivcu23sup9iveqzjt927.png" alt="image.png" width="800" height="410"&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Address Information
&lt;/h3&gt;

&lt;p&gt;Provide your accurate physical address&lt;br&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%2Fz30a3ctxo8uz19p365ap.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%2Fz30a3ctxo8uz19p365ap.png" alt="image.png" width="800" height="409"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Phase 2: Account Verification (1-2 business days)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Email Verification
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Check your business email for verification message&lt;/li&gt;
&lt;li&gt;Click "Confirm Your Account" link
&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%2F8n61mqegg1t3ydnpveqv.png" alt="image.png" width="800" height="393"&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Website Verification
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Navigate to "Verify account" in the dashboard&lt;/li&gt;
&lt;li&gt;Click "Submit website"
&amp;gt; Ensure your website includes Terms of Service and Privacy Policy pages.
&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%2F368g5itqii4mqcfu45m5.png" alt="image.png" width="800" height="412"&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%2F79gjc8xykesemti4a3e3.png" alt="image.png" width="800" height="412"&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;After submission, you'll need to wait for PADDLE to conduct an initial review of your website. They will typically notify you via email within one business day.&lt;/p&gt;

&lt;h2&gt;
  
  
  Phase 3: Identity Verification (2-3 business days)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Identity Check
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Wait for identity verification email from Paddle&lt;/li&gt;
&lt;li&gt;Click "Verify my identity" link&lt;/li&gt;
&lt;li&gt;Follow the verification process with your passport
&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%2Fx5sdolu7mkr5d6cmsh3o.png" alt="image.png" width="800" height="423"&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Final Review
&lt;/h3&gt;

&lt;p&gt;If the identity verification is successful, Paddle will send a confirmation email. We no longer need to fill in any information, just wait for Paddle's final review.&lt;br&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%2F4zdgasfz1bcihn1grd1v.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%2F4zdgasfz1bcihn1grd1v.png" alt="image.png" width="800" height="377"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once approved, you'll receive a confirmation email and can begin integrating Paddle payments&lt;br&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%2Fmxx7qb7xih1393exbktt.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%2Fmxx7qb7xih1393exbktt.png" alt="image.png" width="800" height="392"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Ready to start accepting global payments?&lt;/strong&gt; Follow this guide to set up your Paddle account today. For any questions, feel free to comment below or reach out to us directly.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>payments</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
