<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Jevon MacDonald</title>
    <description>The latest articles on Forem by Jevon MacDonald (@tier).</description>
    <link>https://forem.com/tier</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F962637%2F69c9e6e9-9b06-4eba-ac7d-a8636714691d.png</url>
      <title>Forem: Jevon MacDonald</title>
      <link>https://forem.com/tier</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/tier"/>
    <language>en</language>
    <item>
      <title>Stripe Glossary</title>
      <dc:creator>Jevon MacDonald</dc:creator>
      <pubDate>Tue, 06 Dec 2022 19:20:44 +0000</pubDate>
      <link>https://forem.com/tier/stripe-glossary-4aed</link>
      <guid>https://forem.com/tier/stripe-glossary-4aed</guid>
      <description>&lt;p&gt;Stripe Glossary available at &lt;a href="https://github.com/tierrun/tier/wiki/Stripe-Glossary"&gt;github.com/tierrun/tier/wiki/Stripe-Glossary&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Getting to know Stripe can take some time. Not only are there a lot of new concepts to learn, &lt;a href="https://stripe.com"&gt;Stripe&lt;/a&gt; sometimes likes to use esoteric definitions for some things, such as "&lt;a href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#good-better-best"&gt;Good-better-best&lt;/a&gt;".&lt;/p&gt;

&lt;p&gt;We have developed a &lt;a href="https://github.com/tierrun/tier/wiki/Stripe-Glossary"&gt;Stripe Glossary&lt;/a&gt; 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.&lt;/p&gt;

&lt;p&gt;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 &lt;a href="https://www.stripe.com"&gt;Stripe&lt;/a&gt; and its capabilities.&lt;/p&gt;

&lt;p&gt;You can find the working glossary here: &lt;a href="https://github.com/tierrun/tier/wiki/Stripe-Glossary"&gt;&lt;strong&gt;https://github.com/tierrun/tier/wiki/Stripe-Glossary&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;.&lt;/strong&gt; We welcome any suggested updates that you might have.&lt;/p&gt;

&lt;p&gt;Here is the current list of terms, with direct links to their definitions.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#3d-secure"&gt;3D Secure&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#aggregate-metered-usage"&gt;Aggregate Metered Usage&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#aggregation-mode"&gt;Aggregation Mode&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#australian-business-numbers"&gt;Australian Business Numbers&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#billing-cycle-anchor"&gt;Billing Cycle Anchor&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#billing-threshold"&gt;Billing Threshold&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#client-platform"&gt;Client Platform&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#create-a-session"&gt;Create a Session&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#custom-accounts"&gt;Custom Accounts&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#customer-portal-session"&gt;Customer Portal (session)&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#dashboard"&gt;Dashboard&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#destination-charge"&gt;Destination Charge&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#direct-charge"&gt;Direct Charge&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#dunning-email"&gt;Dunning Email&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#european-vat-numbers"&gt;European VAT Numbers&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#exclusive-tax-behavior"&gt;Exclusive (Tax behavior)&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#express-account"&gt;Express Account&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#freemium"&gt;Freemium&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#good-better-best"&gt;Good-better-best&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#graduated-pricing"&gt;Graduated Pricing&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#inclusive-tax-behavior"&gt;Inclusive (Tax Behavior)&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#inline-pricing"&gt;Inline Pricing&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#landing-page"&gt;Landing Page&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#licensed-usage"&gt;Licensed Usage&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#metered-billing"&gt;Metered Billing&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#metered-usage"&gt;Metered Usage&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#multi-currency-prices"&gt;Multi-currency Prices&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#package-pricing"&gt;Package Pricing&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#pay-what-you-want-pricing"&gt;Pay-what-you-want Pricing&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#pause-payment-collection"&gt;Pause (Payment Collection)&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#paymentintent"&gt;PaymentIntent&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#payment-form"&gt;Payment Form&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#payment-status"&gt;Payment Status&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#payment-window"&gt;Payment Window.&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#per-seat"&gt;Per-seat&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#pricing-page"&gt;Pricing Page&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#priceops"&gt;PriceOps&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#product-catalog"&gt;Product Catalog&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#provision"&gt;Provision&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#quotes"&gt;Quotes&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#revenue-recognition"&gt;Revenue Recognition&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#reverse-charge"&gt;Reverse Charge&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#roll-ups"&gt;Roll Ups&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#setupintents"&gt;SetupIntents&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#sigma-queries"&gt;Sigma (queries)&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#smart-retries"&gt;Smart Retries&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#standard-account"&gt;Standard Account&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#standard-pricing"&gt;Standard Pricing&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#stripe"&gt;Stripe&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#stripe-cli"&gt;Stripe CLI&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#stripe-hosted-ui"&gt;Stripe-hosted UI&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#stripe-ruby-library"&gt;Stripe Ruby Library&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#stripe-tax"&gt;Stripe Tax&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#subscription"&gt;Subscription&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#subscription-events"&gt;Subscription Events&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#subscription-lifecycle"&gt;Subscription Lifecycle.&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#subscription-phases"&gt;Subscription Phases&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#subscription-schedules"&gt;Subscription Schedules&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#tax-exempt"&gt;Tax Exempt&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#tax-rates"&gt;Tax Rates&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#tiered-pricing"&gt;Tiered Pricing&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#trials"&gt;Trials&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#usage-based-pricing"&gt;Usage-based Pricing&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#variable-pricing"&gt;Variable Pricing&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#volume-based-billing"&gt;Volume Based Billing&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#upsell"&gt;Upsell&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#webhook"&gt;Webhook&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#webhook-endpoint"&gt;Webhook Endpoint&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/tierrun/tier/wiki/Stripe-Glossary#webhook-events"&gt;Webhook Events&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>stripe</category>
      <category>saas</category>
    </item>
    <item>
      <title>Tier CLI v0.6</title>
      <dc:creator>Jevon MacDonald</dc:creator>
      <pubDate>Wed, 30 Nov 2022 01:36:45 +0000</pubDate>
      <link>https://forem.com/tier/tier-cli-v06-mp2</link>
      <guid>https://forem.com/tier/tier-cli-v06-mp2</guid>
      <description>&lt;p&gt;You can &lt;a href="http://github.com/tierrun/tier/releases/tag/v0.6.0" rel="noopener noreferrer"&gt;find the Tier CLI v0.6 here&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;The v0.6 release introduces a way to manage customer data stored in stripe for any Tier managed org.&lt;/p&gt;

