<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Tier - Pricing As Code]]></title><description><![CDATA[Tier - Pricing As Code]]></description><link>https://blog.tier.run</link><image><url>https://cdn.hashnode.com/res/hashnode/image/upload/v1662817540115/hkPe4mTpC.png</url><title>Tier - Pricing As Code</title><link>https://blog.tier.run</link></image><generator>RSS for Node</generator><lastBuildDate>Fri, 17 Apr 2026 00:26:44 GMT</lastBuildDate><atom:link href="https://blog.tier.run/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Stripe Billing Metered Pricing: Optimizing Your Subscription Model]]></title><description><![CDATA[Embracing the Power of Metered Pricing
In the world of subscription-based businesses, finding the ideal pricing model that maximizes revenue while keeping customers satisfied is paramount. The emergence of metered pricing has opened new doors for bus...]]></description><link>https://blog.tier.run/stripe-billing-metered-pricing-optimizing-your-subscription-model</link><guid isPermaLink="true">https://blog.tier.run/stripe-billing-metered-pricing-optimizing-your-subscription-model</guid><category><![CDATA[stripe]]></category><category><![CDATA[billing]]></category><category><![CDATA[JavaScript]]></category><dc:creator><![CDATA[Jevon MacDonald]]></dc:creator><pubDate>Mon, 29 May 2023 15:34:59 GMT</pubDate><content:encoded><![CDATA[<h2 id="heading-embracing-the-power-of-metered-pricing"><strong>Embracing the Power of Metered Pricing</strong></h2>
<p>In the world of subscription-based businesses, finding the ideal pricing model that maximizes revenue while keeping customers satisfied is paramount. The emergence of metered pricing has opened new doors for businesses to tailor their offerings to customers' unique needs and usage patterns. Stripe Billing's metered pricing is a game-changing solution that empowers businesses to implement dynamic pricing structures based on actual usage. In this article, we will explore the concept of Stripe Billing metered pricing and delve into strategies to leverage its benefits effectively.</p>
<h2 id="heading-stripe-billing-metered-pricing-understanding-the-fundamentals"><strong>Stripe Billing Metered Pricing: Understanding the Fundamentals</strong></h2>
<p>Stripe Billing metered pricing is a flexible pricing model that allows businesses to charge customers based on their actual usage. It enables granular tracking of usage metrics and empowers businesses to align their pricing with value delivered. By employing metered pricing, businesses can move away from fixed, one-size-fits-all plans and instead introduce pricing tiers that better reflect customers' varying consumption levels.</p>
<h3 id="heading-key-features-of-stripe-billing-metered-pricing"><strong>Key Features of Stripe Billing Metered Pricing</strong></h3>
<ol>
<li><p><strong>Granular Usage Tracking</strong>: Stripe Billing's metered pricing allows businesses to track usage metrics with exceptional granularity. This enables businesses to accurately measure and bill customers for the services they consume.</p>
</li>
<li><p><strong>Dynamic Pricing Tiers</strong>: With metered pricing, businesses can create dynamic pricing tiers that adjust according to customers' usage. This ensures customers only pay for what they actually use, fostering transparency and fairness.</p>
</li>
<li><p><strong>Flexible Billing Cycles</strong>: Stripe Billing offers flexible billing cycles to accommodate different business needs. Whether it's hourly, daily, monthly, or any other interval, you can align your billing cycles with your customers' usage patterns.</p>
</li>
<li><p><strong>Automated Invoicing</strong>: Stripe Billing streamlines the entire invoicing process by automating the generation and delivery of invoices based on customers' usage. This saves time and reduces the likelihood of human error.</p>
</li>
</ol>
<h2 id="heading-implementing-stripe-billing-metered-pricing-best-practices"><strong>Implementing Stripe Billing Metered Pricing: Best Practices</strong></h2>
<p>Implementing Stripe Billing metered pricing requires careful planning and execution. By following these best practices, you can ensure a seamless transition to this innovative pricing model:</p>
<h3 id="heading-1-analyze-your-customers-usage-patterns"><strong>1. Analyze Your Customer's Usage Patterns</strong></h3>
<p>Before implementing metered pricing, thoroughly analyze your customers' usage patterns. Identify the key metrics that will drive your pricing tiers and evaluate how different usage levels impact your business costs. This analysis will serve as the foundation for creating optimal pricing tiers.</p>
<h3 id="heading-2-define-clear-pricing-tiers"><strong>2. Define Clear Pricing Tiers</strong></h3>
<p>Create well-defined pricing tiers that align with your customers' usage patterns. Consider offering multiple tiers that cater to different levels of consumption. This ensures that customers can choose the plan that best suits their needs and encourages them to upgrade as their usage increases.</p>
<h3 id="heading-3-communicate-transparently-with-customers"><strong>3. Communicate Transparently with Customers</strong></h3>
<p>Transparency is key when transitioning to metered pricing. Clearly communicate the benefits and mechanics of the new pricing model to your customers. Ensure they understand how their usage will be measured, the flexibility they will gain, and the potential cost savings associated with the metered pricing model.</p>
<h3 id="heading-4-offer-usage-analytics-and-insights"><strong>4. Offer Usage Analytics and Insights</strong></h3>
<p>To enhance customer engagement and satisfaction, provide customers with detailed usage analytics and insights. By giving them visibility into their consumption patterns, you empower them to make informed decisions about their usage and optimize their spending accordingly.</p>
<h3 id="heading-5-optimize-billing-and-invoicing-processes"><strong>5. Optimize Billing and Invoicing Processes</strong></h3>
<p>Leverage Stripe Billing's automated invoicing capabilities to streamline your billing processes. Automate invoice generation and delivery based on customers' usage to reduce administrative burdens and improve accuracy. Additionally, provide customers with self-service</p>
<h3 id="heading-6-use-a-priceops-approach-to-simplify-any-changes-you-need-to-make">6. Use a PriceOps approach to simplify any changes you need to make</h3>
<p>It's one thing to come up with a price and configure Stripe Billing for the first time, but sooner or later you will need to deploy changes to your initial pricing model. A <a target="_blank" href="https://priceops.org">PriceOps</a> bases approach to implementing pricing will pay dividends as your company growth. <a target="_blank" href="https://tier.run">Tier</a> is designed from the ground up to simplify the implementation and management of all types of pricing models.</p>
]]></content:encoded></item><item><title><![CDATA[Billing Engines Don’t Solve Pricing Problems]]></title><description><![CDATA[One lesson we've learned talking to companies on their pricing journeys (and from our own in the past) is the importance of separating the concepts of "Billing Engine" and "Pricing Engine".
It's one of those things that feels obvious when you see it,...]]></description><link>https://blog.tier.run/pricing-engine-vs-billing-engine</link><guid isPermaLink="true">https://blog.tier.run/pricing-engine-vs-billing-engine</guid><category><![CDATA[pricing]]></category><category><![CDATA[priceops]]></category><category><![CDATA[billing]]></category><dc:creator><![CDATA[Isaac Schlueter]]></dc:creator><pubDate>Wed, 26 Apr 2023 22:23:47 GMT</pubDate><content:encoded><![CDATA[<p>One lesson we've learned talking to companies on their pricing journeys (and from our own in the past) is the importance of separating the concepts of "Billing Engine" and "Pricing Engine".</p>
<p>It's one of those things that feels obvious when you see it, but until you do, it can be hard to grasp why it's important. The result is that we end up with the wrong abstraction trying to do double duty.</p>
<p>Just as you probably wouldn't use a relational database as a message bus, mixing the concepts of Pricing and Billing can bring disaster.</p>
<h2 id="heading-the-problem"><strong>The Problem</strong></h2>
<p>Most companies approach their pricing implementation in the following way:</p>
<ol>
<li><p>Choose a billing engine (Stripe, Lago, etc.)</p>
</li>
<li><p>Have a bunch of meetings where they argue about the best pricing model (and hopefully write it down somewhere!)</p>
</li>
<li><p>Configure the billing engine with the model they decided on (or realize it's too complicated, and go back to step 2).</p>
</li>
<li><p>Store all the information that the billing engine needs in their application database (identifiers for prices, products, customer IDs associated with each user, etc.), and add the required reporting logic in the application in the appropriate places.</p>
</li>
<li><p>Pray that no one ever has to touch it again. (Or failing that, hope you've got a new job somewhere else before that happens.)</p>
</li>
</ol>
<p>Where does the pricing model live? Typically, it's smeared across a variety of loosely connected components, some of which store it as implicit assumptions.</p>
<ul>
<li><p>The billing engine</p>
</li>
<li><p>The application code</p>
</li>
<li><p>The CFO's spreadsheets</p>
</li>
<li><p>The <code>/pricing</code> page</p>
</li>
<li><p>The terms and conditions of various customer contracts</p>
</li>
<li><p>Feature requests from PMs and PMMs who want to make changes</p>
</li>
<li><p>The fallible human brains of everyone on the team</p>
</li>
</ul>
<h2 id="heading-billing-engine-vs-pricing-engine"><strong>Billing Engine vs Pricing Engine</strong></h2>
<p>A lot of value can be unlocked by separating these two abstractions.</p>
<p>A <strong>Billing Engine</strong> is the component in the stack that <em>bills customers</em>. Its "one job" is to send an invoice at the right time, in the right amount, to the right buyer.</p>
<p>To do this, it needs to know some information about the customer, what thing they bought, the price they should be charged for it, and in the case of metered billing, the amount of that thing that they consumed.</p>
<p>A <strong>Pricing Engine</strong> is the component in the stack that <em>manages and implements the pricing model</em>. You can think of it as "the thing that does <a target="_blank" href="https://priceops.org">PriceOps</a>". It knows what the various pricing plans are, and where they live in the Billing Engine, and thus can present a clean API surface for application code to create subscriptions and report usage.</p>
<p>To do its job (and prevent other components from trying to take over!) it needs to store the pricing model itself, and present a clean abstraction to the application code, billing engine, and all other technical and business components that need access to price information.</p>
<p>And perhaps most importantly, it must support making <em>changes</em> to the pricing model, without its abstractions leaking out to consumers.</p>
<h2 id="heading-benefits"><strong>Benefits</strong></h2>
<p>The most tangible immediate benefit of a comprehensive Pricing Engine is that it can simplify the process of setting up a Billing Engine, and reduce the amount of billing-related metadata that needs to be tracked and managed by application code.</p>
<p>While this is enough of a reason to use it, it doesn't always <em>feel</em> like a huge win. Integrating with a whole new component in the stack feels like adding complexity in one place to maybe save it elsewhere. Even if it makes your code cleaner and simpler, it's not <em>that</em> bad, right? Isn't "having too many customers and complicated deals" sort of a problem I can worry about when I'm rich and successful?</p>
<p>However, the trouble with this line of thinking (which all of us at Tier have learned through painful expensive experience) is that it can be very difficult for a company to <em>become</em> successful if they cannot easily iterate on their approach to pricing and packaging.</p>
<p><strong>Streamlining pricing with a comprehensive Pricing Engine lets everyone focus on their specialty.</strong> This unlocks growth that would otherwise be lost to inefficient processes.</p>
<h2 id="heading-why-we-made-tier"><strong>Why We Made Tier</strong></h2>
<p>What we've found is that the most experienced and insightful practitioners in this space follow exactly this kind of approach. That's how the concept of PriceOps was born.</p>
<p>Tier is a comprehensive Pricing Engine, which drives your billing engine and application code from a single source of pricing model truth, so that everything in your company can work in concert, even as your business changes and grows.</p>
]]></content:encoded></item><item><title><![CDATA[Tier v0.10]]></title><description><![CDATA[A new Tier release is ready, and Cloud has already been updated!v0.10.0 is here and it contains many features that have been requested by you.
Tier Cloud
Tier Cloud is available in Alpha and is now running v0.10.0. 
We’ve seen many users migrating fr...]]></description><link>https://blog.tier.run/tier-v010</link><guid isPermaLink="true">https://blog.tier.run/tier-v010</guid><category><![CDATA[stripe]]></category><category><![CDATA[Stripe Checkout]]></category><category><![CDATA[JavaScript]]></category><category><![CDATA[golang]]></category><category><![CDATA[Go Language]]></category><dc:creator><![CDATA[Jevon MacDonald]]></dc:creator><pubDate>Sun, 02 Apr 2023 23:15:05 GMT</pubDate><content:encoded><![CDATA[<p>A new Tier release is ready, and Cloud has already been updated!<br /><a target="_blank" href="https://tier.run/releases">v0.10.0 is here</a> and it contains many features that have been requested by you.</p>
<h2 id="heading-tier-cloud">Tier Cloud</h2>
<p>Tier Cloud is available in Alpha and is now running v0.10.0. </p>
<p>We’ve seen many users migrating from using <code>tier serve</code> to Tier Cloud. We encourage you to give it a try. It’s a seamless process. <strong>Just set TIER_API_KEY to your Stripe key</strong>, and the SDK will do the right thing. <a target="_blank" href="http://email.tier.run/e/c/eyJlIjoxMzM0NDAsImVtYWlsX2lkIjoiZXhhbXBsZSIsImhyZWYiOiJodHRwczovL2dpc3QuZ2l0aHViLmNvbS9qZXZvbi9hMjlmNmIxMGQyOTRlYjdmZDA2ZWE1YTRiNjdiMzUxNyIsInQiOjE2ODA0NzY4MzB9/86b6ba1feb36261a636e7128b43f88fb60883eea2a7e055a1afc285cf230a784">See an example here</a>.</p>
<p>Join our support channel if you have any questions: <a target="_blank" href="https://tier-community.slack.com/archives/C04V6K76G7K">https://tier-community.slack.com/archives/C04V6K76G7K</a></p>
<h2 id="heading-model-builder-preview">Model Builder Preview</h2>
<p>Pricing.json has been a powerful way to model pricing. It's flexible, versioned and easy to share. As more companies adopt a <a target="_blank" href="http://email.tier.run/e/c/eyJlIjoxMzM0NDAsImVtYWlsX2lkIjoiZXhhbXBsZSIsImhyZWYiOiJodHRwczovL3ByaWNlb3BzLm9yZyIsInQiOjE2ODA0NzY4MzB9/a0d139dfcdb532c7f5ed806a2ed5f33da6f98736c3db2fb0fe28df2fc1197a33">PriceOps approach</a> to pricing, it's important that non-technical members of your team have the ability to create pricing models.</p>
<p>Model Builder is a WYSIWYG pricing model builder that natively supports plan creation, collaboration, push, pull, and Checkout links.</p>
<p>We will have more to share soon, but if you are interested in testing Model Builder, <a target="_blank" href="http://email.tier.run/e/c/eyJlIjoxMzM0NDAsImVtYWlsX2lkIjoiZXhhbXBsZSIsImhyZWYiOiJodHRwczovL3NoYXJlLmhzZm9ybXMuY29tLzFNVlV6bEI4RVJVbWNSV3A3R3phamJnZGp6NTIiLCJ0IjoxNjgwNDc2ODMwfQ/e77337ba2b444574bd536835edd7fa197e528a17caf2438cb6b24f6bdab16ec4"><strong>please sign up here</strong></a><strong>.</strong></p>
<h2 id="heading-api-changes">API Changes</h2>
<p><strong>Base prices support decimals</strong> </p>
<p>The plans["plan:name@0"].features["feature:name"].base may now contain decimals with up to 12 decimal places, which is the limit Stripe imposes. </p>
<p><strong>Test Clocks</strong></p>
<p>The API is now aware of Stripe Test Clocks and will pass test clock IDs along with requests to Stripe that support them, for any tier request that provides them. The SDKs have also been updated to make using test clocks easy. </p>
<p><strong>Support for Metered+Per Unit pricing</strong> </p>
<p>Tier no longer uses tiered pricing for features with only a single tier that does not contain a base price. </p>
<p>Features with a single tier that has a base price of 0 will now be converted to metered+per_unit in Stripe. This is useful for models such as per-seat pricing and the change will have no effect on any existing features with single tiers in Stripe. <a target="_blank" href="http://email.tier.run/e/c/eyJlIjoxMzM0NDAsImVtYWlsX2lkIjoiZXhhbXBsZSIsImhyZWYiOiJodHRwczovL2dpc3QuZ2l0aHViLmNvbS9qZXZvbi8zOTNhZTEzNTgzNjE2MDE0MDBjMDBmY2ZjYWZhMjBiNiIsInQiOjE2ODA0NzY4MzB9/0acaa7fb04f32de813210f9608db55cb499ffb2a93851ef473efb6aff05db3e1">See an example here</a>. </p>
<p><strong>Pricing Transforms</strong> </p>
<p>Tier models now support a Stripe’s division transform, which transforms the quantity <em>before</em> multiplying the base price to determine the amount to bill. Stripe restricts transforms to metered+per_unit (see above for how to create these features). </p>
<p>The transform takes two fields: <strong>by</strong> and <strong>rounding</strong>. The by must be an integer to divide by, and rounding must be "up" or "down". </p>
<p>To specify a division transform:</p>
<p><img src="https://userimg-assets.customeriomail.com/images/client-env-133440/editor_images/Screenshot%202023-03-29%20at%206.37.27%20AM-01GWPBNJAKWW2AEARNB38EP4XX.png" alt /></p>
<h2 id="heading-updates-to-the-v1phase-endpoint">Updates to the /v1/phase endpoint</h2>
<p><strong>Trial field</strong> </p>
<p>The /v1/phase endpoint now returns a trial boolean that is true if the current phase is a trial. </p>
<p><strong>End field</strong></p>
<p>The /v1/phase endpoint now returns an end field specifying the date and time the current phase ends (not the period end).</p>
<h2 id="heading-sdks">SDKs</h2>
<p><strong>Cancel</strong></p>
<p>Both the Go and Node SDKs now provide a cancel function on their respective clients, as sugar for canceling subscriptions, which has always been supported by scheduling a phase containing zero features. Once the phase's effective date passes, the org's limits will report 0 per feature’s limits. </p>
<p><strong>Test Clocks</strong></p>
<p>The Go and Node SDKs now support Stripe Test Clocks via the new Tier API addition. </p>
<p><strong>Misc</strong></p>
<p>The SDKs also include various bug fixes and additions for supporting new API changes.</p>
<h2 id="heading-cli">CLI</h2>
<p><strong>Price link fixes</strong></p>
<p>On tier push the resulting price links should no longer link to incorrect accounts or live mode, preventing confusion.</p>
]]></content:encoded></item><item><title><![CDATA[Tier v0.9]]></title><description><![CDATA[We're excited to announce the release Tier 0.9.0, which brings several new features and improvements to our API.
New Features
Listing Payment Methods
The new, experimental, /v1/payment_methods?org=org:acme API returns all payment methods associated w...]]></description><link>https://blog.tier.run/tier-v09</link><guid isPermaLink="true">https://blog.tier.run/tier-v09</guid><category><![CDATA[General Programming]]></category><category><![CDATA[stripe]]></category><dc:creator><![CDATA[Jevon MacDonald]]></dc:creator><pubDate>Wed, 22 Feb 2023 21:21:55 GMT</pubDate><content:encoded><![CDATA[<p>We're excited to announce the release Tier 0.9.0, which brings several new features and improvements to our API.</p>
<h2 id="heading-new-features">New Features</h2>
<p><strong>Listing Payment Methods</strong></p>
<p>The new, experimental, <code>/v1/payment_methods?org=org:acme</code> API returns all payment methods associated with an org. It can be used with the latest addition to the <code>/v1/subscribe</code> endpoint to associate a payment method with an orgs subscription managed by Tier.</p>
<p><strong>Subscription Payment Methods</strong></p>
<p>Clients may now specify a payment method other than a customer's default payment method for the Tier managed subscription using the <code>/v1/subscribe</code> endpoint.</p>
<p>Use subscription-specific payment methods to avoid conflicts with other subscriptions that may have already or may later exist in your Stripe account that Tier does not manage.</p>
<p><strong>Require Billing Address with Checkout</strong></p>
<p>Users may now require a billing address when using Checkout. The Go SDK has been updated with a new <code>RequireBillingAddress</code> option on Checkout, and the CLI now accepts <code>--require_billing_address</code> as a flag to the subscribe sub command.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1677100717462/d3374daa-0640-4522-9107-0b535e42adb9.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-bug-fixes">Bug Fixes</h3>
<p>Tier 0.9.0 also includes some bug fixes, the most notable is a fix for canceling subscriptions without active schedules. Canceling a subscription no longer requires the subscription to have an active schedule.</p>
<p>We hope that these changes improve your experience with our product. Please let us know if you have any questions or feedback.</p>
<p>The v0.9.0 release is here: <a target="_blank" href="https://tier.run/releases">https://tier.run/releases</a>.</p>
<p>As always, please let us know if anything doesn’t work as expected by filing issues at <a target="_blank" href="https://tier.run/issues/new">https://tier.run/issues/new</a>.</p>
]]></content:encoded></item><item><title><![CDATA[Tier v0.8]]></title><description><![CDATA[We're happy to announce the latest version of Tier. v0.8.0 is now available, and it has several exciting updates!
Tier now supports Stripe Checkout using Tier plans, enabling both licensed and metered features in Stripe Checkout.
Here is the full run...]]></description><link>https://blog.tier.run/tier-v08</link><guid isPermaLink="true">https://blog.tier.run/tier-v08</guid><category><![CDATA[stripe]]></category><category><![CDATA[Monetization]]></category><category><![CDATA[JavaScript]]></category><dc:creator><![CDATA[Jevon MacDonald]]></dc:creator><pubDate>Wed, 15 Feb 2023 22:56:35 GMT</pubDate><content:encoded><![CDATA[<p>We're happy to announce the latest version of Tier. <a target="_blank" href="https://github.com/tierrun/tier/releases/tag/v0.8.0">v0.8.0 is now available</a>, and it has several exciting updates!</p>
<p>Tier now supports <a target="_blank" href="https://stripe.com/docs/payments/checkout">Stripe Checkout</a> using Tier plans, enabling both licensed and metered features in Stripe Checkout.</p>
<p>Here is the full rundown of the updates in Tier v0.8.0:</p>
<h3 id="heading-checkout">Checkout</h3>
<p>Now in Alpha. We've added support for metered billing to Stripe Checkout! This means that the Node and Go SDKs as well as the CLI now support checkout.</p>
<p>To try it out, simply set the <code>--checkout</code> flag when using tier subscribe in the CLI. For example:</p>
<pre><code class="lang-bash">tier subscribe --checkout=https://example.com/success org:acme plan:pro@2
</code></pre>
<p>This will return a Stripe Checkout link that you can send to your customer, and you can even test it out by visiting the link yourself. Don't forget that you can set the optional <code>--cancel_url</code> flag to redirect users if they cancel out of the checkout session.</p>
<h3 id="heading-clobber-usage-with-tier-report">Clobber usage with tier report</h3>
<p>The CLI subcommand report now accepts a <code>--clobber</code> flag for setting usage versus incrementing. This will help you keep better track of your usage and avoid any surprises along the way.</p>
<h3 id="heading-create-a-test-environment-on-push">Create a test environment on push</h3>
<p>You can now use the -c flag on tier push to create a new test environment, switch to it, and push the supplied pricing.json pricing model. This will return a link for the newly created environment.</p>
<p>To give it a go, try running:</p>
<pre><code class="lang-bash">tier push -c pricing.json
</code></pre>
<p>We hope you enjoy using Tier v0.8.0 as much as we enjoyed creating it!</p>
<hr />
<p>Please head over to <a target="_blank" href="https://tier.run/releases"><strong>https://tier.run/releases</strong></a> to check out more changes and install options. As always, <code>brew upgrade tierrun/tap/tier</code> works too!</p>
<blockquote>
<p><strong><em>If you haven't used Tier yet, these resources are a good place to get started:</em></strong></p>
</blockquote>
<ul>
<li><p><a target="_blank" href="https://blog.tier.run/tier-hello-world-demo"><strong>Hello World! example</strong></a> - Step by step guide to adding Tier to your new or existing codebase</p>
</li>
<li><p><a target="_blank" href="https://tier.run/docs/quickstart"><strong>Quick Start Guide</strong></a> - Step by step to getting up and running with Tier.</p>
</li>
<li><p><a target="_blank" href="https://tier.run/docs/recipes"><strong>Recipes</strong></a> - Example common pricing models and their corresponding Tier <code>pricing.json</code> representations.</p>
</li>
<li><p><a target="_blank" href="https://tier.run/docs/cli"><strong>CLI Reference</strong></a> - Documentation for the Tier command line tool.</p>
</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[Tier v0.7]]></title><description><![CDATA[Tier v0.7 is now available. Updates include

Support for canceling subscriptions

Free Trials support

Detection and reporting of lingering Stripe idempotency keys


We are also releasing several bug fixes and enhancements which you can find in the r...]]></description><link>https://blog.tier.run/tier-v07</link><guid isPermaLink="true">https://blog.tier.run/tier-v07</guid><category><![CDATA[Web Development]]></category><category><![CDATA[billing]]></category><category><![CDATA[stripe]]></category><dc:creator><![CDATA[Jevon MacDonald]]></dc:creator><pubDate>Wed, 18 Jan 2023 01:36:43 GMT</pubDate><content:encoded><![CDATA[<p><a target="_blank" href="https://github.com/tierrun/tier/releases/tag/v0.7.0">Tier v0.7</a> is now available. Updates include</p>
<ul>
<li><p>Support for canceling subscriptions</p>
</li>
<li><p>Free Trials support</p>
</li>
<li><p>Detection and reporting of lingering Stripe idempotency keys</p>
</li>
</ul>
<p>We are also releasing several bug fixes and enhancements which you can find in the release notes here: https://github.com/tierrun/tier/releases/tag/v0.7.0</p>
<h4 id="heading-getting-started-with-tier">Getting started with Tier</h4>
<p>Please head over to <a target="_blank" href="https://tier.run/releases">https://tier.run/releases</a> to check out more changes and install options. As always, <code>brew upgrade tierrun/tap/tier</code> works too!</p>
<p>If you haven't used Tier yet, these resources are a good place to get started:</p>
<ul>
<li><p><a target="_blank" href="https://blog.tier.run/tier-hello-world-demo">Hello World! example</a> - Step-by-step guide to adding Tier to your new or existing codebase</p>
</li>
<li><p><a target="_blank" href="https://tier.run/docs/quickstart">Quick Start Guide</a> - Step-by-step to getting up and running with Tier.</p>
</li>
<li><p><a target="_blank" href="https://tier.run/docs/recipes">Recipes</a> - Example common pricing models and their corresponding Tier <code>pricing.json</code> representations.</p>
</li>
<li><p><a target="_blank" href="https://tier.run/docs/cli">CLI Reference</a> - Documentation for the Tier command line tool.</p>
</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[Tier Fly.io Template]]></title><description><![CDATA[A community member has contributed a Fly.io template. (Thank you Samuel Gordalina!)
This template will provision Tier as a private service on Fly.io.
Setup
Create an app out of this template.
sh flyctl launch --no-deploy

Then we set the stripe api k...]]></description><link>https://blog.tier.run/tier-flyio-template</link><guid isPermaLink="true">https://blog.tier.run/tier-flyio-template</guid><category><![CDATA[fly.io]]></category><category><![CDATA[stripe]]></category><category><![CDATA[SaaS]]></category><category><![CDATA[billing]]></category><dc:creator><![CDATA[Jevon MacDonald]]></dc:creator><pubDate>Fri, 06 Jan 2023 13:25:36 GMT</pubDate><content:encoded><![CDATA[<p>A community member has contributed a Fly.io template. (Thank you <a target="_blank" href="https://github.com/gordalina">Samuel Gordalina</a>!)</p>
<p>This template will provision Tier as a private service on <a target="_blank" href="https://fly.io">Fly.io</a>.</p>
<h2 id="heading-setup">Setup</h2>
<p>Create an app out of <a target="_blank" href="https://github.com/gordalina/fly-tier">this template</a>.</p>
<pre><code class="lang-bash">sh flyctl launch --no-deploy
</code></pre>
<p>Then we set the stripe api key secret, and deploy it</p>
<pre><code class="lang-bash">sh flyctl secrets <span class="hljs-built_in">set</span> STRIPE_API_KEY=sk_live_...
</code></pre>
<h2 id="heading-usage">Usage</h2>
<p>The app is now available internally at <code>http://&lt;app&gt;.internal/</code>.</p>
<h2 id="heading-support">Support</h2>
<p>For further questions, please join our <a target="_blank" href="https://join.slack.com/t/tier-community/shared_invite/zt-1blotqjb9-wvkYMo8QkhaEWziprdjnIA">Community Slack</a>.</p>
]]></content:encoded></item><item><title><![CDATA[Tier Heroku Buildpack]]></title><description><![CDATA[We are now maintaining a Heroku Buildpack for Tier. You can get the latest version and documentation on GitHub.
This buildback installs and runs the Tier sidecar in Heroku dynos.
Install
heroku buildpacks:add https://github.com/tierrun/tier-run-build...]]></description><link>https://blog.tier.run/tier-heroku-buildpack</link><guid isPermaLink="true">https://blog.tier.run/tier-heroku-buildpack</guid><category><![CDATA[Heroku]]></category><category><![CDATA[stripe]]></category><category><![CDATA[billing]]></category><category><![CDATA[SaaS]]></category><dc:creator><![CDATA[Jevon MacDonald]]></dc:creator><pubDate>Fri, 06 Jan 2023 13:11:49 GMT</pubDate><content:encoded><![CDATA[<p>We are now maintaining a Heroku Buildpack for Tier. You can get the latest version and documentation on <a target="_blank" href="https://github.com/tierrun/tier-run-buildpack">GitHub</a>.</p>
<p>This buildback installs and runs the Tier sidecar in Heroku dynos.</p>
<h2 id="heading-install">Install</h2>
<pre><code class="lang-bash">heroku buildpacks:add https://github.com/tierrun/tier-run-buildpack
</code></pre>
<h2 id="heading-environment">Environment</h2>
<p>The below environment variables can be set using <code>heroku config:set X=Y</code> or via the Heroku dashboard.</p>
<ul>
<li><p><code>STRIPE_API_KEY</code>: The required Stripe key (live or test) to use. If a live key is used, the <code>-live</code> flag will be automatically passed to <code>tier serve</code>.</p>
</li>
<li><p><code>TIER_VERSION</code>: The optional Tier sidecar version (default is <code>0.6.2</code>)</p>
</li>
<li><p><code>TIER_ADDR</code>: The optional address the sidecar will listen on (default is <code>127.0.0.1:8080</code>)</p>
</li>
<li><p><code>TIER_RUN_DYNOS</code>: An optional comma seperated list of process type names (e.g. "web") to run the sidecar in. If unset, all process types will run the sidecar.</p>
</li>
</ul>
<h2 id="heading-support">Support</h2>
<p>For further questions, please join our <a target="_blank" href="https://join.slack.com/t/tier-community/shared_invite/zt-1blotqjb9-wvkYMo8QkhaEWziprdjnIA">Community Slack</a>.</p>
]]></content:encoded></item><item><title><![CDATA[Official Tier Docker Images]]></title><description><![CDATA[We are now maintaining an official set of images on Docker hub.
Updated images will be available here:

https://hub.docker.com/r/tierrun/tier/tags

and you can get the latest at any time via
$ docker pull tierrun/tier]]></description><link>https://blog.tier.run/official-tier-docker-images</link><guid isPermaLink="true">https://blog.tier.run/official-tier-docker-images</guid><category><![CDATA[Devops]]></category><category><![CDATA[stripe]]></category><dc:creator><![CDATA[Jevon MacDonald]]></dc:creator><pubDate>Fri, 09 Dec 2022 15:17:08 GMT</pubDate><content:encoded><![CDATA[<p>We are now maintaining an official set of images on Docker hub.</p>
<p>Updated images will be available here:</p>
<ul>
<li><a target="_blank" href="https://hub.docker.com/r/tierrun/tier/tags">https://hub.docker.com/r/tierrun/tier/tags</a></li>
</ul>
<p>and you can get the latest at any time via</p>
<pre><code class="lang-bash">$ docker pull tierrun/tier
</code></pre>
]]></content:encoded></item><item><title><![CDATA[Tier v0.6.2]]></title><description><![CDATA[You can find Tier v0.6.2 here.
This update introduces the ability to enter prices in decimal form as well as the ability to switch between test accounts using the canonical URL for the test account.
Fractional Prices
The smallest whole unit for a pri...]]></description><link>https://blog.tier.run/tier-v062</link><guid isPermaLink="true">https://blog.tier.run/tier-v062</guid><category><![CDATA[tier]]></category><category><![CDATA[stripe]]></category><category><![CDATA[JavaScript]]></category><dc:creator><![CDATA[Blake Mizerany]]></dc:creator><pubDate>Thu, 08 Dec 2022 00:45:12 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1670460261441/rIAXvVBkP.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>You can <a target="_blank" href="https://github.com/tierrun/tier/releases">find Tier v0.6.2 here</a>.</p>
<p>This update introduces the ability to enter prices in decimal form as well as the ability to switch between test accounts using the canonical URL for the test account.</p>
<h3 id="heading-fractional-prices">Fractional Prices</h3>
<p>The smallest whole unit for a price is 1 cent. Prices can now be represented in fractions of cents.</p>
<p>For example, the following feature in <code>pricing.json</code></p>
<pre><code class="lang-json">
        <span class="hljs-string">"feature:message"</span>: {
          <span class="hljs-attr">"tiers"</span>: [{ <span class="hljs-attr">"upto"</span>: <span class="hljs-number">10</span>, <span class="hljs-attr">"price"</span>: <span class="hljs-number">0.1</span> }]
        }
