<turbo-stream action="append" target="posts_list"><template>    <div class="postbit" id="380391" data-post-id="380391">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="eileennoonan" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/eileennoonan/120/36180_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  eileennoonan
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Spark is what generates this very simple DSL for the WebhookHandler module:</p>
<pre data-code-wrap="elixir"><code class="lang-elixir">defmodule MyApp.StripeWebhookHandlers do
  use PinStripe.WebhookHandler

  handle "customer.created", MyApp.StripeWebhookHandlers.CustomerCreated

  handle "customer.updated", fn data -&gt; 
    // do stuff
  end 
end
</code></pre>
<p>That part is actually not in the Dashbit blog. They just do:</p>
<pre data-code-wrap="elixir"><code class="lang-elixir">defmodule TeamsWeb.StripeWebhookController do
  use TeamsWeb, :controller
  plug :verify_signature

  def create(conn, %{"type" =&gt; type}) do
    # ...
  end

  defp verify_signature(conn, []) do
    # ...
  end
end
</code></pre>
<p>… the idea being that a dev reading it knows “ahh, I put some handling code in the <code>create</code> function.”</p>
<p>Whereas PinStripe’s WebHook controller is literally <em>just</em> this:</p>
<pre data-code-wrap="elixir"><code class="lang-elixir">defmodule MyAppWeb.StripeWebhookController do
  use PinStripe.WebhookController,
    handler: MyApp.StripeWebhookHandlers
end
</code></pre>
<p>That injects all the sig verification code from the Dashbit controller and forwards webhook events to the WebhookHandler module.</p>
<p>So PinStripe is more opinionated, but it saves some fussy setup.</p>
<p>It’s actually possible though that the <code>handle "stripe.event" ...</code> DSL could just live right there in the controller though <img src="https://forum.elixirforum.com/images/emoji/apple/thinking.png?v=15" title=":thinking:" class="emoji" alt=":thinking:" loading="lazy" width="20" height="20"></p>
<p>Then it would just be:</p>
<pre data-code-wrap="elixir"><code class="lang-elixir">defmodule MyAppWeb.StripeWebhookController do
  use PinStripe.WebhookController

  handle "customer.created", fn(data) -&gt; ... end
  handle "customer.updated", MyApp.StripeWebhookHandlers.CustomerUpdated
end
</code></pre>
<p>Might do that! Not sure there’s a need to have the handler declarations live in a separate module. It would save a bit of indirection.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="380391" data-batch-url="/posts/batch_likers">
                        2
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/pinstripe-a-stripe-small-development-kit-for-elixir/73714/12">Post #11</a>
	                </div>
	            </div>
              <div id="likers-container-380391" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="380391"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #11"></div>
  </section>
</div>
    <div class="postbit" id="380392" data-post-id="380392">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="eileennoonan" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/eileennoonan/120/36180_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  eileennoonan
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<h2><a name="p-380392-h-030-2025-12-19-1" class="anchor" href="#p-380392-h-030-2025-12-19-1" aria-label="Heading link" rel="nofollow"></a>[0.3.0] - 2025-12-19</h2>
<h3><a name="p-380392-changed-2" class="anchor" href="#p-380392-changed-2" aria-label="Heading link" rel="nofollow"></a>Changed</h3>
<p><strong>Breaking Change</strong>: Simplified webhook handler architecture</p>
<p>Webhook event handlers are now defined directly in your <code>WebhookController</code> instead of a separate <code>WebhookHandler</code> module. This reduces indirection and simplifies the overall architecture.</p>
<p><strong>Before (0.2.x)</strong>:</p>
<pre data-code-wrap="elixir"><code class="lang-elixir">defmodule MyApp.StripeWebhookHandlers do
  use PinStripe.WebhookHandler
  
  handle "customer.created", fn event -&gt; ... end
end

defmodule MyAppWeb.StripeWebhookController do
  use PinStripe.WebhookController,
    handler: MyApp.StripeWebhookHandlers
end
</code></pre>
<p><strong>After (0.3.0)</strong>:</p>
<pre data-code-wrap="elixir"><code class="lang-elixir">defmodule MyAppWeb.StripeWebhookController do
  use PinStripe.WebhookController
  
  handle "customer.created", fn event -&gt; ... end
end
</code></pre>
<p><strong>Migration</strong><br>
Move your <code>handle</code> declarations from your <code>WebhookHandler</code> module into your <code>WebhookController</code>. Handler modules (for complex handlers) should remain in <code>lib/my_app/stripe_webhook_handlers/</code> but are now referenced directly from the controller.</p>
<p>… but let’s be honest, no one is using this yet <img src="https://forum.elixirforum.com/images/emoji/apple/joy.png?v=15" title=":joy:" class="emoji" alt=":joy:" loading="lazy" width="20" height="20"></p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="380392" data-batch-url="/posts/batch_likers">
                        2
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/pinstripe-a-stripe-small-development-kit-for-elixir/73714/13">Post #12</a>
	                </div>
	            </div>
              <div id="likers-container-380392" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="380392"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #12"></div>
  </section>
</div>
    <div class="postbit" id="380394" data-post-id="380394">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="lawik" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/lawik/120/32028_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  lawik
                  </h3>
		          </div>
						
			          <div class="user-title">
									<span>Nerves Core Team</span>
			          </div>
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Probably 6-7 years back I worked on a client project that had stripity stripe and they were rawdogging everything and had very little in terms of tests. I needed to modify billing so I wanted tests. And just being able to test behavior manually against Stripe.</p>
<p>I ended up writing some test helpers for the Stripe CLI to receive webhooks ( <a href="https://docs.stripe.com/stripe-cli/use-cli#forward-events-to-your-local-webhook-endpoint" class="inline-onebox" rel="noopener nofollow ugc">Use the Stripe CLI | Stripe Documentation</a> ). Was a pretty neat thing.</p>
<p>Might fit as an optional config option for test and dev?</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="380394" data-batch-url="/posts/batch_likers">
                        3
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/pinstripe-a-stripe-small-development-kit-for-elixir/73714/14">Post #13</a>
	                </div>
	            </div>
              <div id="likers-container-380394" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="380394"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #13"></div>
  </section>