&lt;p&gt;To set the &lt;em&gt;email&lt;/em&gt;, &lt;em&gt;description&lt;/em&gt;, &lt;em&gt;name&lt;/em&gt;, &lt;em&gt;phone&lt;/em&gt;, or &lt;em&gt;user-defined metadata&lt;/em&gt;, for an org, set the new &lt;code&gt;info&lt;/code&gt; field for &lt;code&gt;/v1/subscribe&lt;/code&gt; request. In addition to this change, a minimum of one phase for a &lt;code&gt;/v1/subscribe&lt;/code&gt; request is no longer required.&lt;/p&gt;

&lt;p&gt;The new fields are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;description&lt;/li&gt;
&lt;li&gt;name&lt;/li&gt;
&lt;li&gt;phone&lt;/li&gt;
&lt;li&gt;email&lt;/li&gt;
&lt;li&gt;metadata&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Additionally, the &lt;code&gt;/v1/whois&lt;/code&gt; endpoint will now report up-to-date attributes if the query parameter &lt;code&gt;include=info&lt;/code&gt; is present.&lt;/p&gt;

&lt;p&gt;Both &lt;a href="https://www.tier.run/docs/sdk/" rel="noopener noreferrer"&gt;the Go and Node SDKs have been updated&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Please head over to &lt;a href="https://tier.run/releases" rel="noopener noreferrer"&gt;https://tier.run/releases&lt;/a&gt; to check out more changes and install options. As always, &lt;code&gt;brew upgrade tierrun/tap/tier&lt;/code&gt; works too!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If you haven't used Tier yet, these resources are a good place to get started:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://blog.tier.run/tier-hello-world-demo" rel="noopener noreferrer"&gt;Hello World! example&lt;/a&gt; - Step by step guide to adding Tier to your new or existing codebase&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://tier.run/docs/quickstart" rel="noopener noreferrer"&gt;Quick Start Guide&lt;/a&gt; - Step by step to
getting up and running with Tier.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://tier.run/docs/recipes" rel="noopener noreferrer"&gt;Recipes&lt;/a&gt; - Example common pricing models and
their corresponding Tier &lt;code&gt;pricing.json&lt;/code&gt; representations.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://tier.run/docs/cli" rel="noopener noreferrer"&gt;CLI Reference&lt;/a&gt; - Documentation for the Tier
command line tool.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

</description>
      <category>newyearchallenge</category>
      <category>gratitude</category>
    </item>
    <item>
      <title>Questions you should ask when interviewing at a startup</title>
      <dc:creator>Jevon MacDonald</dc:creator>
      <pubDate>Tue, 29 Nov 2022 16:17:51 +0000</pubDate>
      <link>https://forem.com/tier/questions-an-engineer-should-ask-when-interviewing-at-a-startup-4a0h</link>
      <guid>https://forem.com/tier/questions-an-engineer-should-ask-when-interviewing-at-a-startup-4a0h</guid>
      <description>&lt;p&gt;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. &lt;/p&gt;