</code></pre>
<p>Will be represented in Stripe as:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1670448085412/xYAomICYv.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-test-account-switching-by-url">Test Account Switching by URL</h3>
<p>A few weeks ago we introduced <a target="_blank" href="https://blog.tier.run/tier-switch-git-branch-stripe">tier switch</a> which brings the first sandboxes to Stripe. This is useful for everything from testing new ideas in dev to enabling Stripe Preview Deploys.</p>
<p>With Tier v0.6.2 you can now switch to a test account by including its URL as a parameter in <code>tier switch</code>.</p>
<p>For example:</p>
<p><code>tier switch https://dashboard.stripe.com/acct_1MCUwJIR5o5wb1n4/test</code></p>
<hr />
<p>Please head over to <a target="_blank" href="https://tier.run/releases">https://tier.run/releases</a> to check out more changes and install options. As always, <code>brew upgrade tierrun/tap/tier</code> works too!</p>
<blockquote>
<p>If you haven't used Tier yet, these resources are a good place to get started:</p>
</blockquote>
<ul>
<li><p><a target="_blank" href="https://blog.tier.run/tier-hello-world-demo">Hello World! example</a> - Step by step guide to adding Tier to your new or existing codebase</p>
</li>
<li><p><a target="_blank" href="https://tier.run/docs/quickstart">Quick Start Guide</a> - Step by step to getting up and running with Tier.</p>
</li>
<li><p><a target="_blank" href="https://tier.run/docs/recipes">Recipes</a> - Example common pricing models and their corresponding Tier <code>pricing.json</code> representations.</p>
</li>
<li><p><a target="_blank" href="https://tier.run/docs/cli">CLI Reference</a> - Documentation for the Tier command line tool.</p>
</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[Stripe Glossary]]></title><description><![CDATA[Stripe Glossary available at github.com/tierrun/tier/wiki/Stripe-Glossary
Getting to know Stripe can take some time. Not only are there a lot of new concepts to learn, Stripe sometimes likes to use esoteric definitions for some things, such as "Good-...]]></description><link>https://blog.tier.run/stripe-glossary</link><guid isPermaLink="true">https://blog.tier.run/stripe-glossary</guid><category><![CDATA[stripe]]></category><category><![CDATA[JavaScript]]></category><dc:creator><![CDATA[Jevon MacDonald]]></dc:creator><pubDate>Tue, 06 Dec 2022 18:23:46 GMT</pubDate><content:encoded><![CDATA[<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1670352907078/S2Clt2R1w.png" alt class="image--center mx-auto" /></p>
<p>Stripe Glossary available at <a target="_blank" href="https://github.com/tierrun/tier/wiki/Stripe-Glossary"><mark>github.com/tierrun/tier/wiki/Stripe-Glossary</mark></a></p>
<p>Getting to know Stripe can take some time. Not only are there a lot of new concepts to learn, <a target="_blank" href="https://stripe.com">Stripe</a> sometimes likes to use esoteric definitions for some things, such as "<a target="_blank" href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#good-better-best">Good-better-best</a>".</p>
<p>We have developed a <a target="_blank" href="https://github.com/tierrun/tier/wiki/Stripe-Glossary">Stripe Glossary</a> that can be used as a reference. This is useful as you navigate Stripe's documentation and should help demystify the meaning of all these new terms you will encounter.</p>
<p>We will continue to update and evolve the glossary and hope it can be a useful resource for anyone who is in the process of developing their understanding of <a target="_blank" href="https://www.stripe.com">Stripe</a> and its capabilities.</p>
<p>You can find the working glossary here: <a target="_blank" href="https://github.com/tierrun/tier/wiki/Stripe-Glossary"><strong>https://github.com/tierrun/tier/wiki/Stripe-Glossary</strong></a><strong>.</strong> We welcome any suggested updates that you might have.</p>
<p>Here is the current list of terms, with direct links to their definitions.</p>
<ul>
<li><p><a target="_blank" href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#3d-secure">3D Secure</a></p>
</li>
<li><p><a target="_blank" href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#aggregate-metered-usage">Aggregate Metered Usage</a></p>
</li>
<li><p><a target="_blank" href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#aggregation-mode">Aggregation Mode</a></p>
</li>
<li><p><a target="_blank" href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#australian-business-numbers">Australian Business Numbers</a></p>
</li>
<li><p><a target="_blank" href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#billing-cycle-anchor">Billing Cycle Anchor</a></p>
</li>
<li><p><a target="_blank" href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#billing-threshold">Billing Threshold</a></p>
</li>
<li><p><a target="_blank" href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#client-platform">Client Platform</a></p>
</li>
<li><p><a target="_blank" href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#create-a-session">Create a Session</a></p>
</li>
<li><p><a target="_blank" href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#custom-accounts">Custom Accounts</a></p>
</li>
<li><p><a target="_blank" href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#customer-portal-session">Customer Portal (session)</a></p>
</li>
<li><p><a target="_blank" href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#dashboard">Dashboard</a></p>
</li>
<li><p><a target="_blank" href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#destination-charge">Destination Charge</a></p>
</li>
<li><p><a target="_blank" href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#direct-charge">Direct Charge</a></p>
</li>
<li><p><a target="_blank" href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#dunning-email">Dunning Email</a></p>
</li>
<li><p><a target="_blank" href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#european-vat-numbers">European VAT Numbers</a></p>
</li>
<li><p><a target="_blank" href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#exclusive-tax-behavior">Exclusive (Tax behavior)</a></p>
</li>
<li><p><a target="_blank" href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#express-account">Express Account</a></p>
</li>
<li><p><a target="_blank" href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#freemium">Freemium</a></p>
</li>
<li><p><a target="_blank" href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#good-better-best">Good-better-best</a></p>
</li>
<li><p><a target="_blank" href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#graduated-pricing">Graduated Pricing</a></p>
</li>
<li><p><a target="_blank" href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#inclusive-tax-behavior">Inclusive (Tax Behavior)</a></p>
</li>
<li><p><a target="_blank" href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#inline-pricing">Inline Pricing</a></p>
</li>
<li><p><a target="_blank" href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#landing-page">Landing Page</a></p>
</li>
<li><p><a target="_blank" href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#licensed-usage">Licensed Usage</a></p>
</li>
<li><p><a target="_blank" href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#metered-billing">Metered Billing</a></p>
</li>
<li><p><a target="_blank" href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#metered-usage">Metered Usage</a></p>
</li>
<li><p><a target="_blank" href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#multi-currency-prices">Multi-currency Prices</a></p>
</li>
<li><p><a target="_blank" href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#package-pricing">Package Pricing</a></p>
</li>
<li><p><a target="_blank" href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#pay-what-you-want-pricing">Pay-what-you-want Pricing</a></p>
</li>
<li><p><a target="_blank" href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#pause-payment-collection">Pause (Payment Collection)</a></p>
</li>
<li><p><a target="_blank" href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#paymentintent">PaymentIntent</a></p>
</li>
<li><p><a target="_blank" href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#payment-form">Payment Form</a></p>
</li>
<li><p><a target="_blank" href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#payment-status">Payment Status</a></p>
</li>
<li><p><a target="_blank" href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#payment-window">Payment Window.</a></p>
</li>
<li><p><a target="_blank" href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#per-seat">Per-seat</a></p>
</li>
<li><p><a target="_blank" href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#pricing-page">Pricing Page</a></p>
</li>
<li><p><a target="_blank" href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#priceops">PriceOps</a></p>
</li>
<li><p><a target="_blank" href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#product-catalog">Product Catalog</a></p>
</li>
<li><p><a target="_blank" href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#provision">Provision</a></p>
</li>
<li><p><a target="_blank" href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#quotes">Quotes</a></p>
</li>
<li><p><a target="_blank" href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#revenue-recognition">Revenue Recognition</a></p>
</li>
<li><p><a target="_blank" href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#reverse-charge">Reverse Charge</a></p>
</li>
<li><p><a target="_blank" href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#roll-ups">Roll Ups</a></p>
</li>
<li><p><a target="_blank" href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#setupintents">SetupIntents</a></p>
</li>
<li><p><a target="_blank" href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#sigma-queries">Sigma (queries)</a></p>
</li>
<li><p><a target="_blank" href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#smart-retries">Smart Retries</a></p>
</li>
<li><p><a target="_blank" href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#standard-account">Standard Account</a></p>
</li>
<li><p><a target="_blank" href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#standard-pricing">Standard Pricing</a></p>
</li>
<li><p><a target="_blank" href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#stripe">Stripe</a></p>
</li>
<li><p><a target="_blank" href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#stripe-cli">Stripe CLI</a></p>
</li>
<li><p><a target="_blank" href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#stripe-hosted-ui">Stripe-hosted UI</a></p>
</li>
<li><p><a target="_blank" href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#stripe-ruby-library">Stripe Ruby Library</a></p>
</li>
<li><p><a target="_blank" href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#stripe-tax">Stripe Tax</a></p>
</li>
<li><p><a target="_blank" href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#subscription">Subscription</a></p>
</li>
<li><p><a target="_blank" href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#subscription-events">Subscription Events</a></p>
</li>
<li><p><a target="_blank" href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#subscription-lifecycle">Subscription Lifecycle.</a></p>
</li>
<li><p><a target="_blank" href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#subscription-phases">Subscription Phases</a></p>
</li>
<li><p><a target="_blank" href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#subscription-schedules">Subscription Schedules</a></p>
</li>
<li><p><a target="_blank" href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#tax-exempt">Tax Exempt</a></p>
</li>
<li><p><a target="_blank" href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#tax-rates">Tax Rates</a></p>
</li>
<li><p><a target="_blank" href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#tiered-pricing">Tiered Pricing</a></p>
</li>
<li><p><a target="_blank" href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#trials">Trials</a></p>
</li>
<li><p><a target="_blank" href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#usage-based-pricing">Usage-based Pricing</a></p>
</li>
<li><p><a target="_blank" href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#variable-pricing">Variable Pricing</a></p>
</li>
<li><p><a target="_blank" href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#volume-based-billing">Volume Based Billing</a></p>
</li>
<li><p><a target="_blank" href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#upsell">Upsell</a></p>
</li>
<li><p><a target="_blank" href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#webhook">Webhook</a></p>
</li>
<li><p><a target="_blank" href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#webhook-endpoint">Webhook Endpoint</a></p>
</li>
<li><p><a target="_blank" href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#webhook-events">Webhook Events</a></p>
</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[Tier CLI v0.6]]></title><description><![CDATA[You can find the Tier CLI v0.6 here. 
The v0.6 release introduces a way to manage customer data stored in stripe for any Tier managed org.
To set the email, description, name, phone, or user-defined metadata, for an org, set the new info field for /v...]]></description><link>https://blog.tier.run/tier-cli-v06</link><guid isPermaLink="true">https://blog.tier.run/tier-cli-v06</guid><category><![CDATA[stripe]]></category><category><![CDATA[SaaS]]></category><category><![CDATA[Node.js]]></category><category><![CDATA[billing]]></category><dc:creator><![CDATA[Blake Mizerany]]></dc:creator><pubDate>Wed, 30 Nov 2022 01:30:04 GMT</pubDate><content:encoded><![CDATA[<p>You can <a target="_blank" href="http://github.com/tierrun/tier/releases/tag/v0.6.0">find the Tier CLI v0.6 here</a>. </p>
<p>The v0.6 release introduces a way to manage customer data stored in stripe for any Tier managed org.</p>
<p>To set the <em>email</em>, <em>description</em>, <em>name</em>, <em>phone</em>, or <em>user-defined metadata</em>, for an org, set the new <code>info</code> field for <code>/v1/subscribe</code> request. In addition to this change, a minimum of one phase for a <code>/v1/subscribe</code> request is no longer required.</p>
<p>The new fields are:</p>
<ul>
<li>description</li>
<li>name</li>
<li>phone</li>
<li>email</li>
<li>metadata</li>
</ul>
<p>Additionally, the <code>/v1/whois</code> endpoint will now report up-to-date attributes if the query parameter <code>include=info</code> is present.</p>
<p>Both <a target="_blank" href="https://www.tier.run/docs/sdk/">the Go and Node SDKs have been updated</a>. </p>
<p>Please head over to <a target="_blank" href="https://tier.run/releases">https://tier.run/releases</a> to check out more changes and install options. As always, <code>brew upgrade tierrun/tap/tier</code> works too!</p>
<blockquote>
<p>If you haven't used Tier yet, these resources are a good place to get started:</p>
<ul>
<li><a target="_blank" href="https://blog.tier.run/tier-hello-world-demo">Hello World! example</a> - Step by step guide to adding Tier to your new or existing codebase</li>
<li><a target="_blank" href="https://tier.run/docs/quickstart">Quick Start Guide</a> - Step by step to
getting up and running with Tier.</li>
<li><a target="_blank" href="https://tier.run/docs/recipes">Recipes</a> - Example common pricing models and
their corresponding Tier <code>pricing.json</code> representations.</li>
<li><a target="_blank" href="https://tier.run/docs/cli">CLI Reference</a> - Documentation for the Tier
command line tool.</li>
</ul>
</blockquote>
]]></content:encoded></item><item><title><![CDATA[Questions you should ask when interviewing at a startup]]></title><description><![CDATA[Interviews... interviews... If you've ever switched jobs then you know there can be good interviews, and there can be really bad ones. Sometimes a bad interview means it's a bad company. Sometimes it means you aren't the right hire for them. 
Intervi...]]></description><link>https://blog.tier.run/questions-you-should-ask-when-interviewing-at-a-startup</link><guid isPermaLink="true">https://blog.tier.run/questions-you-should-ask-when-interviewing-at-a-startup</guid><category><![CDATA[interview]]></category><category><![CDATA[jobs]]></category><category><![CDATA[Sass]]></category><category><![CDATA[Startups]]></category><dc:creator><![CDATA[Jevon MacDonald]]></dc:creator><pubDate>Tue, 29 Nov 2022 16:08:47 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/unsplash/2Q3Ivd-HsaM/upload/v1669738069821/Fgac7fp5Z.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Interviews... interviews... If you've ever switched jobs then you know there can be good interviews, and there can be really bad ones. Sometimes a bad interview means it's a bad company. Sometimes it means you aren't the right hire for them. </p>
<p>Interviews are typically structured as a 1-way conversation. Sometimes there is a cursory "do you have any questions for me?" as the interviewer glances at their watch with a few minutes left before your time is up. </p>
<p>The truth is that it's very hard to stand out in an interview when you are responding to questions. The best you can hope for is to check a few boxes in an otherwise obscure and fuzzy process. </p>
<p>How can you turn any interview from boring to engaging? From mundane to exciting? <strong>Asking great questions!</strong> </p>
<p>Interviewees who ask great questions stand out from the pack and they look and sounds like leaders. Asking good questions is a skill for you to develop. For the person on the receiving end, a good question demonstrates that you have a depth of understanding, an earnest interest, and that you have leadership skills and the ability to influence. </p>
<p>The right questions to ask are going to be different in every situation, but there are a few that can be helpful in any situation when you are interviewing with a hiring manager. </p>
<p><strong>1. What is the team culture like? Why is it like that?</strong></p>
<p>You'll never get a consistent answer on this one, and sometimes it might be hard to get a truthful answer. What you are told may speak volumes about not only the company, but more importantly how the person you are asking perceives the company itself. Asking "why is it this way?" may open up a discussion about values and leadership, or you may find some subtle finger pointing going on. Keep an eye out for 🚩🚩🚩 red flags.</p>
<p>Other questions you could ask:</p>
<ul>
<li>How do decisions get made?</li>
<li>What happens if there isn't consensus? </li>
<li>How often does the entire company meet? Who leads that meeting?</li>
</ul>
<p><strong>2. What do you think sets this company apart from its competitors?</strong></p>
<p>This is a broad question. Product and goto-market differentiation are subsets of this. The interviewer may focus on one or the other, or ideally they will be able to speak more broadly about what makes a company special. It might be a visionary CEO (Marc Benioff, Salesforce), it could be a particular cultural environment (Spotify), or it may be a special and defensible technology (Google). Whatever it is, listen for the signs that the company really is special and that it's a place where you truly want to invest your time and career. </p>
<p>Other questions you could ask:</p>
<ul>
<li>Do you have product-market fit? When did you find it? What has changed since then?</li>
<li>Do customer's help shape the roadmap? What kinds of requests do they make?</li>
<li>Who does support? How do they share feedback/requests/requirements with the rest of the company?</li>
</ul>
<p><strong>3. What is the company's mission and vision? </strong></p>
<p>Boring right? Wrong! This is the right question to ask if you are speaking with multiple people. Their ability to give you an answer that is consistent with their peers is a useful indicator of the level of cohesion within the company. A great leader spends a significant amount of time making sure everyone is playing from the same sheet of music. It can also be a good topic for you, your skills and how your role will contribute to things the company has prioritized.</p>
<p>Other questions you could ask:</p>
<ul>
<li>Does this mission statement/vision/values change often? </li>
<li>How could they change over time?</li>
<li>Does everyone in the company have a hand in crafting the vision, or is it shared by leadership? </li>
</ul>
<p><strong>4. What challenges has the company faced and how did it overcome them?</strong></p>
<p>Startups often face significant challenges in their early stages, such as funding, market fit, and product development. Asking about the specific challenges the company has faced and how it has managed to overcome them can give you a better understanding of the company and its ability to succeed.</p>
<ul>
<li>How much runway does the company have?</li>
<li>Do you plan to raise more money? Do you have a rough idea of when? </li>
<li>Is the company profitable, or does it plan to be profitable? How are you balance growth with stability/runway.</li>
</ul>
<p><strong>5. What is the company's growth strategy?</strong></p>
<p>In order to be successful, startups need to have a go-to market strategy. Asking about this will help you to understand the company's plans for the future and how you can contribute to its success. It will also help you to determine whether the company is a good fit for your skills and experience. Are they focused and specific in their answers? Or you do you get a "you're in engineering, you don't <em>rreeallllyyy</em> need to now this stuff, right?" kind of vibe.</p>
<ul>
<li>What metrics are you focused on? </li>
<li>How do you decide which work to prioritize to support growth? </li>
<li>How important is account expansion vs new business?</li>
<li>How did you come up with the current pricing? Is it working as-is or do you have plans to change it? </li>
</ul>
<p>There are many ways to handle an interview. Sometimes you'll simply want to find an opportunity to demonstrate your skills, other times you'll find yourself being evaluated for "cultural fit". Whatever situation you find yourself in: remember to ask good questions. Be specific, expect precision. It's your your change to be certain you are going somewhere exciting, and it may uncover the red flags that would otherwise get glossed over. </p>
]]></content:encoded></item><item><title><![CDATA[Tier CLI v0.5.2]]></title><description><![CDATA[We just released v0.5.2, with some exciting new enhancements and features.

Switch preallocations: The tier switch -c command now preallocates switch accounts which means after the first switch account is created, subsequent uses of tier switch -c sh...]]></description><link>https://blog.tier.run/tier-cli-v052</link><guid isPermaLink="true">https://blog.tier.run/tier-cli-v052</guid><category><![CDATA[stripe]]></category><category><![CDATA[billing]]></category><category><![CDATA[SaaS]]></category><category><![CDATA[General Programming]]></category><category><![CDATA[Node.js]]></category><dc:creator><![CDATA[Blake Mizerany]]></dc:creator><pubDate>Wed, 23 Nov 2022 01:20:02 GMT</pubDate><content:encoded><![CDATA[<p>We just <a target="_blank" href="https://github.com/tierrun/tier">released v0.5.2</a>, with some exciting new enhancements and features.</p>
<ul>
<li><strong>Switch preallocations</strong>: The <code>tier switch -c</code> command now preallocates switch accounts which means after the first switch account is created, subsequent uses of <code>tier switch -c</code> should be noticeably faster, like, complete in 10us fast! This is because it can now avoid waiting on slow API calls to Stripe.</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1669166841281/-hh3FSdDl.png" alt="Screenshot 2022-11-22 at 9.22.50 PM.png" class="image--center mx-auto" /></p>
<ul>
<li><p><strong>Plan immutability</strong>: Plans are now 100% immutable, as was originally planned. To upgrade all existing Tier plans to be 100% immutable, please run <code>tier pull | tier push</code> - 2 times; The second should produce output saying <code>[plan already exists]</code>, which is your confirmation the migration was successful.</p>
</li>
<li><p><strong>Deep links</strong>: Push now outputs deep links to the corresponding prices in Stripe.</p>
</li>
<li><p><strong>Clean command</strong>:  We added the <code>tier clean -switchaccounts</code> command. As you might guess, it cleans up accounts in Test Mode that were created by the switch command. The full command takes a duration of time for specifying the maximum age to use when considering an account for removal. Please see <code>tier clean -h</code> for more information.</p>
</li>
</ul>
<p>Please head over to <a target="_blank" href="https://tier.run/releases">https://tier.run/releases</a> to check out more changes and install options. As always, <code>brew upgrade tierrun/tap/tier</code> works too! </p>
]]></content:encoded></item><item><title><![CDATA[5 things you need to know about Stripe's Test Mode]]></title><description><![CDATA[Stripe has two modes, Live Mode and Test Mode. Both of these represent isolated environments, and Test Mode will provide simulated responses for some requests. It's a really useful sandbox to build against as you implement your Stripe integrations. I...]]></description><link>https://blog.tier.run/the-5-gotchas-of-stripe-test-mode</link><guid isPermaLink="true">https://blog.tier.run/the-5-gotchas-of-stripe-test-mode</guid><category><![CDATA[SaaS]]></category><category><![CDATA[software development]]></category><category><![CDATA[stripe]]></category><dc:creator><![CDATA[Blake Mizerany]]></dc:creator><pubDate>Wed, 16 Nov 2022 21:01:01 GMT</pubDate><content:encoded><![CDATA[<p>Stripe has two modes, Live Mode and Test Mode. Both of these represent isolated environments, and Test Mode will provide simulated responses for some requests. It's a really useful sandbox to build against as you implement your Stripe integrations. It also comes with a few gotchas. </p>
<p>As we encountered these issues while building <a target="_blank" href="https://github.com/tierrun/tier">Tier</a>, we decided to create <a target="_blank" href="https://github.com/tierrun/tier#readme"><code>tier switch</code></a> to make it easy to spin up test and preview environments. </p>
<blockquote>
<p>To learn more about the <code>switch</code> command and how to use it to avoid these issues, <a target="_blank" href="https://blog.tier.run/tier-switch-git-branch-for-stripe">please read this post and give it a try today</a>. </p>
</blockquote>
<h3 id="heading-inconsistent-ui">Inconsistent UI</h3>
<p>One quirk of test mode is how it shows up in the stripe Dashboard. It’s easy to miss as you move between modes.</p>
<p>Test Clocks will usually isolate some objects from each other in the API, however, they do not show up that way when using the UI in Test Mode.</p>
<p>For example, if you list all customers in the API without specifying a test clock, you will only see customers without test clocks, but in the UI, you will see all customers with and without test clocks.</p>
<p>To distinguish between objects with test clocks, and those without, objects associated with a test clock get orange banners and/or an icon indicating they are part of a test clock. This is helpful, but it does not show any indication of which objects are grouped together by a test clock. To see this, you’ll need a new skill to operate and see in a new dimension, as we’ll quickly see:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1668575631328/qPJaHUNW-.png" alt="Screenshot 2022-11-16 at 1.13.17 AM.png" /></p>
<p>In the above screenshot, there are two test clocks. Which customers are on the same clock? You can probably deduce which are associated by looking at the CREATED field, but what if I advance both clocks to the same time, or what if I ran two simulations each with nearly identical timelines? It all becomes blurry in the “normal” UI mode.</p>
<p>The only way to find out who is associated with what clock is to drill down to the test clock’s screen.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1668575713452/y1F4Zen8l.png" alt="Screenshot 2022-11-16 at 1.14.54 AM.png" /></p>
<p>Having to keep this in mind as you navigate around the UI requires a new mental shift. One you must enter into and switch out of rapidly to gain a sense of what you're looking at depending on the screen, and how the things you're seeing all relate to each other in this new, additional dimension.</p>
<h3 id="heading-product-and-price-debris">Product and Price Debris</h3>
<p>Products and Prices remain unisolated from subscriptions associated with a test clock, as well as with subscriptions not associated with a test clock. This means products and prices will not be cleaned up when a test clock cleans up (if you ever clean up test clocks right away or just wait for them to GC on their own).</p>
<p>This may not seem like a big deal, but when you’re in a trial-and-error mode, working out the kinks of your pricing model, or running an integration test, this quickly becomes a major source of friction and frustration. That is because you cannot start a new simulation in a totally clean room, so you must manually delete each product and price you modified, otherwise it may interfere with the next simulation. </p>
<h3 id="heading-key-and-id-collisions">Key and ID Collisions</h3>
<p>It's important to note that deleting products and prices can not happen if they have been burned into the audit log. In this situation, you can only archive them, but their IDs and lookup keys remain. This will often cause collisions across simulations and tests.</p>
<p>One of my favorite things about the product and price APIs in Stripe is that you can bring your own IDs and lookup keys. This allows you to assign a unique ID or lookup key that may only be used by a single product or price, respectively, at a time.</p>
<p>But if you can’t delete the price or product because a subscription has burned the price into the audit log, then the next test run might get an error if attempting to create a new price with the same lookup key or product with the same ID.</p>
<p>We can side-step this by namespacing our keys across tests, but this means our code must be very smart and careful to not let this behavior leak into production, and know how to plumb the namespace from the request received by the user all the way to stripe, or risk clobbering or duplicating objects on write and potentially reading back the wrong one. This isn’t ideal either.</p>
<h3 id="heading-the-manual-process-of-deleting-test-data">The Manual process of Deleting Test Data</h3>
<p>With the above gotchas in mind, we probably want to think about wiping the slate clean.</p>
<p>Unfortunately, there is no Stripe API to start with a fresh Test Mode. To do so programmatically requires cascading delete calls to the API per object, which is a slow and error-prone process. </p>
<p>Even if “done right”, you’re likely to run into the problem where you can’t delete prices already burned into the audit trail (which in production is a good thing, but the reality is different for your test environments as they become impossible to clean completely).</p>
<h3 id="heading-keep-the-babies-ignore-the-bath-water">Keep the babies. Ignore the bath water.</h3>
<p>When you hit that “Delete Test Data” button, you’re potentially erasing the artifacts of valuable lessons learned. Lessons that could be used to refer back to as you experiment with new approaches to your pricing and billing.</p>
<p>To keep these for reference, a common approach is to simply sign up for a new Stripe account. Maybe we call it “test2”, but this comes with new problems:</p>
<ul>
<li>Extra API keys to manage</li>
<li>Extra login credentials to manage</li>
</ul>
<p>This also does not fix the problem of throwing out our history, because this new account could end up with data as valuable as the previous, so away we go again to sign up for a new Stripe account, and then again, and so on.</p>
<p>We can delay decluttering our account drop-down by triaging all of those accounts until another day.</p>
<h2 id="heading-continuous-integration">Continuous Integration</h2>
<p>It isn’t hard to imagine getting into a situation where changing a price or a product in the “Holy” CI Stripe account wreaks havoc on CI. This usually happens because the once “pristine” account is now out of whack according to the code expecting Stripe to look another way.</p>
<p>If engineering was already sheepish about making changes to the pricing model, this just further adds ammo to their argument against it, because no one wants to breathe on that code, for fear of breaking it.</p>
<h1 id="heading-make-the-switch">Make the <code>switch</code></h1>
<p><strong>Tier is your new set of power tools for Stripe</strong>. By using the <code>switch</code> command, you can avoid the 5 gotchas of test mode and gain the power of a PriceOps-compatible approach to monetization while building powerful new workflows on top of Stripe. This gives you the best of both worlds: The power of Tier and the reliability and reach of Stripe.</p>
<p>With Tier, you get powerful features such as <code>switch</code> along with our SDKs, metering, and feature flagging style entitlement checking. </p>
<p>If you aren't already a Tier user, you can get started quickly and easily. </p>
<ul>
<li><a target="_blank" href="https://www.tier.run/docs/">Read Tier Docs</a></li>
<li><a target="_blank" href="https://blog.tier.run/tier-hello-world-demo">Hello World! getting started example</a></li>
</ul>
]]></content:encoded></item><item><title><![CDATA[tier switch - git branch, for Stripe]]></title><description><![CDATA[tier switch creates instant isolated test environments in Stripe, under a single Stripe login
tier switch brings modern dev and test workflows to the Stripe ecosystem
By using this feature, teams can more safely and reliably collaborate on Stripe Bil...]]></description><link>https://blog.tier.run/tier-switch-git-branch-stripe</link><guid isPermaLink="true">https://blog.tier.run/tier-switch-git-branch-stripe</guid><category><![CDATA[stripe]]></category><category><![CDATA[tier]]></category><category><![CDATA[SaaS]]></category><category><![CDATA[software development]]></category><dc:creator><![CDATA[Blake Mizerany]]></dc:creator><pubDate>Wed, 16 Nov 2022 20:46:35 GMT</pubDate><content:encoded><![CDATA[<ul>
<li><code>tier switch</code> creates instant isolated test environments in Stripe, under a single Stripe login</li>
<li><code>tier switch</code> brings modern dev and test workflows to the Stripe ecosystem</li>
<li>By using this feature, teams can more safely and reliably collaborate on Stripe Billing implementations, deploy test environments, and speed up overall development time</li>
</ul>
<p><code>tier switch</code> is a command that creates on-demand, lightweight and isolated environments in Stripe. These are great for things like experiments and running integration tests. They are also perfect for sharing any results and collaborating with your team. </p>
<p><a target="_blank" href="https://cdn.hashnode.com/res/hashnode/image/upload/v1668629890650/q4upUPifF.gif"><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1668629890650/q4upUPifF.gif" alt="Click to view in full screen" class="image--center mx-auto" /></a></p>
<p>We were heavily inspired by many of our favorite tools. Like our first time opening a PR on GitHub, viewing changes in a live preview environment on <a target="_blank" href="https://vercel.com">Vercel</a>, or rehearsing a schema change <a target="_blank" href="https://planetscale.com/docs/concepts/nonblocking-schema-changes">in a branch on Planetscale</a>, these little features can make you, and your team, wildly productive. They do this by giving you the confidence you need to iterate quickly and in isolation, but with the ability to share and collaborate. </p>
<blockquote>
<p>Visit https://tier.run/docs/cli/switch, and get started with Tier Switch now!</p>
</blockquote>
<p>Before <code>tier switch</code>, our Stripe workflow looked much like everyone else</p>
<blockquote>
<ol>
<li>Manually switch to one of the special "test" mode accounts 🕺</li>
<li>Find and click on "Delete all test data" . . . then wait. 🗑️</li>
<li>Reset the idempotency key prefix 🔑</li>
<li>Run test or experiment 🔜</li>
<li>Take screenshot of result to share with team 📸 </li>
</ol>
</blockquote>
<p>This isn’t just tedious, it’s messy and it’s brittle. Few of these steps can be reliably reproduced. </p>
<h1 id="heading-the-missing-test-env-for-stripe">The missing Test Env for Stripe</h1>
<p><code>tier switch</code> builds on Stripe’s existing test mode but is designed to be more compatible with modern workflows. Each time you invoke <code>tier switch</code>, a new clean-slate and ephemeral test account is created. This environment is immediately accessible without the need to re-authenticate and can be seeded and ready for use in seconds.</p>
<p><code>tier switch</code> will:</p>
<ul>
<li>Retain test results without impacting past or future experiments and tests</li>
<li>Give each test and experiment its own dashboard, like it would have in production.</li>
<li>Make this possible with a single Stripe account or org.</li>
</ul>
<p>Why is this important? In our work developing Tier, we've been heavy users of Stripe's test mode. While it is as well designed and useful tool for an initial integration, it quickly became harder to use than we expected. </p>
<h1 id="heading-make-the-switch">Make the <code>switch</code></h1>
<p><strong>Tier is your new set of power tools for Stripe</strong>. By using the <code>switch</code> command, you can avoid <a target="_blank" href="https://blog.tier.run/the-5-gotchas-of-stripes-test-mode">the 5 gotchas of test mode</a> and gain the power of a PriceOps compatible approach to monetization while building powerful new workflows on top of Stripe. This gives you the best of both worlds: The power of Tier and the reliability and reach of Stripe.</p>
<p>With Tier you get powerful features such as <code>switch</code> along with our SDKs, metering and feature flagging style entitlement checking. </p>
<p>If you aren't already a Tier user, you can get started quickly and easily. </p>
<ul>
<li><a target="_blank" href="https://www.tier.run/docs/">Read Tier Docs</a></li>
<li><a target="_blank" href="https://blog.tier.run/tier-hello-world-demo">Hello World! getting started example</a></li>
</ul>
]]></content:encoded></item><item><title><![CDATA[Validating `pricing.json` in Your Editor]]></title><description><![CDATA[This is a quick guide for adding the schema for pricing.json files to vim and VSCode.
TL;DR
The schema for pricing.json files is available at https://www.tier.run/docs/pricing.schema.json. Plug that URL into whatever tool you use to validate JSON, an...]]></description><link>https://blog.tier.run/validating-pricingjson-in-your-editor</link><guid isPermaLink="true">https://blog.tier.run/validating-pricingjson-in-your-editor</guid><category><![CDATA[pricing.json]]></category><category><![CDATA[tier]]></category><category><![CDATA[editors]]></category><category><![CDATA[vim]]></category><category><![CDATA[VSCode Tips]]></category><dc:creator><![CDATA[Isaac Schlueter]]></dc:creator><pubDate>Tue, 08 Nov 2022 18:11:21 GMT</pubDate><content:encoded><![CDATA[<p>This is a quick guide for adding the schema for <a target="_blank" href="https://www.tier.run/docs/pricing.json"><code>pricing.json</code></a> files to vim and VSCode.</p>
<h2 id="heading-tldr">TL;DR</h2>
<p>The schema for <code>pricing.json</code> files is available at <a target="_blank" href="https://www.tier.run/docs/pricing.schema.json">https://www.tier.run/docs/pricing.schema.json</a>. Plug that URL into whatever tool you use to validate JSON, and associate it with <code>pricing.json</code> files.</p>
<h2 id="heading-vs-code">VS Code</h2>
<p>More info on editing JSON is available <a target="_blank" href="https://code.visualstudio.com/docs/languages/json">in the VSCode docs</a>.</p>
<ol>
<li><p>Open the <a target="_blank" href="https://code.visualstudio.com/docs/getstarted/settings">User and Workspace Settings</a> menu.</p>
</li>
<li><p>Click <code>Extensions</code> and then <code>JSON</code> in the left sidebar.</p>
</li>
<li><p>Look for the option "JSON &gt; Schema Download: Enable" and ensure that the box is checked.</p>
</li>
<li><p>Underneath that, look for the option "JSON: Schemas" and click "Edit in settings.json"</p>
</li>
</ol>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1667930888007/PmTGrW3Wq.png" alt="screenshot of VSCode settings page" /></p>
<ol>
<li><p>Add the following section:</p>
<pre><code class="lang-json"> <span class="hljs-string">"json.schemas"</span>: [
   {
     <span class="hljs-attr">"fileMatch"</span>: [<span class="hljs-string">"pricing.json"</span>],
     <span class="hljs-attr">"url"</span>: <span class="hljs-string">"https://www.tier.run/docs/pricing.schema.json"</span>
   }
 ],
</code></pre>
</li>
</ol>
<p>Here's the result:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1667930926144/o_cZ9b4SN.png" alt="screenshot of VSCode showing a warning about invalid pricing.json" /></p>
<h2 id="heading-vimneovim-and-coc">vim/neovim and COC</h2>
<p>If you use vim with <a target="_blank" href="https://github.com/neoclide/coc.nvim">COC</a>, you can add support for validating pricing.json files like so:</p>
<ol>
<li><p>Ensure that <code>coc-json</code> is enabled. You can do this by running <code>:CocInstall coc-json</code> or by having something like the following in your <code>~/.vimrc</code>:</p>
<pre><code class="lang-plaintext"> let g:coc_global_extensions = ['coc-json']
</code></pre>
</li>
<li><p>Run <code>:CocConfig</code> to option the configuration file for coc. (By default this is <code>~/.config/nvim/coc-settings.json</code>.)</p>
</li>
<li><p>Add the following field to the object there (if it already exists) or add it as a new top level object:</p>
<pre><code class="lang-json"> {
   <span class="hljs-attr">"json.schemas"</span>: [
     {
       <span class="hljs-attr">"fileMatch"</span>: [<span class="hljs-string">"pricing.json"</span>],
       <span class="hljs-attr">"url"</span>: <span class="hljs-string">"https://www.tier.run/docs/pricing.schema.json"</span>
     }
   ]
 }
</code></pre>
</li>
</ol>
<p>Here's what it looks like in action:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1667930950185/Q_yVFfvdj.png" alt="screenshot of vim showing a warning about invalid pricing.json" /></p>
<p>That's it!</p>
]]></content:encoded></item><item><title><![CDATA[Tier Free with a Tier CLI and SDKs]]></title><description><![CDATA[We are proud to share Tier CLI, a tool that lets you define and manage your SaaS application's pricing model following best PriceOps practices. 
Pricing is the most effective lever to unlock SaaS performance. However, attempts to iterate on pricing a...]]></description><link>https://blog.tier.run/tier-free-with-a-tier-cli-and-sdks</link><guid isPermaLink="true">https://blog.tier.run/tier-free-with-a-tier-cli-and-sdks</guid><category><![CDATA[stripe]]></category><category><![CDATA[SaaS]]></category><category><![CDATA[billing]]></category><dc:creator><![CDATA[Jevon MacDonald]]></dc:creator><pubDate>Wed, 02 Nov 2022 11:58:34 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1666973814530/qC_sM_xDz.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>We are proud to share <a target="_blank" href="https://github.com/tierrun/tier/">Tier CLI</a>, a tool that lets you define and manage your SaaS application's pricing model following best <a target="_blank" href="https://priceops.org">PriceOps</a> practices. </p>
<p>Pricing is the most effective lever to unlock SaaS performance. However, attempts to iterate on pricing are too often hamstrung by complicated workflows, ad hoc conventions, and hidden cross-organization dependencies.</p>
<p><a target="_blank" href="https://www.tier.run">Tier</a> helps you to define a single source of pricing truth that can be safely and easily updated, with a simple json definition optimized for SaaS use cases. This keeps everything aligned as you find the best product-market fit.</p>
<h3 id="heading-why-we-are-building-tier">Why we are building Tier</h3>
<blockquote>
<p>We are building Tier to bring sanity to the process of implementing and modifying software pricing. </p>
</blockquote>
<p>It's a common pattern to build an app, API or service without any built-in logic to manage pricing, plans or customer access. At some point, it's time to charge money for your product. Eventually, you have to make a change to that pricing, either by modifying the features it grants access to or changing the price or both. Without a single source of truth, a change anywhere means making changes everywhere.</p>
<h3 id="heading-building-something-maintainable">Building something maintainable</h3>
<p>Typically there is no single point of truth for pricing in software. Do you know where to look to see which of your users are paying, what they are entitled to access, and how they will be impacted by future changes? Most of us don't. </p>
<p>If you are at this stage, you may be familiar with the different products out there:</p>
<ul>
<li>Subscription Management tools</li>
<li>Configure Price Quote </li>
<li>Payment gateways</li>
<li>Metering services
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1666971402064/BAgNBeZlU.png" alt="grid1.png" class="image--center mx-auto" /></li>
</ul>
<p>Your app or service also likely has some type of user authentication and authorization service. You may be using a feature flagging service to manage feature enablement for end users. </p>
<p>Most of the time you will end up writing custom connectors between these tools. Keeping track of which tool holds the authoritative data for any given request is unwieldy. </p>
<h3 id="heading-configuration-is-the-foundation-for-a-safe-system">Configuration is the foundation for a safe system</h3>
<p>As part of this release, we are also sharing more about <a target="_blank" href="https://www.tier.run/docs/pricing.json">pricing.json</a> and our overall configuration-driven approach to Price Operations. </p>
<p>Our goal is to make software price operations safe, easy and reliable.</p>
<blockquote>
<h4 id="heading-safe">Safe</h4>
<p>All pricing configurations are <strong>immutable and versioned</strong> within Tier. Once pushed, a plan version and its associated data cannot be changed. This protects against one system being updated, while another gets out of sync. </p>
<h4 id="heading-easy">Easy</h4>
<p>Streamlined interfaces are available for pricing configuration, processing and publishing. </p>
<h4 id="heading-reliable">Reliable</h4>
<p>A pricing change or packaging reconfiguration will not be applied unless it can be done successfully.</p>
</blockquote>
<h3 id="heading-introducing-tier-clihttpsgithubcomtierruntier">Introducing <a target="_blank" href="https://github.com/tierrun/tier">Tier CLI</a></h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1666929976844/DhIoBM7qh.gif" alt="render1666929857020.gif" /></p>
<p>Today's release is the Tier CLI. A powerful tool to manage your Stripe account using <a target="_blank" href="https://www.priceops.org">PriceOps</a> patterns. </p>
<p>The Tier CLI will interface directly with your Stripe account in order to reliably manage your product, pricing, subscription and metering data. </p>
<p>You can then use a <a target="_blank" href="https://www.tier.run/docs/sdk/">Tier SDK</a> to implement usage limits and metering in your app or service. 
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1666974779403/aDZbi0o8O.png" alt="stripey.png" /></p>
<p>Our design goal is to make using the Tier CLI <strong>easier than using Stripe itself</strong>. With the SDK implemented, you will be able to make pricing changes without having to make code changes.</p>
<blockquote>
<p>"With the SDK implemented, you will be able to make pricing changes without having to make code changes."</p>
</blockquote>
<p>By using <a target="_blank" href="https://www.tier.run/docs/pricing.json/">pricing.json</a>, the <a target="_blank" href="https://www.tier.run/docs/cli/">Tier CLI</a> and our <a target="_blank" href="https://www.tier.run/docs/sdk/">SDKs</a>, you can begin safely and reliably applying pricing changes to your products and services. You can also request current limits for metered features, and report usage to stripe. The CLI will act as a sidecar in order to gracefully manage communication with Stripe.</p>
<h3 id="heading-thank-you">Thank You!</h3>
<p>We've spent a lot of time with many eager customers in the last 8 months. These testers have given us an endless amount of insight and have helped us continually improve our design and implementation of <a target="_blank" href="https://www.tier.run">Tier</a>, the <a target="_blank" href="https://github.com/tierrun/tier">Tier CLI</a> and our <a target="_blank" href="https://www.tier.run/docs/sdk/">SDK</a>s. </p>
<p>There is much more coming that we are eager to share with you! </p>
<ul>
<li><a target="_blank" href="https://blog.tier.run/tier-hello-world-demo">Hello World example</a></li>
<li><a target="_blank" href="https://tier.run/docs">Read our docs</a></li>
<li><a target="_blank" href="https://join.slack.com/t/tier-community/shared_invite/zt-1blotqjb9-wvkYMo8QkhaEWziprdjnIA">Join our Slack</a></li>
<li><a target="_blank" href="https://cal.com/tier/tier-demo">Get a demo of the full set of Tier services</a></li>
</ul>
<p>Jevon, Blake and Isaac.</p>
]]></content:encoded></item><item><title><![CDATA[Tier Hello World Demo]]></title><description><![CDATA[This is an example application that shows using Tier to integrate pricing, in a way that makes it possible to implement best PriceOps practices with a trivial amount of effort.
The example app is exceedingly simple, but the principles are flexible en...]]></description><link>https://blog.tier.run/tier-hello-world-demo</link><guid isPermaLink="true">https://blog.tier.run/tier-hello-world-demo</guid><category><![CDATA[tier]]></category><category><![CDATA[demo]]></category><category><![CDATA[Hello World]]></category><category><![CDATA[simple]]></category><category><![CDATA[stripe]]></category><dc:creator><![CDATA[Isaac Schlueter]]></dc:creator><pubDate>Tue, 01 Nov 2022 16:21:19 GMT</pubDate><content:encoded><![CDATA[<p>This is an example application that shows using Tier to integrate pricing, in a way that makes it possible to implement best <a target="_blank" href="https://priceops.org">PriceOps</a> practices with a trivial amount of effort.</p>
<p>The example app is exceedingly simple, but the principles are flexible enough to easily be put into practice in much more complicated applications.</p>
<p>All of the code for this demo is available on GitHub, at <a target="_blank" href="https://github.com/tierrun/tier-node-demo">tierrun/tier-node-demo</a>.</p>
<h2 id="heading-the-app">The App</h2>
<p>The application we'll be monetizing is a simple temperature conversion app. If you give it a Fahrenheit temperature, it'll convert it to Celsius, and vice versa. This is provided via a simple site built on <a target="_blank" href="https://expressjs.com">express</a>.</p>
<p>To see the app as it exists <em>before</em> adding any Tier integration, check out the <a target="_blank" href="https://github.com/tierrun/tier-node-demo/tree/pre-tier"><code>pre-tier</code> branch</a>.</p>
<h2 id="heading-nothing-up-our-sleeves">Nothing Up Our Sleeves</h2>
<p>Nothing described here relies on any services running on https://tier.run, or anything at all other than Stripe.</p>
<p>You can think of Tier as a very fancy Stripe client that manages metadata and connections. It sets up your system so that the path of least resistance is also the path of optimum <a target="_blank" href="https://priceops.org">PriceOps</a>.</p>
<h2 id="heading-setting-up-tier">Setting Up Tier</h2>
<p>First, we'll have to <a target="_blank" href="https://tier.run/docs/install">install the Tier binary</a>. On macOS machines, you can do this with Homebrew:</p>
<pre><code class="lang-plaintext">brew install tierrun/tap/tier
</code></pre>
<p>Binaries for major architectures can be found <a target="_blank" href="https://github.com/tierrun/tier/releases">on GitHub</a>.</p>
<p>You can also install it using <code>go</code> version 1.19 or later:</p>
<pre><code class="lang-plaintext">go install tier.run/cmd/tier@latest
</code></pre>
<p>Once it's installed, use the <a target="_blank" href="https://tier.run/docs/cli/connect"><code>tier connect</code></a> command to give Tier access to your Stripe account. By default, Tier will only work on test mode Stripe data, using a restricted key with permissions that you can easily lock down.</p>
<p>Alternatively, you can set the <code>STRIPE_API_KEY</code> in the environment, if you have a key that you'd like Tier to use.</p>
<h2 id="heading-installing-tier-sdk">Installing Tier SDK</h2>
<p>In the app, we install the Tier SDK by running:</p>
<pre><code class="lang-plaintext">npm install tier
</code></pre>
<p><a target="_blank" href="https://github.com/tierrun/tier-node-demo/commit/f32b5b4">f32b5b4</a></p>
<h2 id="heading-create-pricing-model">Create Pricing Model</h2>
<p>We create a pricing model by writing a <a target="_blank" href="https://www.tier.run/docs/pricing.json"><code>pricing.json</code> file</a>.</p>
<p>The pricing model is a simple free/pro scheme. Free accounts get 10 free temperature conversions per month, then they have to upgrade.</p>
<p>Pro accounts cost $10 per month, and get 100 conversions per month included with that base price. Beyond that, they will be charged $0.01 per conversion.</p>
<p>To do this, we define two plans in our pricing.json file with the appropriate tiers. We're calling the feature <code>feature:convert</code>.</p>
<pre><code class="lang-json">{
  <span class="hljs-attr">"plans"</span>: {
    <span class="hljs-attr">"plan:free@1"</span>: {
      <span class="hljs-attr">"title"</span>: <span class="hljs-string">"Convert (free)"</span>,
      <span class="hljs-attr">"features"</span>: {
        <span class="hljs-attr">"feature:convert"</span>: {
          <span class="hljs-attr">"title"</span>: <span class="hljs-string">"Temperature Conversions"</span>,
          <span class="hljs-attr">"tiers"</span>: [
            {
              <span class="hljs-attr">"upto"</span>: <span class="hljs-number">10</span>,
              <span class="hljs-attr">"price"</span>: <span class="hljs-number">0</span>
            }
          ]
        }
      }
    },
    <span class="hljs-attr">"plan:pro@1"</span>: {
      <span class="hljs-attr">"title"</span>: <span class="hljs-string">"Convert (Pro)"</span>,
      <span class="hljs-attr">"features"</span>: {
        <span class="hljs-attr">"feature:convert"</span>: {
          <span class="hljs-attr">"title"</span>: <span class="hljs-string">"Temperature Conversions"</span>,
          <span class="hljs-attr">"tiers"</span>: [
            {
              <span class="hljs-attr">"base"</span>: <span class="hljs-number">1000</span>,
              <span class="hljs-attr">"price"</span>: <span class="hljs-number">0</span>,
              <span class="hljs-attr">"upto"</span>: <span class="hljs-number">100</span>
            },
            {
              <span class="hljs-attr">"price"</span>: <span class="hljs-number">1</span>
            }
          ]
        }
      }
    }
  }
}
</code></pre>
<p>The most important part is that plans are named like <code>plan:&lt;name&gt;@&lt;version&gt;</code>, and features start with <code>feature:</code>. But if you try to do something against the rules, Tier will give you an error telling you what's wrong.</p>
<p>When we want to change this scheme, we can add a new plan (or a new version of the <code>free</code> or <code>pro</code> plan). Any customers still on the old version will be unaffected.</p>
<p>To push the pricing model live, run:</p>
<pre><code class="lang-plaintext">tier push pricing.json
</code></pre>
<p><a target="_blank" href="https://github.com/tierrun/tier-node-demo/commit/3f6e7cf">3f6e7cf</a></p>
<h2 id="heading-the-pricing-page">The <code>/pricing</code> Page</h2>
<p>In order to create a nice little two-column page showing the plan options, we can pull the highest version of each plan with the <code>tier.pullLatest()</code> method, and hand that object off to our <a target="_blank" href="https://github.com/tierrun/tier-node-demo/blob/main/lib/templates/pricing.ejs">template</a> to turn into HTML. I'm using EJS in this example, because it's so dead simple to throw together an example like this, but you can of course do the same thing with React, nunjucks, or any other templating system.</p>
<p>Note: beware that this is definitely some demo magic. We're just sorting the plan versions lexically, but in practice, you'll probably want a config or some other system to say what the "public" version of any given plan is, so you don't end up with something like <code>plan:free@zzzZZZ:final2.final.latest.final</code>. The <code>tier.pullLatest()</code> method is marked as "experimental" in the Node SDK for this reason, we expect to add more utility in this area soon.</p>
<p>The important part is that we're <em>not</em> reading the file from disk, or hard-coding the plan details into our app. Instead, we pull from the single source of truth, and let that drive the rest of the system.</p>
<p><a target="_blank" href="https://github.com/tierrun/tier-node-demo/commit/c0a7859">c0a7859</a></p>
<h2 id="heading-subscribing-users-to-plans">Subscribing Users To Plans</h2>
<p>Stripe doesn't really have a concept of a "plan". There are <em>Products</em> which have <em>Prices</em>, and multiple Price objects can be attached to a customer's subscription.</p>
<p>Each of those Price objects has a unique identifier. So, if you want to treat multiple "Prices" as a "plan", you have to keep track of them to use the right ones when creating a subscription. As you add more tracked features, and test more different iterations of packaging them up into plans for customers, the complexity increases geometrically.</p>
<p>Thankfully, using Tier, we can just do:</p>
<pre><code class="lang-js"><span class="hljs-keyword">await</span> tier.subscribe(org, plan)
</code></pre>
<p>All of the Price objects associated with the plan will be attached automatically.</p>
<p>The <code>org</code> is an opaque string that identifies the customer. It must start with <code>org:</code>, and it must be unique, but you can use whatever identifier you use for customers in your system already. These are all perfectly acceptable: <code>org:user@email.com</code>, <code>org:beefcafebad1d3a</code>, <code>org:213415-221321-4321</code>. There's (almost) never any reason to deal with the Stripe Customer ID.</p>
<p>The <code>plan</code> is the <code>plan:&lt;name&gt;@&lt;version&gt;</code> from your <code>pricing.json</code> model. You should not hard code this! In the demo, you'll note that we get it from a <code>POST</code> request when the user clicks the "Subscribe" button on the programmatically generated pricing page.</p>
<p>No matter how many versions of your plans you have, the plan identifier is all you need to create the correct subscription for your customer.</p>
<blockquote>
<p>Note: you <em>can</em> still create subscriptions using Tier that mix and match any prices and entitlements you like. We'll cover that in a future "advanced usage" blog post, as it's out of scope for a "Hello, World" app such as this.</p>
</blockquote>
<p><a target="_blank" href="https://github.com/tierrun/tier-node-demo/commit/ecb1cf1">ecb1cf1</a></p>
<h2 id="heading-reporting-usage">Reporting Usage</h2>
<p>Just like with subscriptions, rather than having to track Price objects to know how to report feature usage to Stripe, using Tier, we just need the <code>org:...</code> identifier and the feature name from your pricing model.</p>
<pre><code class="lang-js"><span class="hljs-keyword">await</span> tier.report(org, <span class="hljs-string">'feature:convert'</span>)
</code></pre>
<p>The default count is 1, but if you want to report more than 1 of something, you can just pass <code>n</code> as the third argument:</p>
<pre><code class="lang-js"><span class="hljs-keyword">await</span> tier.report(org, <span class="hljs-string">'feature:morethanone'</span>, <span class="hljs-number">100</span>)
</code></pre>
<p>In this demo, we're reporting feature usage right at the point of delivery. For many use cases, that's perfectly fine. But, for example, if you're tracking download bandwidth or some other high-volume metric, you can of course roll that up and report it in a batch at any cadence that makes sense for your application.</p>
<p>The caveat, of course, is that the usage data you pull from Tier won't be fully up to date if you haven't yet updated it.</p>
<p><a target="_blank" href="https://github.com/tierrun/tier-node-demo/commit/18bfb50">18bfb50</a></p>
<h2 id="heading-limiting-access">Limiting Access</h2>
<p>We said that users on the <code>free</code> account can only get 10 conversions per month. In order to make sure they haven't gone over (and that they're on a plan that has access to the feature at all!) we can call the <code>tier.limit</code> method, like this:</p>
<pre><code class="lang-js"><span class="hljs-keyword">const</span> usage = <span class="hljs-keyword">await</span> tier.limit(org, feature)
</code></pre>
<p>This method will return an object with <code>used</code> and <code>limit</code> fields, which you can check to see whether the feature should be enabled.</p>
<p>Again, there's no need to keep track of Customer or Price objects, or even know what plan a user is subscribed to. Just check whether they have access to the feature, and if so, give them the feature.</p>
<p><a target="_blank" href="https://github.com/tierrun/tier-node-demo/commit/920f8c1">920f8c1</a></p>
<h2 id="heading-changing-plans">Changing Plans</h2>
<p>You can try out changing the pricing model any time you like, as often as you like:</p>
<pre><code class="lang-plaintext">tier push pricing-2.json
</code></pre>
<p>When you do this, the <code>/pricing</code> page gets updated with the new version of the plan, but importantly, the customer's plan <em>isn't</em> changed. With Tier, grandparenting in your existing userbase is the default, so you never have a situation where you try a different price, and make everyone upset.</p>
<p>In fact, you could even have multiple versions of a plan living side by side, and see which one encourages better user behavior or gets better conversions.</p>
<h2 id="heading-collecting-payment-info">Collecting Payment Info</h2>
<p>For this, we still will need to go direct to Stripe, so that the user can submit their credit card information directly to Stripe from their browser, using <code>stripe.Elements</code>.</p>
<p>Thankfully, the <code>tier.whois(org)</code> method will give us their Stripe Customer ID.</p>
<p><a target="_blank" href="https://github.com/tierrun/tier-node-demo/commit/cd8b1ae">cd8b1ae</a></p>
<h2 id="heading-thats-it">That's it!</h2>
<p>In this demo, we took a working application and monetized it, without ever having to worry about managing Stripe object identifiers, and any future change to our pricing model is trivial.</p>
<p>There's a lot more documentation available <a target="_blank" href="https://tier.run/docs">on the Tier website</a>. Try it out, and <a target="_blank" href="https://join.slack.com/t/tier-community/shared_invite/zt-1blotqjb9-wvkYMo8QkhaEWziprdjnIA">let us know what you think</a>!</p>
]]></content:encoded></item><item><title><![CDATA[Who makes a good design partner?]]></title><description><![CDATA[The most important thing to know is: not every customer should be a design partner.
Think about your design partner program as a secret club where you only want to let a specific group of customers in. 

It is difficult and time-consuming to make a d...]]></description><link>https://blog.tier.run/who-makes-a-good-design-partner</link><guid isPermaLink="true">https://blog.tier.run/who-makes-a-good-design-partner</guid><category><![CDATA[SaaS]]></category><category><![CDATA[Startups]]></category><category><![CDATA[LeanStartup]]></category><dc:creator><![CDATA[Jevon MacDonald]]></dc:creator><pubDate>Sun, 09 Oct 2022 22:05:44 GMT</pubDate><content:encoded><![CDATA[<p>The most important thing to know is: <strong>not every customer should be a design partner</strong>.</p>
<p>Think about your design partner program as a secret club where you only want to let a specific group of customers in. </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1665151210736/8uLxpNCDt.gif" alt="You are a gatekeeper" class="image--center mx-auto" /></p>
<p>It is difficult and time-consuming to make a design partner successful, so you want to keep the bar high for participation. You also need to be sure your partner understands the nature of what they are signing up for (more on that in a later post). </p>
<p>What makes a good design partner? </p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://twitter.com/Kellblog/status/1451558105314217984">https://twitter.com/Kellblog/status/1451558105314217984</a></div>
<h2 id="heading-a-good-design-partner-understands-what-makes-you-unique">A good design partner understands what makes you unique</h2>
<p>The ideal partner is motivated by a design to make your vision a reality. Why are you building something that is better than what can be purchased from a competitor? </p>
<p>As part of your acceptance criteria, you need to be confident that your prospect understands this clearly. If they don't, they go into your regular sales/engagement funnel. </p>
<h2 id="heading-design-partners-have-a-selfish-motivation">Design partners have a selfish motivation</h2>
<p>It's not enough that they want to see you succeed, a design partner needs to clearly understand the benefits for themselves.</p>
<p>Of course, every customer needs to understand this, but a design partner needs to be able to justify an above-average commitment of time and attention. That's a high bar and if you don't meet it then you will find your design partners lose interest quickly. </p>
<p>Regular check-ins are critical to maintaining excitement and alignment around your program. Without that, customers will lose interest and find it hard to continue to invest their time. </p>
<h2 id="heading-design-partners-can-prioritize-work">Design partners can prioritize work</h2>
<p>Your partner needs to be able to dedicate their own time and often their team's time. That often means that the right design partner isn't an IC or even an executive. Often it's a Product or Engineering Manager who desperately wants to solve the problem you are addressing</p>
<h2 id="heading-design-partners-engage-quickly">Design partners engage quickly</h2>
<p>One way prospects show their commitment is with their money. The other way is with their time and attention. </p>
<p>How do you know if a prospective partner is serious to not? <strong>They don't waste time</strong>. </p>
<p>If they join your Slack, show up for recurring meetings, and prioritize the work they need to do to unlock great feedback, then you've found yourself a diamond in the rough. </p>
<p><strong>Design Partner qualification checklist:</strong> 📝</p>
<ol>
<li>Understands what makes you unique</li>
<li>Have clear and defined goals for themselves</li>
<li>Can prioritize the work needed. </li>
<li>Engage quickly and reliably</li>
</ol>
<p>Now that you know who and what to look for, it's time to go find these mythical unicorns. </p>
<p>Hold on tight, now things are about to get real!</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1665151780855/75uD15zqN.gif" alt="200.gif" class="image--center mx-auto" /></p>
<blockquote>
<p>Sign up for our newsletter to get all future articles in the Design Partner series, along with our templates and step by step guide to help get you started.</p>
</blockquote>
]]></content:encoded></item></channel></rss>