</div>
    <div class="postbit" id="380403" data-post-id="380403">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="eileennoonan" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/eileennoonan/120/36180_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  eileennoonan
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Oh yeah! So actually the Dashbit article has an example of that too where it automatically starts the Stripe listener in dev mode and points it at the webhook endpoint. It’s on my short list to add that to the installer.</p>
<p>Also fwiw PinStripe does currently generate <em>fixtures</em> for webhhooks. Fixture gen uses the Stripe CLI, which means fixtures create a record in the Stripe dev dashboard when they’re first generated. After that though they are cached locally or, should I say, fixed.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="380403" data-batch-url="/posts/batch_likers">
                        3
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/pinstripe-a-stripe-small-development-kit-for-elixir/73714/15">Post #14</a>
	                </div>
	            </div>
              <div id="likers-container-380403" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="380403"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #14"></div>
  </section>
</div>
    <div class="postbit" id="380537" data-post-id="380537">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="spurgus" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/spurgus/120/39233_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  spurgus
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Thanks, it’s great to have a new library for Stripe - we’re currently using StripityStripe, but it hasn’t had a release in 2 years or so…</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="380537" data-batch-url="/posts/batch_likers">
                        1
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/pinstripe-a-stripe-small-development-kit-for-elixir/73714/16">Post #15</a>
	                </div>
	            </div>
              <div id="likers-container-380537" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="380537"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #15"></div>
  </section>
</div>
    <div class="postbit" id="380539" data-post-id="380539">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="eileennoonan" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/eileennoonan/120/36180_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  eileennoonan
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>I’d love it if people would test it out! I haven’t used it in a real project yet so I still consider it experimental.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="380539" data-batch-url="/posts/batch_likers">
                        1
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/pinstripe-a-stripe-small-development-kit-for-elixir/73714/17">Post #16</a>
	                </div>
	            </div>
              <div id="likers-container-380539" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="380539"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #16"></div>
  </section>
</div>
    <div class="postbit" id="380605" data-post-id="380605">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="zanuka" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/zanuka/120/39517_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  zanuka
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>very cool, love the name and will test it out on a project I am launching soon</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="380605" data-batch-url="/posts/batch_likers">
                        1
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/pinstripe-a-stripe-small-development-kit-for-elixir/73714/18">Post #17</a>
	                </div>
	            </div>
              <div id="likers-container-380605" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="380605"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #17"></div>
  </section>
</div>
    <div class="postbit" id="380609" data-post-id="380609">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="eileennoonan" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/eileennoonan/120/36180_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  eileennoonan
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>That would be great! I also haven’t tried it in a real project yet, but will be doing so soon.</p>
<p>Also welcome to the forum! It says this is the first time you posted <img src="https://forum.elixirforum.com/images/emoji/apple/raising_hands.png?v=15" title=":raising_hands:" class="emoji" alt=":raising_hands:" loading="lazy" width="20" height="20"></p>
<p>I am a fan of the name too, to be clear that was <a class="mention" href="/u/lawik" rel="nofollow">@lawik</a> <img src="https://forum.elixirforum.com/images/emoji/apple/joy.png?v=15" title=":joy:" class="emoji" alt=":joy:" loading="lazy" width="20" height="20"></p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="380609" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/pinstripe-a-stripe-small-development-kit-for-elixir/73714/19">Post #18</a>
	                </div>
	            </div>
              <div id="likers-container-380609" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="380609"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #18"></div>
  </section>
</div>
    <div class="postbit" id="380637" data-post-id="380637">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="zanuka" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/zanuka/120/39517_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  zanuka
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Since I am implementing Stripe checkout in a Phoenix LiveView app, I’m curious how PinStripe’s approach differs from an approach like this - <a href="https://fullstackphoenix.com/tutorials/setup-stripe-with-phoenix-liveview" class="inline-onebox" rel="noopener nofollow ugc">Setup Stripe with Phoenix LiveView · FullstackPhoenix</a>. I’m planning on using Stripe Elements for the checkout UI and am also using Ash Framework.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="380637" data-batch-url="/posts/batch_likers">
                        1
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/pinstripe-a-stripe-small-development-kit-for-elixir/73714/20">Post #19</a>
	                </div>
	            </div>
              <div id="likers-container-380637" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="380637"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #19"></div>
  </section>
</div>
    <div class="postbit" id="380639" data-post-id="380639">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="eileennoonan" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/eileennoonan/120/36180_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  eileennoonan
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>In theory it should work fine with that process, you’d just be using <code>:pin_stripe</code> to make API requests to Stripe and to handle incoming Stripe Webhooks instead of <code>:stripity_stripe</code>. PinStripe doesn’t have any opinions at all about what you do with frontend, ie. Stripe Elements vs Stripe Checkout etc.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="380639" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/pinstripe-a-stripe-small-development-kit-for-elixir/73714/21">Post #20</a>
	                </div>
	            </div>
              <div id="likers-container-380639" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="380639"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #20"></div>
  </section>
</div>
</template></turbo-stream><turbo-stream action="replace" target="load-more-container"><template><div id="load-more-container" class="load-more-container">
    <a class="load-more-button" data-turbo-stream="true" href="/topics/73714/load_more?page=3">Load more posts (8 remaining)</a>
</div></template></turbo-stream>