&lt;p&gt;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. &lt;/p&gt;

&lt;p&gt;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. &lt;/p&gt;

&lt;p&gt;How can you turn any interview from boring to engaging? From mundane to exciting? &lt;strong&gt;Asking great questions!&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;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. &lt;/p&gt;

&lt;p&gt;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. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. What is the team culture like? Why is it like that?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;Other questions you could ask:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How do decisions get made?&lt;/li&gt;
&lt;li&gt;What happens if there isn't consensus? &lt;/li&gt;
&lt;li&gt;How often does the entire company meet? Who leads that meeting?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;2. What do you think sets this company apart from its competitors?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;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. &lt;/p&gt;

&lt;p&gt;Other questions you could ask:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Do you have product-market fit? When did you find it? What has changed since then?&lt;/li&gt;
&lt;li&gt;Do customer's help shape the roadmap? What kinds of requests do they make?&lt;/li&gt;
&lt;li&gt;Who does support? How do they share feedback/requests/requirements with the rest of the company?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;*&lt;em&gt;3. What is the company's mission and vision? *&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;Other questions you could ask:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Does this mission statement/vision/values change often? &lt;/li&gt;
&lt;li&gt;How could they change over time?&lt;/li&gt;
&lt;li&gt;Does everyone in the company have a hand in crafting the vision, or is it shared by leadership? &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;4. What challenges has the company faced and how did it overcome them?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How much runway does the company have?&lt;/li&gt;
&lt;li&gt;Do you plan to raise more money? Do you have a rough idea of when? &lt;/li&gt;
&lt;li&gt;Is the company profitable, or does it plan to be profitable? How are you balance growth with stability/runway.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;5. What is the company's growth strategy?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;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 &lt;em&gt;rreeallllyyy&lt;/em&gt; need to now this stuff, right?" kind of vibe.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What metrics are you focused on? &lt;/li&gt;
&lt;li&gt;How do you decide which work to prioritize to support growth? &lt;/li&gt;
&lt;li&gt;How important is account expansion vs new business?&lt;/li&gt;
&lt;li&gt;How did you come up with the current pricing? Is it working as-is or do you have plans to change it? &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;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. &lt;/p&gt;

</description>
      <category>webdev</category>
      <category>interview</category>
      <category>hiring</category>
      <category>programming</category>
    </item>
    <item>
      <title>Tier v0.5.2</title>
      <dc:creator>Jevon MacDonald</dc:creator>
      <pubDate>Wed, 23 Nov 2022 17:44:01 +0000</pubDate>
      <link>https://forem.com/tier/tier-v052-2o61</link>
      <guid>https://forem.com/tier/tier-v052-2o61</guid>
      <description>&lt;p&gt;We just &lt;a href="https://github.com/tierrun/tier"&gt;released v0.5.2&lt;/a&gt;, with some exciting new enhancements and features.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Switch preallocations&lt;/strong&gt;: The &lt;code&gt;tier switch -c&lt;/code&gt; command now preallocates switch accounts which means after the first switch account is created, subsequent uses of &lt;code&gt;tier switch -c&lt;/code&gt; should be noticeably faster, like, complete in 10us fast! This is because it can now avoid waiting on slow API calls to Stripe.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Z5Y0Ar6h--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1669166841281/-hh3FSdDl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Z5Y0Ar6h--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1669166841281/-hh3FSdDl.png" alt="" width="586" height="238"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Plan immutability&lt;/strong&gt;: Plans are now 100% immutable, as was originally planned. To upgrade all existing Tier plans to be 100% immutable, please run &lt;code&gt;tier pull | tier push&lt;/code&gt; - 2 times; The second should produce output saying &lt;code&gt;[plan already exists]&lt;/code&gt;, which is your confirmation the migration was successful.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Deep links&lt;/strong&gt;: Push now outputs deep links to the corresponding prices in Stripe.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Clean command&lt;/strong&gt;:  We added the &lt;code&gt;tier clean -switchaccounts&lt;/code&gt; 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 &lt;code&gt;tier clean -h&lt;/code&gt; for more information.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Please head over to &lt;a href="https://tier.run/releases"&gt;https://tier.run/releases&lt;/a&gt; to check out more changes and install options. As always, &lt;code&gt;brew upgrade tierrun/tap/tier&lt;/code&gt; works too! &lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>programming</category>
      <category>stripe</category>
    </item>
    <item>
      <title>5 things you need to know about Stripe's Test Mode</title>
      <dc:creator>Jevon MacDonald</dc:creator>
      <pubDate>Thu, 17 Nov 2022 18:30:16 +0000</pubDate>
      <link>https://forem.com/tier/5-things-you-need-to-know-about-stripes-test-mode-2gcb</link>
      <guid>https://forem.com/tier/5-things-you-need-to-know-about-stripes-test-mode-2gcb</guid>
      <description>&lt;p&gt;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. &lt;/p&gt;

&lt;p&gt;As we encountered these issues while building &lt;a href="https://github.com/tierrun/tier" rel="noopener noreferrer"&gt;Tier&lt;/a&gt;, we decided to create &lt;a href="https://github.com/tierrun/tier#readme" rel="noopener noreferrer"&gt;&lt;code&gt;tier switch&lt;/code&gt;&lt;/a&gt; to make it easy to spin up test and preview environments. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;To learn more about the &lt;code&gt;switch&lt;/code&gt; command and how to use it to avoid these issues, &lt;a href="https://blog.tier.run/tier-switch-git-branch-for-stripe" rel="noopener noreferrer"&gt;please read this post and give it a try today&lt;/a&gt;. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Inconsistent UI
&lt;/h3&gt;

&lt;p&gt;One quirk of test mode is how it shows up in the stripe Dashboard. It’s easy to miss as you move between modes.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;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:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8qzoqzgrqsm8diu4dj2p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8qzoqzgrqsm8diu4dj2p.png" alt="Image description" width="800" height="362"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;The only way to find out who is associated with what clock is to drill down to the test clock’s screen.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5g22muemgltsq1r7prgs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5g22muemgltsq1r7prgs.png" alt="Image description" width="800" height="667"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h3&gt;
  
  
  Product and Price Debris
&lt;/h3&gt;

&lt;p&gt;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).&lt;/p&gt;

&lt;p&gt;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. &lt;/p&gt;

&lt;h3&gt;
  
  
  Key and ID Collisions
&lt;/h3&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Manual process of Deleting Test Data
&lt;/h3&gt;

&lt;p&gt;With the above gotchas in mind, we probably want to think about wiping the slate clean.&lt;/p&gt;

&lt;p&gt;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. &lt;/p&gt;

&lt;p&gt;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).&lt;/p&gt;

&lt;h3&gt;
  
  
  Keep the babies. Ignore the bath water.
&lt;/h3&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;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:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Extra API keys to manage&lt;/li&gt;
&lt;li&gt;Extra login credentials to manage&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;We can delay decluttering our account drop-down by triaging all of those accounts until another day.&lt;/p&gt;

&lt;h2&gt;
  
  
  Continuous Integration
&lt;/h2&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h1&gt;
  
  
  Make the &lt;code&gt;switch&lt;/code&gt;
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Tier is your new set of power tools for Stripe&lt;/strong&gt;. By using the &lt;code&gt;switch&lt;/code&gt; 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.&lt;/p&gt;

&lt;p&gt;With Tier, you get powerful features such as &lt;code&gt;switch&lt;/code&gt; along with our SDKs, metering, and feature flagging style entitlement checking. &lt;/p&gt;

&lt;p&gt;If you aren't already a Tier user, you can get started quickly and easily. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/tierrun/tier" rel="noopener noreferrer"&gt;Tier on GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.tier.run/docs/" rel="noopener noreferrer"&gt;Read Tier Docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.tier.run/tier-hello-world-demo" rel="noopener noreferrer"&gt;Hello World! getting started example&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>watercooler</category>
    </item>
    <item>
      <title>Tier: Like Terraform, for Stripe</title>
      <dc:creator>Jevon MacDonald</dc:creator>
      <pubDate>Sun, 13 Nov 2022 19:17:16 +0000</pubDate>
      <link>https://forem.com/tier/tier-like-terraform-for-stripe-3769</link>
      <guid>https://forem.com/tier/tier-like-terraform-for-stripe-3769</guid>
      <description>&lt;p&gt;We are proud to share &lt;a href="https://github.com/tierrun/tier/"&gt;Tier CLI&lt;/a&gt;, a tool that lets you define and manage your SaaS application's pricing model following best &lt;a href="https://priceops.org"&gt;PriceOps&lt;/a&gt; practices. &lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.tier.run"&gt;Tier&lt;/a&gt; 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.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why we are building Tier
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;We are building Tier to bring sanity to the process of implementing and modifying software pricing. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h3&gt;
  
  
  Building something maintainable
&lt;/h3&gt;

&lt;p&gt;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. &lt;/p&gt;

&lt;p&gt;If you are at this stage, you may be familiar with the different products out there:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Subscription Management tools&lt;/li&gt;
&lt;li&gt;Configure Price Quote &lt;/li&gt;
&lt;li&gt;Payment gateways&lt;/li&gt;
&lt;li&gt;Metering services
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vB1xuUDS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1666971402064/BAgNBeZlU.png%3Fauto%3Dcompress%2Cformat%26format%3Dwebp%2520align%3D%2522center%2522" alt="grid1.png" width="880" height="597"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;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. &lt;/p&gt;

&lt;p&gt;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. &lt;/p&gt;

&lt;h3&gt;
  
  
  Configuration is the foundation for a safe system
&lt;/h3&gt;

&lt;p&gt;As part of this release, we are also sharing more about &lt;a href="https://www.tier.run/docs/pricing.json"&gt;pricing.json&lt;/a&gt; and our overall configuration-driven approach to Price Operations. &lt;/p&gt;

&lt;p&gt;Our goal is to make software price operations safe, easy and reliable.&lt;/p&gt;

&lt;blockquote&gt;
&lt;h4&gt;
  
  
  Safe
&lt;/h4&gt;

&lt;p&gt;All pricing configurations are &lt;strong&gt;immutable and versioned&lt;/strong&gt; 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. &lt;/p&gt;
&lt;h4&gt;
  
  
  Easy
&lt;/h4&gt;

&lt;p&gt;Streamlined interfaces are available for pricing configuration, processing and publishing. &lt;/p&gt;
&lt;h4&gt;
  
  
  Reliable
&lt;/h4&gt;

&lt;p&gt;A pricing change or packaging reconfiguration will not be applied unless it can be done successfully.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Introducing &lt;a href="https://github.com/tierrun/tier"&gt;Tier CLI&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--2kIv9VQp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1666929976844/DhIoBM7qh.gif%3Fauto%3Dcompress%2Cformat%26format%3Dwebp%2520align%3D%2522left%2522" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2kIv9VQp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1666929976844/DhIoBM7qh.gif%3Fauto%3Dcompress%2Cformat%26format%3Dwebp%2520align%3D%2522left%2522" alt="render1666929857020.gif" width="880" height="379"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Today's release is the Tier CLI. A powerful tool to manage your Stripe account using &lt;a href="https://www.priceops.org"&gt;PriceOps&lt;/a&gt; patterns. &lt;/p&gt;

&lt;p&gt;The Tier CLI will interface directly with your Stripe account in order to reliably manage your product, pricing, subscription and metering data. &lt;/p&gt;

&lt;p&gt;You can then use a &lt;a href="https://www.tier.run/docs/sdk/"&gt;Tier SDK&lt;/a&gt; to implement usage limits and metering in your app or service. &lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--VKc1KibY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1666974779403/aDZbi0o8O.png%3Fauto%3Dcompress%2Cformat%26format%3Dwebp%2520align%3D%2522left%2522" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VKc1KibY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1666974779403/aDZbi0o8O.png%3Fauto%3Dcompress%2Cformat%26format%3Dwebp%2520align%3D%2522left%2522" alt="stripey.png" width="880" height="497"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Our design goal is to make using the Tier CLI &lt;strong&gt;easier than using Stripe itself&lt;/strong&gt;. With the SDK implemented, you will be able to make pricing changes without having to make code changes.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"With the SDK implemented, you will be able to make pricing changes without having to make code changes."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;By using &lt;a href="https://www.tier.run/docs/pricing.json/"&gt;pricing.json&lt;/a&gt;, the &lt;a href="https://www.tier.run/docs/cli/"&gt;Tier CLI&lt;/a&gt; and our &lt;a href="https://www.tier.run/docs/sdk/"&gt;SDKs&lt;/a&gt;, 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.&lt;/p&gt;

&lt;h3&gt;
  
  
  Thank You!
&lt;/h3&gt;

&lt;p&gt;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 &lt;a href="https://www.tier.run"&gt;Tier&lt;/a&gt;, the &lt;a href="https://github.com/tierrun/tier"&gt;Tier CLI&lt;/a&gt; and our &lt;a href="https://www.tier.run/docs/sdk/"&gt;SDK&lt;/a&gt;s. &lt;/p&gt;

&lt;p&gt;There is much more coming that we are eager to share with you! &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://blog.tier.run/tier-hello-world-demo"&gt;Hello World example&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tier.run/docs"&gt;Read our docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://join.slack.com/t/tier-community/shared_invite/zt-1blotqjb9-wvkYMo8QkhaEWziprdjnIA"&gt;Join our Slack&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cal.com/tier/tier-demo"&gt;Get a demo of the full set of Tier services&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Jevon, Blake and Isaac.&lt;/p&gt;

</description>
      <category>stripe</category>
      <category>billing</category>
      <category>saas</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Tier Hello World Demo</title>
      <dc:creator>Jevon MacDonald</dc:creator>
      <pubDate>Tue, 01 Nov 2022 23:08:12 +0000</pubDate>
      <link>https://forem.com/tier/tier-hello-world-demo-5fle</link>
      <guid>https://forem.com/tier/tier-hello-world-demo-5fle</guid>
      <description>&lt;p&gt;This is an example application that shows using Tier to integrate&lt;br&gt;
pricing, in a way that makes it possible to implement best&lt;br&gt;
&lt;a href="https://priceops.org"&gt;PriceOps&lt;/a&gt; practices with a trivial amount&lt;br&gt;
of effort.&lt;/p&gt;

&lt;p&gt;The example app is exceedingly simple, but the principles are&lt;br&gt;
flexible enough to easily be put into practice in much more&lt;br&gt;
complicated applications.&lt;/p&gt;

&lt;p&gt;All of the code for this demo is available on GitHub, at&lt;br&gt;
&lt;a href="https://github.com/tierrun/tier-node-demo"&gt;tierrun/tier-node-demo&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  The App
&lt;/h2&gt;

&lt;p&gt;The application we'll be monetizing is a simple temperature&lt;br&gt;
conversion app.  If you give it a Fahrenheit temperature, it'll&lt;br&gt;
convert it to Celsius, and vice versa.  This is provided via a&lt;br&gt;
simple site built on &lt;a href="https://expressjs.com"&gt;express&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;To see the app as it exists &lt;em&gt;before&lt;/em&gt; adding any Tier integration,&lt;br&gt;
check out the &lt;a href="https://github.com/tierrun/tier-node-demo/tree/pre-tier"&gt;&lt;code&gt;pre-tier&lt;/code&gt;&lt;br&gt;
branch&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  Nothing Up Our Sleeves
&lt;/h2&gt;

&lt;p&gt;Nothing described here relies on any services running on&lt;br&gt;
&lt;a href="https://tier.run"&gt;https://tier.run&lt;/a&gt;, or anything at all other than Stripe.&lt;/p&gt;

&lt;p&gt;You can think of Tier as a very fancy Stripe client that manages&lt;br&gt;
metadata and connections.  It sets up your system so that the&lt;br&gt;
path of least resistance is also the path of optimum&lt;br&gt;
&lt;a href="https://priceops.org"&gt;PriceOps&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  Setting Up Tier
&lt;/h2&gt;

&lt;p&gt;First, we'll have to &lt;a href="https://tier.run/docs/install"&gt;install the Tier&lt;br&gt;
binary&lt;/a&gt;.  On macOS machines, you&lt;br&gt;
can do this with Homebrew:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;brew install tierrun/tap/tier
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Binaries for major architectures can be found &lt;a href="https://github.com/tierrun/tier/releases"&gt;on&lt;br&gt;
GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You can also install it using &lt;code&gt;go&lt;/code&gt; version 1.19 or later:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;go install tier.run/cmd/tier@latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once it's installed, use the &lt;a href="https://tier.run/docs/cli/connect"&gt;&lt;code&gt;tier&lt;br&gt;
connect&lt;/code&gt;&lt;/a&gt; command to give Tier&lt;br&gt;
access to your Stripe account.  By default, Tier will only work&lt;br&gt;
on test mode Stripe data, using a restricted key with permissions&lt;br&gt;
that you can easily lock down.&lt;/p&gt;

&lt;p&gt;Alternatively, you can set the &lt;code&gt;STRIPE_API_KEY&lt;/code&gt; in the&lt;br&gt;
environment, if you have a key that you'd like Tier to use.&lt;/p&gt;
&lt;h2&gt;
  
  
  Installing Tier SDK
&lt;/h2&gt;

&lt;p&gt;In the app, we install the Tier SDK by running:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://github.com/tierrun/tier-node-demo/commit/f32b5b4"&gt;f32b5b4&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Create Pricing Model
&lt;/h2&gt;

&lt;p&gt;We create a pricing model by writing a &lt;a href="https://www.tier.run/docs/pricing.json"&gt;&lt;code&gt;pricing.json&lt;/code&gt;&lt;br&gt;
file&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The pricing model is a simple free/pro scheme.  Free accounts get&lt;br&gt;
10 free temperature conversions per month, then they have to upgrade.&lt;/p&gt;

&lt;p&gt;Pro accounts cost $10 per month, and get 100 conversions per&lt;br&gt;
month included with that base price.  Beyond that, they will be&lt;br&gt;
charged $0.01 per conversion.&lt;/p&gt;

&lt;p&gt;To do this, we define two plans in our pricing.json file with the&lt;br&gt;
appropriate tiers.  We're calling the feature &lt;code&gt;feature:convert&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"plans"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"plan:free@1"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Convert (free)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"features"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"feature:convert"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Temperature Conversions"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"tiers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="nl"&gt;"upto"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="nl"&gt;"price"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"plan:pro@1"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Convert (Pro)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"features"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"feature:convert"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Temperature Conversions"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"tiers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="nl"&gt;"base"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="nl"&gt;"price"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="nl"&gt;"upto"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="nl"&gt;"price"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The most important part is that plans are named like&lt;br&gt;
&lt;code&gt;plan:&amp;lt;name&amp;gt;@&amp;lt;version&amp;gt;&lt;/code&gt;, and features start with &lt;code&gt;feature:&lt;/code&gt;.  But&lt;br&gt;
if you try to do something against the rules, Tier will give you&lt;br&gt;
an error telling you what's wrong.&lt;/p&gt;

&lt;p&gt;When we want to change this scheme, we can add a new&lt;br&gt;
plan (or a new version of the &lt;code&gt;free&lt;/code&gt; or &lt;code&gt;pro&lt;/code&gt; plan).  Any&lt;br&gt;
customers still on the old version will be unaffected.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/tierrun/tier-node-demo/commit/3f6e7cf"&gt;3f6e7cf&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  The &lt;code&gt;/pricing&lt;/code&gt; Page
&lt;/h2&gt;

&lt;p&gt;In order to create a nice little two-column page showing the plan&lt;br&gt;
options, we can pull the highest version of each plan with the&lt;br&gt;
&lt;code&gt;tier.pullLatest()&lt;/code&gt; method, and hand that object off to our&lt;br&gt;
&lt;a href="https://github.com/tierrun/tier-node-demo/blob/main/lib/templates/pricing.ejs"&gt;template&lt;/a&gt;&lt;br&gt;
to turn into HTML.  I'm using EJS in this example, because it's&lt;br&gt;
so dead simple to throw together an example like this, but you&lt;br&gt;
can of course do the same thing with React, nunjucks, or any&lt;br&gt;
other templating system.&lt;/p&gt;

&lt;p&gt;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 &lt;code&gt;plan:free@zzzZZZ:final2.final.latest.final&lt;/code&gt;.  The &lt;code&gt;tier.pullLatest()&lt;/code&gt; method is marked as "experimental" in the Node SDK for this reason, we expect to add more utility in this area soon.&lt;/p&gt;

&lt;p&gt;The important part is that we're &lt;em&gt;not&lt;/em&gt; reading the file from&lt;br&gt;
disk, or hard-coding the plan details into our app.  Instead, we&lt;br&gt;
pull from the single source of truth, and let that drive the rest&lt;br&gt;
of the system.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/tierrun/tier-node-demo/commit/c0a7859"&gt;c0a7859&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Subscribing Users To Plans
&lt;/h2&gt;

&lt;p&gt;Stripe doesn't really have a concept of a "plan".  There are&lt;br&gt;
&lt;em&gt;Products&lt;/em&gt; which have &lt;em&gt;Prices&lt;/em&gt;, and multiple Price objects can be&lt;br&gt;
attached to a customer's subscription.&lt;/p&gt;

&lt;p&gt;Each of those Price objects has a unique identifier.  So, if you&lt;br&gt;
want to treat multiple "Prices" as a "plan", you&lt;br&gt;
have to keep track of them to use the right ones when creating a&lt;br&gt;
subscription.  As you add more tracked features, and test more&lt;br&gt;
different iterations of packaging them up into plans for&lt;br&gt;
customers, the complexity increases geometrically.&lt;/p&gt;

&lt;p&gt;Thankfully, using Tier, we can just do:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;tier&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;subscribe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;org&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;plan&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;All of the Price objects associated with the plan&lt;br&gt;
will be attached automatically.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;org&lt;/code&gt; is an opaque string that identifies the customer.  It&lt;br&gt;
must start with &lt;code&gt;org:&lt;/code&gt;, and it must be unique, but you can use&lt;br&gt;
whatever identifier you use for customers in your system already.&lt;br&gt;
These are all perfectly acceptable: &lt;code&gt;org:user@email.com&lt;/code&gt;,&lt;br&gt;
&lt;code&gt;org:beefcafebad1d3a&lt;/code&gt;, &lt;code&gt;org:213415-221321-4321&lt;/code&gt;.  There's&lt;br&gt;
(almost) never any reason to deal with the Stripe Customer ID.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;plan&lt;/code&gt; is the &lt;code&gt;plan:&amp;lt;name&amp;gt;@&amp;lt;version&amp;gt;&lt;/code&gt; from your&lt;br&gt;
&lt;code&gt;pricing.json&lt;/code&gt; model.  You should not hard code this!  In the&lt;br&gt;
demo, you'll note that we get it from a &lt;code&gt;POST&lt;/code&gt; request when the&lt;br&gt;
user clicks the "Subscribe" button on the programmatically&lt;br&gt;
generated pricing page.&lt;/p&gt;

&lt;p&gt;No matter how many versions of your plans you have, the plan identifier is&lt;br&gt;
all you need to create the correct subscription for your customer.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: you &lt;em&gt;can&lt;/em&gt; still create subscriptions using Tier that mix&lt;br&gt;
and match any prices and entitlements you like.  We'll cover&lt;br&gt;
that in a future "advanced usage" blog post, as it's out of&lt;br&gt;
scope for a "Hello, World" app such as this.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://github.com/tierrun/tier-node-demo/commit/ecb1cf1"&gt;ecb1cf1&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Reporting Usage
&lt;/h2&gt;

&lt;p&gt;Just like with subscriptions, rather than having to track Price objects&lt;br&gt;
to know how to report feature usage to Stripe, using Tier, we just need&lt;br&gt;
the &lt;code&gt;org:...&lt;/code&gt; identifier and the feature name from your pricing model.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;tier&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;report&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;org&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;feature:convert&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The default count is 1, but if you want to report more than 1 of&lt;br&gt;
something, you can just pass &lt;code&gt;n&lt;/code&gt; as the third argument:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;tier&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;report&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;org&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;feature:morethanone&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this demo, we're reporting feature usage right at the point&lt;br&gt;
of delivery.  For many use cases, that's perfectly fine.  But,&lt;br&gt;
for example, if you're tracking download bandwidth or some other&lt;br&gt;
high-volume metric, you can of course roll that up and report it&lt;br&gt;
in a batch at any cadence that makes sense for your application.&lt;/p&gt;

&lt;p&gt;The caveat, of course, is that the usage data you pull from Tier&lt;br&gt;
won't be fully up to date if you haven't yet updated it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/tierrun/tier-node-demo/commit/18bfb50"&gt;18bfb50&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Limiting Access
&lt;/h2&gt;

&lt;p&gt;We said that users on the &lt;code&gt;free&lt;/code&gt; account can only get 10&lt;br&gt;
conversions per month.  In order to make sure they haven't gone&lt;br&gt;
over (and that they're on a plan that has access to the feature&lt;br&gt;
at all!) we can call the &lt;code&gt;tier.limit&lt;/code&gt; method, like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;usage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;tier&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;org&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;feature&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This method will return an object with &lt;code&gt;used&lt;/code&gt; and &lt;code&gt;limit&lt;/code&gt; fields,&lt;br&gt;
which you can check to see whether the feature should be enabled.&lt;/p&gt;

&lt;p&gt;Again, there's no need to keep track of Customer or Price&lt;br&gt;
objects, or even know what plan a user is subscribed to.  Just&lt;br&gt;
check whether they have access to the feature, and if so, give&lt;br&gt;
them the feature.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/tierrun/tier-node-demo/commit/920f8c1"&gt;920f8c1&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Changing Plans
&lt;/h2&gt;

&lt;p&gt;You can try out changing the pricing model any time you like, as&lt;br&gt;
often as you like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;tier push pricing-2.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When you do this, the &lt;code&gt;/pricing&lt;/code&gt; page gets updated with the new&lt;br&gt;
version of the plan, but importantly, the customer's plan &lt;em&gt;isn't&lt;/em&gt;&lt;br&gt;
changed.  With Tier, grandparenting in your existing userbase is&lt;br&gt;
the default, so you never have a situation where you try a&lt;br&gt;
different price, and make everyone upset.&lt;/p&gt;

&lt;p&gt;In fact, you could even have multiple versions of a plan living&lt;br&gt;
side by side, and see which one encourages better user behavior&lt;br&gt;
or gets better conversions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Collecting Payment Info
&lt;/h2&gt;

&lt;p&gt;For this, we still will need to go direct to Stripe, so that the&lt;br&gt;
user can submit their credit card information directly to Stripe&lt;br&gt;
from their browser, using &lt;code&gt;stripe.Elements&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Thankfully, the &lt;code&gt;tier.whois(org)&lt;/code&gt; method will give us their&lt;br&gt;
Stripe Customer ID.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/tierrun/tier-node-demo/commit/cd8b1ae"&gt;cd8b1ae&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  That's it!
&lt;/h2&gt;

&lt;p&gt;In this demo, we took a working application and monetized it,&lt;br&gt;
without ever having to worry about managing Stripe object&lt;br&gt;
identifiers, and any future change to our pricing model is&lt;br&gt;
trivial.&lt;/p&gt;

&lt;p&gt;There's a lot more documentation available &lt;a href="https://tier.run/docs"&gt;on the Tier website&lt;/a&gt;.  Try it out, and &lt;a href="https://join.slack.com/t/tier-community/shared_invite/zt-1blotqjb9-wvkYMo8QkhaEWziprdjnIA"&gt;let us know what you think&lt;/a&gt;!&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>stripe</category>
    </item>
  </channel>
</rss>
