<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>/home/pierce</title>
    <description>Straight forward tutorials for tech minded people.
</description>
    <link>http://blog.dylanjpierce.com/</link>
    <atom:link href="http://blog.dylanjpierce.com/feed.xml" rel="self" type="application/rss+xml"/>
    <pubDate>Mon, 09 Mar 2026 17:00:15 +0000</pubDate>
    <lastBuildDate>Mon, 09 Mar 2026 17:00:15 +0000</lastBuildDate>
    <generator>Jekyll v3.9.5</generator>
    
      <item>
        <title>This image is now illegal in 5 states</title>
        <description>&lt;p&gt;&lt;img src=&quot;/assets/me-old-computer.png&quot; alt=&quot;Me as a kid building a computer from parts picked from the dump&quot; /&gt;&lt;/p&gt;

&lt;p&gt;While my haircut should be illegal in this photo, it’s the grainy screen in the background is what is becoming increasingly illegal here in the United States.&lt;/p&gt;

&lt;p&gt;This is me. Somewhere around 14 years old, hunched over a desk covered in screws, cables, and whatever else I could scrounge. The picture is grainy. The desk (and my hair) is a mess. But the feeling I had in that moment was very real: I just built a working computer from parts I picked out of a dump, and I finally managed to boot &lt;a href=&quot;https://www.damnsmalllinux.org/download.html&quot;&gt;Damn Small Linux&lt;/a&gt; on it.&lt;/p&gt;

&lt;p&gt;No one asked me for my ID. No one verified my age. No one told me I needed parental consent to boot an open source operating system.&lt;/p&gt;

&lt;p&gt;It was the beginning of a thrill that started my lifelong incessant interest in all things computers.&lt;/p&gt;

&lt;h2 id=&quot;5-states-and-counting&quot;&gt;5 states and counting&lt;/h2&gt;

&lt;p&gt;As of 2026, five US states have passed laws requiring age verification at the operating system level — not just for apps or websites, but for the OS itself:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;California&lt;/strong&gt; (AB 1043) — effective January 1, 2027. Requires all operating systems, including Linux, to collect a user’s birth date or age during account setup.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Colorado&lt;/strong&gt; (SB 26-051) — penalties beginning in 2028. Requires OS providers to collect and store age brackets and share this data with app stores.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Louisiana&lt;/strong&gt; (HB 570) — effective July 1, 2026.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Illinois&lt;/strong&gt; (SB 3977) — effective January 1, 2027.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Utah&lt;/strong&gt; (SB 142) — some provisions already active, with more activating throughout the year.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;New York has a bill proposed (S8102A) that goes even further, explicitly forbidding self-reporting and leaving allowed verification methods up to the Attorney General. More states will follow.&lt;/p&gt;

&lt;p&gt;These laws assume that every operating system has an account creation flow where age can be neatly verified. That might be true for Windows, macOS, iOS, and Android. But it is absolutely not true for Linux, BSD, or the hundreds of other open source operating systems that power much of the world’s infrastructure.&lt;/p&gt;

&lt;h2 id=&quot;you-cant-card-a-kernel&quot;&gt;You can’t card a kernel&lt;/h2&gt;

&lt;p&gt;Here’s where these laws fall apart entirely: open source operating systems.&lt;/p&gt;

&lt;p&gt;Arch Linux doesn’t have an account creation wizard. Gentoo compiles from source. Damn Small Linux fits on a business card-sized CD. There is no “sign up” flow. There is no corporation to serve a subpoena to. The author of your favorite distro might be a pseudonymous contributor in another country.&lt;/p&gt;

&lt;p&gt;How do you enforce age verification on software that anyone can download, modify, compile, and distribute? Who is liable — the person who wrote the bootloader? The volunteer who maintains the package mirror? The kid who burns the ISO to a USB stick?&lt;/p&gt;

&lt;p&gt;These laws betray a fundamental misunderstanding of how software works. They were written with Apple and Microsoft in mind, and open source got caught in the crossfire.&lt;/p&gt;

&lt;h2 id=&quot;gatekeeping-curiosity&quot;&gt;Gatekeeping curiosity&lt;/h2&gt;

&lt;p&gt;But the technical infeasibility isn’t even what bothers me the most. What bothers me is the message these laws send to the next generation.&lt;/p&gt;

&lt;p&gt;When I dragged those computer parts home from the dump, I wasn’t doing anything dangerous. I was learning. I was problem-solving. I was building something real with my hands and my brain, completely unsupervised, completely self-directed. Nobody curated that experience for me, and that’s exactly why it worked.&lt;/p&gt;

&lt;p&gt;That moment of raw, unsupervised exploration — pulling a computer out of the trash, figuring out which parts still worked, downloading an operating system that would fit on the tiny USB stick I had, and getting it to boot — that’s how real learning happens. Not from an age-gated app store. Not from a parental consent form. From doing the thing.&lt;/p&gt;

&lt;p&gt;The curiosity that led me to build that computer is the same curiosity that led me to learn programming, that led me to a career in software engineering, that led me to building my own business. You don’t develop that kind of curiosity inside a walled garden.&lt;/p&gt;

&lt;h2 id=&quot;punishing-the-next-generation&quot;&gt;Punishing the next generation&lt;/h2&gt;

&lt;p&gt;Age verification for operating systems treats every minor as a potential victim and every computer as a potential threat. It assumes the worst of kids and does nothing to actually protect them. A determined 14 year old will find a way around any age gate. An incurious one never needed it in the first place.&lt;/p&gt;

&lt;p&gt;What these laws will actually do is create friction for the kids who are genuinely interested in learning. The kids who want to install Linux on old hardware. The kids who want to understand how computers actually work, not just how to consume content on them. The kids who are exactly like I was — messy desk, Kurt Cobain hair and all.&lt;/p&gt;

&lt;p&gt;We should be encouraging that kind of exploration, not legislating it out of existence.&lt;/p&gt;

&lt;p&gt;The kid in that photo didn’t need protection from his operating system. He needed the freedom to break things, fix them, and learn. We shouldn’t take that away from the next generation.&lt;/p&gt;
</description>
        <pubDate>Mon, 09 Mar 2026 00:00:00 +0000</pubDate>
        <link>http://blog.dylanjpierce.com/blog/2026/03/09/this-image-is-now-illegal-in-five-states.html</link>
        <guid isPermaLink="true">http://blog.dylanjpierce.com/blog/2026/03/09/this-image-is-now-illegal-in-five-states.html</guid>
        
        
        <category>blog</category>
        
      </item>
    
      <item>
        <title>From Side Hustle to Full-Time: My first 5 years building Shopify Apps</title>
        <description>&lt;p&gt;Back in 2020, I published my first Shopify app. My goal was simple: generate some side income to fund my future son’s college bills. &lt;a href=&quot;https://dylanjpierce.com/motivation/blog/2022/05/09/funding-my-sons-college-with-a-shopify-app&quot;&gt;I’ve already written about that.&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;5 years later, I’m now working full time on my apps. It’s been a hell of a ride. Replacing my income with app revenue once seemed like an improbable dream. Now it’s my full time reality.&lt;/p&gt;

&lt;p&gt;It all hit me when my newest Shopify swag came in the mail (thanks again Liam), and I was comparing how much my son has grown between my first care package and now.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/tinyhouse/image/upload/v1756315757/Blog/Photos/shopify-skateboard.jpg&quot; alt=&quot;Weston holding the skateboard&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I just need to express how grateful I am for the Shopify platform. They’ve been instrumental in facilicating this ecosystem of merchants and partners. Since 2020 I’ve managed to:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Featured as a &lt;a href=&quot;https://www.shopify.com/blog/introducing-customer-account-extensions#data&quot;&gt;top 40 use of customer account extensions&lt;/a&gt;, and showcased it as an &lt;a href=&quot;https://apps.shopify.com/stories/guide-customer-accounts&quot;&gt;official launch partner of their Winter Editions&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;Build the first &lt;a href=&quot;https://getverdict.com/help/docs/shopify/pos&quot;&gt;Shopify POS integration for drivers license scanning&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Build the first &lt;a href=&quot;https://getverdict.com/help/docs/flows/shopify-checkout-app-blocks#verifying-ids-during-checkout&quot;&gt;checkout extension for customer ID verification during checkout&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Attended two Editions.dev conferences in lovely Toronto 🇨🇦 which are now a family tradition&lt;/li&gt;
  &lt;li&gt;Made connections with other amazing and talented partners across the globe&lt;/li&gt;
  &lt;li&gt;Meeting the genius legend himself, Tobi&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/tinyhouse/image/upload/v1756387688/Blog/Photos/IMG_8504.jpg&quot; alt=&quot;Hanging out with Patrick at Editions.dev&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I’m so thankful for Shopify’s support, and for my closest mentors (you know who you are), merchants, customers and fellow partners that helped me realize my dream of working independently.&lt;/p&gt;

&lt;p&gt;There’s no way I could fit all of the amazing experiences and lessons learned in these years into a single post. But I’ll &lt;em&gt;try&lt;/em&gt; keep it to my top 5.&lt;/p&gt;

&lt;h2 id=&quot;youre-running-a-saas-not-a-vending-machine&quot;&gt;You’re running a SaaS, not a vending machine&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/tinyhouse/image/upload/v1756388148/Blog/Photos/SS2025-DAY4-BEANFIELD-NGP131.jpg&quot; alt=&quot;Meeting Tobi and Bjorn at Editions.dev&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Vending machines take money and dish out a product. No customer support, just a machine to maintain. That was my original idea of developing apps, probably like most developers. I’d ship a product, customers would come and I’d make passive money. Easy right?&lt;/p&gt;

&lt;p&gt;I wasn’t particularly interested in having 1:1 email conversations or heaven forbid phone calls (😱) with merchants.&lt;/p&gt;

&lt;p&gt;Over time, my perspective completely shifted. Now, I eagerly start conversations with prospective merchants, offering video calls and demos. The support inbox &lt;em&gt;is&lt;/em&gt; your sales machine. Too often support is seen as an expense - a mandatory service that costs you time and mental energy, but with not much in return.&lt;/p&gt;

&lt;p&gt;To me, support is the most fulfilling part of operating a SaaS business. The moment when a customer understands how to use your product, and they see value in it really makes my day. And if my app isn’t the solution, I still have an opportunity to be helpful and at least point in the right direction.&lt;/p&gt;

&lt;p&gt;These conversations help you understand your product gaps, your competitors shortcomings, or identify new opportunities. They’re the entry point for growing your business, especially as an app developer. It’s your opportunity to connect with your customers, and it’s crucial to build these relationships. While your app doesn’t need relationships to function, your business does.&lt;/p&gt;

&lt;p&gt;Support is often the only chance you have to engage with a merchant, who are also juggling multiple projects and tasks at a time. Helping them efficiently and eagerly goes a long way.&lt;/p&gt;

&lt;p&gt;Books I recommend:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;a href=&quot;https://amzn.to/3USdTSR&quot;&gt;Mom Test&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://amzn.to/3USdTSR&quot;&gt;Mom Test (read it again)&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://amzn.to/3Vog80i&quot;&gt;Deploy Empathy&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;experiments-not-formulas&quot;&gt;Experiments not formulas&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/tinyhouse/image/upload/v1756388626/Blog/Photos/IMG_5266.jpg&quot; alt=&quot;Hanging out with the Helium.dev guys&quot; /&gt;&lt;/p&gt;

&lt;p&gt;As a developer, I liked how code is deterministic to fit a problem. You can create systems that if &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;x&lt;/code&gt; then &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;y&lt;/code&gt;, and easily compensate for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;z&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;But as a soloprenuer, you constantly have to make educated (sometimes not) guesses, and learn to adapt. You need to learn to become comfortable with experimentation. Without trying new marketing channels, onboarding flows, features, or pricing—you’ll never know what you’re missing.&lt;/p&gt;

&lt;p&gt;Now this is an art, and it’s subject to a bit of luck of course. There are so many different signals to consider, but ultimately what it comes down to is serving a customer’s need. Based on the customer’s feedback, you’ll know how close you are to hitting your target.&lt;/p&gt;

&lt;p&gt;Now I optimize towards unknowns, because that’s where the magic happens. You might find a new segment, or solve a problem for one merchant that leads to other opportunities thanks to word of mouth.&lt;/p&gt;

&lt;p&gt;You also can’t just A/B test everything, those are for testing with large volumes of traffic. Sometimes you only have a sample size of a dozen, and you’ll have to use your intution and &lt;em&gt;conversations&lt;/em&gt; with your customers to understand the right path to take.&lt;/p&gt;

&lt;h2 id=&quot;marketing-can-be-learned&quot;&gt;Marketing can be learned&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/tinyhouse/image/upload/v1756388451/Blog/Photos/IMG_6699.jpg&quot; alt=&quot;Weston putting together the piece&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://shopify.dev/docs/apps/design&quot;&gt;Shopify’s app design guidelines&lt;/a&gt; are already a great resource if you have no idea where to learn how to market. That’s how I essentially got started.&lt;/p&gt;

&lt;p&gt;Focus on solving a problem. A very small small problem. Not too many settings, not too many moving parts. Don’t promise the world, just solve a small thing.&lt;/p&gt;

&lt;p&gt;How do you know it’s small enough? You can fit a description of your app in one sentence. You can distill the entire value of the app to one key feature. Once you have done that, you’re ready to build and publish it.&lt;/p&gt;

&lt;p&gt;Even if your app doesn’t rank on the first page for a keyword, that’s okay — you’ll still get merchants trying it out. But try to differentiate. Build a better UX, use newer APIs, remove steps from onboarding, focus on a specific group of merchants that aren’t called out on other apps homepages.&lt;/p&gt;

&lt;p&gt;Just like your app’s functionality will evolve, your marketing will too. Don’t sweat the details until you know you’ve found some traction.&lt;/p&gt;

&lt;h2 id=&quot;results-dont-come-overnight&quot;&gt;Results don’t come overnight&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/tinyhouse/image/upload/v1756388275/Blog/Photos/IMG_6719.jpg&quot; alt=&quot;Weston and I building the Shopify lego set&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Products are experiments, they’re little seeds you plant of an unknown type. You don’t necessarily know if they will sprout in a month, 6 months or even a year. To complicate things, you don’t necessarily know what your little plant needs.&lt;/p&gt;

&lt;p&gt;It could fair better in a different type of soil (market), it could be a niche product that only a small subset of butterflies (merchants) need, it may be a solution that is only for a temporary problem (ran out of analogies).&lt;/p&gt;

&lt;p&gt;The thing is, you still have to go out there and water it every day. That means experimenting with marketing copy, analyzing your keywords that lead to installs, trying different pricing strategies. It does &lt;em&gt;not&lt;/em&gt; mean cooking up additional features just because you think it will increase rentention, or rushing out features purely on demand.&lt;/p&gt;

&lt;p&gt;It means &lt;em&gt;months&lt;/em&gt; of dedicated work. I got up early before my full time job, and I worked after the kids went to bed. I deactivated my social media accounts, I blocked reddit on my phone and computer. I treated my side business like a hobby, I adopted the mindset was being paid to “play”.&lt;/p&gt;

&lt;p&gt;I recommend:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;a href=&quot;https://amzn.to/4lLc05d&quot;&gt;Atomic Habits&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Committing to a specific time every day to work on your app&lt;/li&gt;
  &lt;li&gt;Removing distractions, like social media, reddit, gaming, TV - whatever those might be for you&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;know-your-position-know-your-customer&quot;&gt;Know your position, know your customer&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/tinyhouse/image/upload/v1756388385/Blog/Photos/IMG_6561.jpg&quot; alt=&quot;Weston getting the SHopify lego set&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Like (probably) all developers, I started out charging far too little. Which is fine. It gave me installs, it gave me more support tickets, it gave more experience more quickly.&lt;/p&gt;

&lt;p&gt;But you’ll start to get a taste for a segments of customers, and you’ll also find that some segments have very specific needs. The demand for your product might be very price sensitive, or it might not be because it’s absolutely required.&lt;/p&gt;

&lt;p&gt;Your pricing should reflect the value your app provides. Undercharging only increases your support burden.&lt;/p&gt;

&lt;p&gt;Your app lives in an ecosystem, there will be segments of customers that you can more easily communicate or work with, or perhaps their demand is much higher for your service than another segment. Understanding &lt;em&gt;who&lt;/em&gt; your customer is dictates your positioning for keywords and marketing.&lt;/p&gt;

&lt;h2 id=&quot;problems-are-opportunities&quot;&gt;Problems are opportunities&lt;/h2&gt;

&lt;p&gt;A merchant coming to you with an unrelated problem is an opportunity to expand your offerings, or at the least make a referral and build a partnership with another app.&lt;/p&gt;

&lt;p&gt;Or a problem with your current app could lead to understanding a UX problem that you otherwise would have missed. Being proactive and &lt;em&gt;seeking out&lt;/em&gt; problems signals to your customers that yes, you give a shit. The right attitude leads to more ~problems~ opportunities in the future.&lt;/p&gt;

&lt;p&gt;Your app doesn’t exist in a bubble, you should be thinking about how your not integrating with Shopify but how you integrate into the merchant’s entire workflow for the problems they have. That might mean learning about other apps in their stack and how you can make their lives easier and more productive.&lt;/p&gt;

&lt;p&gt;It’s such a rewarding experience to solve problems, especially in the age of A.I. where you can iterate quickly and really give a wow experience to someone else.&lt;/p&gt;

&lt;h2 id=&quot;thats-a-wrap&quot;&gt;That’s a wrap&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/tinyhouse/image/upload/v1756388724/Blog/Photos/1500.jpg&quot; alt=&quot;Heading to Toronto Island with the fam after Editions.dev&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Ok I lied, I gave an extra couple of bonus sections. My b.&lt;/p&gt;

&lt;p&gt;I can’t possibly fit all of the lessons learned into a single blog post. It’s best just to learn for yourself firsthand anyway.&lt;/p&gt;

&lt;p&gt;I’m still learning, but I credit Shopify for at least giving me that initial feedback loop to at least take my first steps. Without that, I don’t see how I could have made it this far. The wonderful folks behind the App Store, documentation and amazing APIs and platform makes it possible.&lt;/p&gt;

&lt;p&gt;But I’m so grateful for this opportunity to service others and solve real world problems. It’s hard to believe this is my full time gig, and now I have a hard time of seeing myself doing anything else. 5 years later, I’m still excited to build my small part of the future of commerce.&lt;/p&gt;

&lt;p&gt;Happy building 🔨&lt;/p&gt;
</description>
        <pubDate>Wed, 27 Aug 2025 00:00:00 +0000</pubDate>
        <link>http://blog.dylanjpierce.com/blog/2025/08/27/five-years-of-shopify-dev.html</link>
        <guid isPermaLink="true">http://blog.dylanjpierce.com/blog/2025/08/27/five-years-of-shopify-dev.html</guid>
        
        
        <category>blog</category>
        
      </item>
    
      <item>
        <title>How well is my Shopify app actually doing? Finding out with Rankbase</title>
        <description>&lt;p&gt;Probably like you, my expertise came from an engineering background - not marketing, which is why I choose to build apps on the Shopify platform.&lt;/p&gt;

&lt;p&gt;One of the highest moments is getting that first install and subscription. This quick highs then fade into long nagging questions, like &lt;em&gt;“but wait, how was my app found”? Then the anxiety of _“is my app listing doing OK in the competitive marketplace?”&lt;/em&gt; And the classic &lt;em&gt;“which keywords actually matter?”&lt;/em&gt; And the dreaded: &lt;em&gt;“which marketing channels are actually working?”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;You have probably set up Google Analytics on your Shopify App Listing page, but navigating the report builder in GA4 is a steep learning curve. It’s clearly a square peg in a round hole.&lt;/p&gt;

&lt;p&gt;We Shopify Developers need to understand exactly which keywords and channels merchants are coming from, otherwise our marketing efforts could be random casts in the dark.&lt;/p&gt;

&lt;h2 id=&quot;introducing-rankbase&quot;&gt;Introducing &lt;a href=&quot;https://rankbase.io?utm_source=dylanjpierce.com&quot;&gt;Rankbase&lt;/a&gt;&lt;/h2&gt;

&lt;p&gt;I’ve recently stumbled across &lt;a href=&quot;https://rankbase.io?utm_source=dylanjpierce.com&quot;&gt;Rankbase&lt;/a&gt; (thanks Daniel for the referral), which goes a great job of solving these problems.&lt;/p&gt;

&lt;p&gt;The setup was painless, I just needed to connect my Google Analytics Account and provide my Shopify Partner ID, and &lt;a href=&quot;https://rankbase.io?utm_source=dylanjpierce.com&quot;&gt;Rankbase&lt;/a&gt; gave me the exact data I needed.&lt;/p&gt;

&lt;p&gt;No, a Shopify Partner API token isn’t required, they won’t scrape your transactions. This tool is purely a marketing funnel inspection tool, not revenue ops.&lt;/p&gt;

&lt;h3 id=&quot;finding-your-effective-and-ineffective-marketing-channels&quot;&gt;Finding your effective (and ineffective) marketing channels&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://rankbase.io?utm_source=dylanjpierce.com&quot;&gt;Rankbase&lt;/a&gt; uses your Google Analytics account to create a report of &lt;em&gt;Install Clicks&lt;/em&gt; - a.k.a. prospective merchants that have clicked the &lt;em&gt;Install&lt;/em&gt; button on your Shopify app listing.&lt;/p&gt;

&lt;p&gt;One of the more powerful charts breaks down your installs by &lt;em&gt;source&lt;/em&gt;. A source could be a Shopify App Store search, Google Search, or in my case even a Yahoo search here and there:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/tinyhouse/image/upload/v1723228658/Blog/Rankbase/CleanShot_2024-08-09_at_14.37.22_2x.png&quot; alt=&quot;An example of Rankbase breaking down installs by source&quot; /&gt;&lt;/p&gt;

&lt;p&gt;How is this helpful? Well let’s say you’re interesting in broading your marketing reach outside of the Shopify App Store and are considering writing content for SEO/Facebook Groups that link back to your app. You could blindly write content in 4-5 different channels and pray that your hard work results in installs.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Or&lt;/em&gt; you could measure the effectiveness of each channel, and also using UTM parameters discover which of your blog posts/videos/tutorials are making the biggest splashes because they’re bringing in installs.&lt;/p&gt;

&lt;p&gt;Then that feedback gives you a clue of how to shape your content for future posts and which channels you should focus on next.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://rankbase.io?utm_source=dylanjpierce.com&quot;&gt;Rankbase&lt;/a&gt; gives you this view, and even gives you a breakdown of locale of the merchant. This is extremely helpful to know if you should start to consider translating your app to different languages, but you should know that Shopify has started automatically translating listings as well.&lt;/p&gt;

&lt;h3 id=&quot;finding-your-important-shopify-app-store-keywords&quot;&gt;Finding your important Shopify App Store keywords&lt;/h3&gt;

&lt;p&gt;But if you’re first starting out, you probably should get a handle on your Shopify App Store rankings first. This is because if you rank highly enough in the Shopify App Store, then those corresponding keywords will naturally appear in the top results in Google. Having your app in the top three for a given keyword is extremely powerful.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://rankbase.io?utm_source=dylanjpierce.com&quot;&gt;Rankbase&lt;/a&gt; helps you understand which searches are being made by merchants that have installed your app. From there you can determine where you position is good, or where it could use some work:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/tinyhouse/image/upload/v1723228507/Blog/Rankbase/CleanShot_2024-08-09_at_14.33.34_2x.png&quot; alt=&quot;Finding keywords that will help you get more merchant installs&quot; /&gt;&lt;/p&gt;

&lt;p&gt;But it doesn’t stop there, one of the really cool features it has is this suggestion tool that will help you strenghten your listing for that specific keyword.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/tinyhouse/image/upload/v1723229506/Blog/Rankbase/CleanShot_2024-08-09_at_14.50.56_2x.png&quot; alt=&quot;Keyword analysis for a single keyword for your app listing&quot; /&gt;&lt;/p&gt;

&lt;p&gt;It’ll help you identify where the keyword could be placed in the various fields of your app store listing to help you rank higher. One of the best things (for partners) about the Shopify App Store is that you can make changes to your listing and get feedback in real time. So you can tweak and modify to see how your content affects your positioning.&lt;/p&gt;

&lt;p&gt;If you have writer’s block - no sweat. You can let A.I. give you a draft, just by entering in your OpenAI key.&lt;/p&gt;

&lt;h2 id=&quot;wrap-it-up&quot;&gt;Wrap it up&lt;/h2&gt;

&lt;p&gt;So in short, if your serious about marketing your Shopify app and don’t want to learn the Google Analytics API to make readable charts - then I highly recommend giving &lt;a href=&quot;https://rankbase.io?utm_source=dylanjpierce.com&quot;&gt;Rankbase&lt;/a&gt; a try. Farid (the developer) is super quick to help answer questions and even gave me a short consult as part of my free trial.&lt;/p&gt;

&lt;p&gt;It has a 14 day trial for the entire app so you can see the value, and the plans aren’t badly priced. Most likely the keyword tweaks you make from this app will pay for itself.&lt;/p&gt;

&lt;p&gt;Hopefully this was helpful, if you want to read more tips and tricks on running and growing your Shopify Apps, follow this blog’s RSS or check me out on &lt;a href=&quot;https://x.com/ctrlaltdylan&quot;&gt;Twitter&lt;/a&gt; (I will never call it X).&lt;/p&gt;

&lt;p&gt;Cheers and happy building 🔨&lt;/p&gt;

</description>
        <pubDate>Fri, 09 Aug 2024 00:00:00 +0000</pubDate>
        <link>http://blog.dylanjpierce.com/fraud/2024/08/09/ranking-rankbase.html</link>
        <guid isPermaLink="true">http://blog.dylanjpierce.com/fraud/2024/08/09/ranking-rankbase.html</guid>
        
        
        <category>fraud</category>
        
      </item>
    
      <item>
        <title>How to not fight compute piracy</title>
        <description>&lt;p&gt;Just last week, my I went to launch my development environment powered by Gitpod to fix a quick bug on one of my apps.&lt;/p&gt;

&lt;p&gt;However, to my dismay, I found my paid account was now blocked without any recourse. I was effectively blocked from running my trusty development environment for the better part of the day.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/tinyhouse/image/upload/v1693482496/Blog/Photos/CleanShot_2023-08-24_at_10.06.03_2x.png&quot; alt=&quot;The dreaded &amp;quot;Your account has been blocked&amp;quot; gitpod message&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Eventually after sending several emails and messages over Discord, the Gitpod team realized my account was falsely flagged and they reverted the ban.&lt;/p&gt;

&lt;p&gt;I’m actually lucky to have this situation resolved relatively quickly. Larger teams or enterprises are notorious for outright ignoring blocked users, because the almighty fraud algorithm determined you’re guilty. No appeals. No do overs.&lt;/p&gt;

&lt;p&gt;As an end customer this is a terrible experience. There was no explanation and no answer to why it happened, and lack luster reasoning at best.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/tinyhouse/image/upload/v1693482761/Blog/Photos/CleanShot_2023-08-31_at_07.52.21_2x.png&quot; alt=&quot;Lack of explanation from the Gitpod team&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;the-nature-of-the-beast&quot;&gt;The nature of the beast&lt;/h2&gt;

&lt;p&gt;I empathize with the these product teams though. Freemium fraud is a particularly nasty beast. It’s a fine line between providing a sample of value to developers evaluating your product, while at the same time preventing losses from crypto mining, command and control bot net servers, or proxying exploits or data theft.&lt;/p&gt;

&lt;p&gt;Let’s imagine you’re offering compute as a service. Perhaps you’ve started a hosting company that specializes hosting Node.js apps or scripts.&lt;/p&gt;

&lt;p&gt;Naturally developers need to try the tool before committing to even the basic plan. Developers are also fickle and really need to sample before they buy. They also want self service and they want no interaction with sales at all if they can help it.&lt;/p&gt;

&lt;p&gt;So practically industry standard to offer a Free tier. But the issue is the bad actors that leverage your free tier to crypto mine to the free tier limits and scale up on as many free tier accounts as possible.&lt;/p&gt;

&lt;h2 id=&quot;nailing-jelly-to-a-wall&quot;&gt;Nailing jelly to a wall&lt;/h2&gt;

&lt;p&gt;So you implement detections on NPM package names to ban accounts. That will work for potentially awhile, but the bad guys are just as technical. They can republish these packages under new names on NPM.org. Or they can deploy the code directly in the Node.js app, without even using a package manager.&lt;/p&gt;

&lt;p&gt;You can even scan the code itself, search for mentions of similar variable names from a known bad signature. Or certain port usage, network usage.&lt;/p&gt;

&lt;p&gt;Or you can start to detect nefarious use by unusual resource consumption, which I believe what got me into trouble recently.&lt;/p&gt;

&lt;h2 id=&quot;the-cure-can-be-worse-than-the-disease&quot;&gt;The cure can be worse than the disease&lt;/h2&gt;

&lt;p&gt;Be very careful with your anti-fraud detection schemes.&lt;/p&gt;

&lt;p&gt;You can unintentionally block or impede your paying customers, self-inflict churn and hurt your brand reputation.&lt;/p&gt;

&lt;p&gt;Anti-fraud detection rules that automatically employ bans or suspensions should always follow these basic guidelines:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Don’t automatically ban paying or trusted users&lt;/li&gt;
  &lt;li&gt;Allow automatic unblocking after passing KYC&lt;/li&gt;
  &lt;li&gt;Evaluate efficiency of the rule periodically&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;dont-ban-trusted-users&quot;&gt;Don’t ban trusted users&lt;/h3&gt;

&lt;p&gt;There should be very clear actions that elevate a users trust level in your system.&lt;/p&gt;

&lt;p&gt;For our sample hosting company, potentially the strongest signals are payments. If a customer is in good standing on their subscription with multiple payments, then most likely they are not going to revert to a Free plan and crypto mine or abuse your service.&lt;/p&gt;

&lt;p&gt;Define a list of actions or attributes that a trusted account takes that an bad actor cannot. These will define your trusted users.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Verified email addresses&lt;/li&gt;
  &lt;li&gt;Verified phone numbers&lt;/li&gt;
  &lt;li&gt;At least one successful payment&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then design your anti-fraud processes to exclude these trusted accounts.&lt;/p&gt;

&lt;h3 id=&quot;keep-the-door-half-open&quot;&gt;Keep the door half open&lt;/h3&gt;

&lt;p&gt;Now that you have employed a rule to automatically ban or suspend users based on an algorithm, expect false flags.&lt;/p&gt;

&lt;p&gt;Not only is it a terrible experience to those falsely banned, but it also leads to lost sales.&lt;/p&gt;

&lt;p&gt;To alleviate the customer support operational burden, give the flagged user a means to prove trust.&lt;/p&gt;

&lt;p&gt;One simple way to set this up is by adding a KYC gate. This gates are extremely effective at thwarting repeat bad actors. They stop fraud by identifying the customers real world information like a drivers license, passport, etc.&lt;/p&gt;

&lt;p&gt;Now this is the most sure fire option, but there are other trust signals that you can employ instead, like verifying a phone number with a one time code in an SMS message.&lt;/p&gt;

&lt;p&gt;The severity of the potential fraud should dictate which KYC gate should be used to prevent it.&lt;/p&gt;

&lt;h3 id=&quot;continuously-evaluate-your-rules&quot;&gt;Continuously evaluate your rules&lt;/h3&gt;

&lt;p&gt;Anti-fraud rules are short lived because they are used against financially motivated and actors. Eventually these rules will be circumvented or their actions so blended against real traffic and good user activity that once again you have to split the hairs and make new rules.&lt;/p&gt;

&lt;p&gt;You also have to be careful to not introduce too much friction and over flag accounts. This is worse than actually defeating the fraud in most cases.&lt;/p&gt;

&lt;h2 id=&quot;please-steal-these-ideas&quot;&gt;Please steal these ideas&lt;/h2&gt;

&lt;p&gt;Why am I so confident these methods work? I have personally employed them at &lt;a href=&quot;https://rvshare.com&quot;&gt;RVshare&lt;/a&gt; as I set up the Trust &amp;amp; Safety dashboard app, processes, analytics, product integrations and eventually a small team dedicated to this set of particular problems. I’ve seen what works well and what doesn’t.&lt;/p&gt;

&lt;p&gt;Rental marketplace fraud is an entirely different set of bad actors and attack vectors, but the motivations and methodologies can apply to any business to weave the needle between prevention and conversion optimization.&lt;/p&gt;

&lt;p&gt;Dealing with a particularly nasty form of fraud and need help? &lt;a href=&quot;/contact&quot;&gt;Please message me.&lt;/a&gt; I’m always happy to help.&lt;/p&gt;
</description>
        <pubDate>Thu, 31 Aug 2023 00:00:00 +0000</pubDate>
        <link>http://blog.dylanjpierce.com/fraud/2023/08/31/how-to-not-fight-compute-piracy.html</link>
        <guid isPermaLink="true">http://blog.dylanjpierce.com/fraud/2023/08/31/how-to-not-fight-compute-piracy.html</guid>
        
        
        <category>fraud</category>
        
      </item>
    
      <item>
        <title>Build a Currency Exchange API - without code</title>
        <description>&lt;p&gt;Recently, &lt;a href=&quot;https://shopify.dev/docs/api/release-notes/2022-10#deprecated-order-and-lineitem-properties&quot;&gt;Shopify has removed the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;total_price_usd&lt;/code&gt; field from their Admin Order API.&lt;/a&gt; This caused me a big headache personally. Long story short, now I had to find a way to quickly convert orders back into USD.&lt;/p&gt;

&lt;p&gt;Unfortunately, I couldn’t find a currency conversion API in Shopify, but I did find an API that offered a free tier. &lt;a href=&quot;https://openexchangerates.org/&quot;&gt;Open Exchange Rates&lt;/a&gt; offers 1,000 calls per month for free.&lt;/p&gt;

&lt;p&gt;Great. But in this case I’m processing quite well over that, and I can’t afford the usage here for the value provided.&lt;/p&gt;

&lt;p&gt;Yes, I’m known to be frugal, I drive a 2003 Corolla.&lt;/p&gt;

&lt;p&gt;So I’ve found a way to leverage Pipedream workflows and a data store to cache the prices and then serve a real time API endpoint to respond to requests.&lt;/p&gt;

&lt;p&gt;This hack essentially offers a free exchange API with an hourly refresh on currency rates back to USD. Lucky for you, I’m sharing the two workflows for you too, so you just need to register an API key and plug it in.&lt;/p&gt;

&lt;h2 id=&quot;storing-current-currency-exchange-rates-in-a-data-store&quot;&gt;Storing current currency exchange rates in a Data Store&lt;/h2&gt;

&lt;p&gt;The sole purpose of this workflow is to retrieve and store the current currency exchange rates for USD into a Data Store.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://pipedream.com/new?h=tch_ORVfvQ&amp;amp;via=p&quot;&gt;Copy this workflow to your Pipedream account to get started.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The first step is to set up a workflow that will update a Data Store of current exchange rates. We’re going to use the Open Exchange Rate API that grants a generous 1,000 API requests per month.&lt;/p&gt;

&lt;p&gt;After signing up for an account and confirming your email address, you’ll be granted an App ID (a.k.a. your API key).&lt;/p&gt;

&lt;p&gt;This workflow is configured to run every hour, so the math comes out to 24 calls per day * 31 days per month = 744 calls per month, which is under the 1,000 calls limit for this API.&lt;/p&gt;

&lt;p&gt;Now that you have an API key, use it in this workflow by connecting it:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/tinyhouse/image/upload/v1689352901/Blog/Photos/CleanShot_2023-07-14_at_12.41.29.png&quot; alt=&quot;Connecting your Open Exchange Rate account to this workflow&quot; /&gt;&lt;/p&gt;

&lt;p&gt;So next you’ll need to create a new Data Store, I named mine &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Exchange Rates&lt;/code&gt; for simplicity:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/tinyhouse/image/upload/v1689353218/Blog/Photos/CleanShot_2023-07-14_at_12.46.46.png&quot; alt=&quot;Naming the data store as Exchange Rates for easier tracking&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Then after deploying, when you open your Data Store you’ll see the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;rates&lt;/code&gt; property is updated every hour with a mapping of all prices:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/tinyhouse/image/upload/v1689352728/Blog/Photos/CleanShot_2023-07-14_at_12.38.33.png&quot; alt=&quot;Example of the cached exchange rates API response&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;creating-the-conversion-api&quot;&gt;Creating the Conversion API&lt;/h2&gt;

&lt;p&gt;The second and last workflow we need to copy will create a simple GET endpoint to allow us to query this data store of fresh exchange rates.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://pipedream.com/new?h=tch_OL4fzx&amp;amp;via=p&quot;&gt;Copy this workflow to your Pipedream account to create the endpoint.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The only step you need to perform here is connecting your brand new &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Exchange Rates&lt;/code&gt; data store, and you’re good to go!&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/tinyhouse/image/upload/v1689353390/Blog/Photos/CleanShot_2023-07-14_at_12.49.13.png&quot; alt=&quot;Connecting your data store to the API endpoint&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Don’t forget to also set the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;key&lt;/code&gt; property to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;rates&lt;/code&gt; so it can find our stored exchange rates:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/tinyhouse/image/upload/v1689353445/Blog/Photos/CleanShot_2023-07-14_at_12.49.22.png&quot; alt=&quot;Select the rates property within the data store&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Now use this endpoint to pass the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;currency_code&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;amount&lt;/code&gt; as query params, then the response will include the cached currency rate from your data store.&lt;/p&gt;

&lt;p&gt;It’s wicked fast, and it scales.&lt;/p&gt;

&lt;p&gt;This pattern is pretty interesting to me, I’m starting to leverage Pipedream to cache various APIs or add an abstraction layer on top of APIs to make them easier to use.&lt;/p&gt;

&lt;p&gt;This is especially useful for semi-hidden or undocumented APIs that you want to interact with. I’ll have to share more about that in a latter post.&lt;/p&gt;

</description>
        <pubDate>Fri, 14 Jul 2023 00:00:00 +0000</pubDate>
        <link>http://blog.dylanjpierce.com/tutorial/shopify/pipedream/2023/07/14/free-currency-exchange-api-hack.html</link>
        <guid isPermaLink="true">http://blog.dylanjpierce.com/tutorial/shopify/pipedream/2023/07/14/free-currency-exchange-api-hack.html</guid>
        
        
        <category>tutorial</category>
        
        <category>shopify</category>
        
        <category>pipedream</category>
        
      </item>
    
      <item>
        <title>A Eulogy to Free Social Media APIs</title>
        <description>&lt;p&gt;Recently both Twitter and Reddit have effectively killed their APIs to the public. Much to the chagrin of their users. &lt;a href=&quot;https://www.theverge.com/2023/6/5/23749188/reddit-subreddit-private-protest-api-changes-apollo-charges&quot;&gt;A handful of the most popular subreddits like /r/videos, /r/reactiongifs and /r/lifeprotips are staging a protest by voluntarily shutting down June&lt;/a&gt;; some even threating to shut down permanently.&lt;/p&gt;

&lt;p&gt;This new user hostile policy will also end 3rd party clients to Reddit as well, leaving the only option left analytics leaden spyware that is the official Reddit client.&lt;/p&gt;

&lt;p&gt;This is a trend that I personally don’t see reversing, and it will only expand to non-text based social media platforms next.&lt;/p&gt;

&lt;p&gt;Looking back at the decade plus that these APIs offered a real-time firehose into organic rich content, it should have been obivious. Programmatic access to effectively a rich feed of near infinite dynamic actual human generated content - for absolutely nothing. Just stay within our polling limits please; have fun kids.&lt;/p&gt;

&lt;p&gt;These platforms that opened up their APIs saw innovations exceed their own capabilities, and often enriched the platform. &lt;a href=&quot;https://www.reddit.com/r/RemindMeBot/comments/24duzp/remindmebot_info/&quot;&gt;The RemindMe bot on Reddit&lt;/a&gt; was one of my favorite examples, especially when it came to internet strangers holding a grunge over some prediction of a future event: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;RemindMe! 2 years &quot;Was the term &apos;highly regarded&apos; used in the Presidential Debate?&quot;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;We, I, took these APIs for granted. I leveraged them to power my first startup client, a social media aggregator aimed for university administrators. I’ll always look back fondly learning to build an ETL pipeline to load, abstract and store these feeds of content into a normalized database (heck even &lt;a href=&quot;https://prezi.com/p/bs1ogovpxxsg/copy-of-yakattack/&quot;&gt;reverse engineering one&lt;/a&gt;). There was no gate, I didn’t need capital. Just armed with my laptop, a few PHP tutorials and a will to learn.&lt;/p&gt;

&lt;h2 id=&quot;dont-hate-the-players-hate-the-ai&quot;&gt;Don’t hate the players, hate the A.I.&lt;/h2&gt;

&lt;p&gt;In the end, I can see why the writing is on the walls.&lt;/p&gt;

&lt;p&gt;If these platforms were vulnerable to bots gaming posts or unfairly influencing posts away from organic discussion before, the cat’s out of the bag now. The heuristic line of quickly detecting a bot vs a human on social media has become that much more blurred.&lt;/p&gt;

&lt;p&gt;Even if that isn’t the primary reason, consider the hosting costs of unlimited access to databases that are most likely transfering petabytes if not zettabytes of data per day; consider the reputational cost of unfettered bot access powered by LLMs to these text based platforms. The sugar high of low interest rates over the past decade is over, &lt;a href=&quot;https://www.cnbc.com/2023/04/18/software-firms-face-huge-tax-bills-that-threaten-tech-startup-survival.html&quot;&gt;tax write offs for software development too&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;mourn-for-the-next-generation&quot;&gt;Mourn for the next generation&lt;/h2&gt;

&lt;p&gt;It’s not all bad. On one hand, never before has learning software development been so accessible also thanks to LLMs. However, there’s a stark difference between learning &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&quot;Hello, world&quot;&lt;/code&gt; on an isolated computer and actually retrieving real time content from social media platforms that are the lowest barrier to entry for learning API interactions that actually leverage the power of the internet.&lt;/p&gt;

&lt;p&gt;Sure, you can learn a weather, Pokemon or Star Wars character API - the fundamentals are the same. But it’s just not that compelling to new learners.&lt;/p&gt;

&lt;p&gt;However, the fun of interacting with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/r/gifs&lt;/code&gt; programmatically is now over for the future generation without the means to pay:&lt;/p&gt;

&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/G73P6PJBnBs&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;

&lt;p&gt;I specifically remember my first successful API call to search Twitter with a simple API I registered with on the same day. The rush of understanding the possibilities that lay before me. Now those opportunities are locked behind an approval process and a credit card.&lt;/p&gt;

&lt;p&gt;Now, it’s possible that I’m just overly nostaglic, but all of the fringes of the internet that were open and free are now closing. There must be new edges the next generation of learners are finding, and it’s just out of my perspective. But I reflect on how lucky I was to find these while they were open.&lt;/p&gt;

&lt;p&gt;Thanks for the good times!&lt;/p&gt;

&lt;p&gt;Disagree? &lt;a href=&quot;https://twitter.com/ctrlaltdylan&quot;&gt;@ me&lt;/a&gt;.&lt;/p&gt;
</description>
        <pubDate>Tue, 06 Jun 2023 00:00:00 +0000</pubDate>
        <link>http://blog.dylanjpierce.com/opinion/blog/2023/06/06/eulogy-to-free-social-media-apis.html</link>
        <guid isPermaLink="true">http://blog.dylanjpierce.com/opinion/blog/2023/06/06/eulogy-to-free-social-media-apis.html</guid>
        
        
        <category>opinion</category>
        
        <category>blog</category>
        
      </item>
    
      <item>
        <title>Funding my son&apos;s college with a Shopify app</title>
        <description>&lt;p&gt;&lt;a href=&quot;https://twitter.com/shopifydevs&quot;&gt;Shopify Devs&lt;/a&gt; sent me a package of swag, and I feel like I must reciprocate as best I can.&lt;/p&gt;

&lt;p&gt;This is the story of how I finally built and shipped my first actual revenue generating app.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/tinyhouse/image/upload/c_scale,w_1200/v1652150850/Blog/Photos/IMG_2890.jpg&quot; alt=&quot;Swag from Shopify Devs&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The year was 2020, a dark and infamous year of course; but simultaneously a golden age of side projects. I was a dad to be and with faced with a lot of time to think about the future.&lt;/p&gt;

&lt;h2 id=&quot;the-small-teeny-tiny-motivation&quot;&gt;The small, teeny tiny motivation&lt;/h2&gt;

&lt;p&gt;I had always wanted to build a small project that actually generated revenue. I knew I could either spend my off time playing a ton of videos games, or I could focus and actually ship something.&lt;/p&gt;

&lt;p&gt;Before this I didn’t have constraints, I just had irregular free time without a real goal.&lt;/p&gt;

&lt;p&gt;I would fail to build the MVP (bad), or fail to find a market (worse). Either way it was hours wasted.&lt;/p&gt;

&lt;p&gt;I knew I didn’t have a large window (9 months) and still working full time.&lt;/p&gt;

&lt;p&gt;I needed to leverage an existing market and build something folks needed, and focus on using my dev skills to build something to easily plug and play.&lt;/p&gt;

&lt;p&gt;And I knew I had to take advantage of what was in front of me:&lt;/p&gt;

&lt;p&gt;Time.&lt;/p&gt;

&lt;p&gt;Lots. And lots. Of uninterrupted socially distanced time.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.kym-cdn.com/photos/images/newsfeed/001/373/328/b16.jpg&quot; alt=&quot;What 2020 felt like&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;micro-apps-can-grow-a-large-fund&quot;&gt;Micro apps can grow a large fund&lt;/h2&gt;

&lt;p&gt;I also didn’t need the app to earn a ton of money. I could contribute up to $4,000 per year to max out tax free contributions &lt;a href=&quot;https://www.collegeadvantage.com/learn&quot;&gt;individual Ohio 529 plan&lt;/a&gt;.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$4,000 / 12 months = ~$333
$333 / $10 per merchant = ~34 subscribing merchants
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;By focusing on a small goal, for once I was able to ship and deliver a small revenue generating app.&lt;/p&gt;

&lt;p&gt;$333 per month at a %6 growth rate without taxation for 18 years will grow to around $153,225. At $10 per subscription, I just needed 34 subscribers to reach my 529 contribution goal.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/tinyhouse/image/upload/v1652148499/Blog/Photos/CleanShot_2022-05-09_at_22.07.19_2x.png&quot; alt=&quot;Ohio 529 assumptions&quot; /&gt;&lt;/p&gt;

&lt;p&gt;It’s not a crushing goal of trying to replace a full time job, but at the same time it’s a meaningful amount of money given enough time.&lt;/p&gt;

&lt;h2 id=&quot;enter-shopify-apps&quot;&gt;Enter Shopify Apps&lt;/h2&gt;

&lt;p&gt;I’m half ok at building stuff, especially extending existing systems. Give me a set of API documentation and I can figure it out.&lt;/p&gt;

&lt;p&gt;But I wasn’t then and I am still not an eCommerce merchant.&lt;/p&gt;

&lt;p&gt;Because of my limited timeline and limited goal, I swallowed my pride and made an app for an exisiting category that I thought was totally oversaturated with solid high review apps.&lt;/p&gt;

&lt;p&gt;After all, I only needed to capture a small part of the market to reach my goal. Why take a big swing where a ball &lt;em&gt;might&lt;/em&gt; be an instead take a stab a pie you know is there?&lt;/p&gt;

&lt;h2 id=&quot;i-can-compete&quot;&gt;I &lt;em&gt;can&lt;/em&gt; compete?&lt;/h2&gt;

&lt;p&gt;This ended up being a great decision. My entire devtrepreneur experience, I had been trying to swing for home runs each at bat.&lt;/p&gt;

&lt;p&gt;I would whiff, but extremely slowly and with great effort.&lt;/p&gt;

&lt;p&gt;I shipped the MVP of my app in a few weeks, and it was approved in another two weeks.&lt;/p&gt;

&lt;p&gt;I was live, and much to my surprise I was getting a small trickle of installs - even subscriptions 😮&lt;/p&gt;

&lt;h2 id=&quot;small-differentiators-matter&quot;&gt;Small differentiators matter&lt;/h2&gt;

&lt;p&gt;My little app never will overthrow my well entrenched competitors. They will always outrank me in the SEO &amp;amp; Shopify App Store rankings.&lt;/p&gt;

&lt;p&gt;But that doesn’t mean you can’t find a market with 2nd, 3rd, or 4th place.&lt;/p&gt;

&lt;p&gt;My app was never top 10, but it resonated with a few merchants that had similar values that I tried to strive for in my app:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;No Shopify app should ever need to alter your theme code&lt;/li&gt;
  &lt;li&gt;Don’t make me think&lt;/li&gt;
  &lt;li&gt;You shouldn’t feel like you’re in an app. &lt;a href=&quot;https://polaris.shopify.com/&quot;&gt;Use Shopify’s design system.&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Following a set of rules gave me a similar but different app than my competitors, which was enough to make me and my awesome customers happy.&lt;/p&gt;

&lt;h2 id=&quot;did-you-reach-your-goal&quot;&gt;Did you reach your goal?&lt;/h2&gt;

&lt;p&gt;Yes, 4 months after launch 🎯&lt;/p&gt;

&lt;p&gt;Thanks to feedback and asking questions as much as I could, I found a set of must have features that others weren’t supporting, and did my best to deliver.&lt;/p&gt;

&lt;h2 id=&quot;finding-your-motivation&quot;&gt;Finding your motivation&lt;/h2&gt;

&lt;p&gt;2020 was a great year for side projects - some picked up frisbee golf, some ran &lt;a href=&quot;https://www.aljazeera.com/features/2020/4/3/coronavirus-running-marathons-under-lockdown&quot;&gt;indoor marathons&lt;/a&gt;, some bought out &lt;a href=&quot;https://www.washingtonpost.com/national/coronavirus-toilet-paper-shortage-panic/2020/04/07/1fd30e92-75b5-11ea-87da-77a8136c1a6d_story.html&quot;&gt;entire shelves of toliet paper&lt;/a&gt;, and others tried to start businesses.&lt;/p&gt;

&lt;p&gt;Looking back, sure the pandemic had an influence on my first profit generating app. But several other internal &amp;amp; external factors had played a part:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;I had a small yet &lt;em&gt;possible&lt;/em&gt; goal&lt;/li&gt;
  &lt;li&gt;I had a clear MVP objective by looking at competing apps&lt;/li&gt;
  &lt;li&gt;I had quite a bit of free time&lt;/li&gt;
  &lt;li&gt;Building on an established platform allowed me to focus on just building&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;5-they-send-you-awesome-swag&quot;&gt;5. They send you awesome swag!&lt;/h3&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/tinyhouse/image/upload/c_scale,w_800/v1652147650/Blog/Photos/PXL_20220509_224723253.MP.jpg&quot; alt=&quot;My son opening up the Shopify Swag&quot; /&gt;&lt;/p&gt;

&lt;p&gt;So long story short, like Sublime Text 2 I will ride out my micro app until it dies. But until then I’m just glad knowing that I built something that will widen my son’s horizons just a little, or at least give him more options.&lt;/p&gt;

&lt;h2 id=&quot;getting-started-building-shopify-apps&quot;&gt;Getting started building Shopify apps&lt;/h2&gt;

&lt;p&gt;Checkout &lt;a href=&quot;https://shopify.dev&quot;&gt;shopify.dev&lt;/a&gt; and the &lt;a href=&quot;https://apps.shopify.com&quot;&gt;Shopify App Store&lt;/a&gt; and don’t forget to read the &lt;a href=&quot;https://community.shopify.com/&quot;&gt;forums&lt;/a&gt; for finding pain points.&lt;/p&gt;

&lt;p&gt;Thanks &lt;a href=&quot;https://twitter.com/shopifydevs&quot;&gt;@ShopifyDevs&lt;/a&gt; for the awesome gifts and support over the years, and helping me build my first micro business.&lt;/p&gt;

&lt;p&gt;That’s my story of building my first Shopify app, best of luck and happy building 🔨&lt;/p&gt;
</description>
        <pubDate>Mon, 09 May 2022 00:00:00 +0000</pubDate>
        <link>http://blog.dylanjpierce.com/motivation/blog/2022/05/09/funding-my-sons-college-with-a-shopify-app.html</link>
        <guid isPermaLink="true">http://blog.dylanjpierce.com/motivation/blog/2022/05/09/funding-my-sons-college-with-a-shopify-app.html</guid>
        
        
        <category>motivation</category>
        
        <category>blog</category>
        
      </item>
    
      <item>
        <title>Shopify App install notifications to Slack without code</title>
        <description>&lt;p&gt;Why would you want to be alerted when a Shopify store installs, subscribes or uninstalls your Shopify app?&lt;/p&gt;

&lt;p&gt;Well when you’re finding some time off, enjoying a beer or just away from the laptop it’s always nice to see your app working for you.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/tinyhouse/image/upload/v1645736752/Blog/Pipedream/CleanShot_2022-02-24_at_16.05.14_2x.png&quot; alt=&quot;Receiving a Slack message that a shop has subscribed to one of your appss&quot; /&gt;&lt;/p&gt;

&lt;p&gt;On the flip side, knowing when a merchant uninstalls your app gives you a chance to immediately respond with a personalized message to try and win them back.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/tinyhouse/image/upload/v1645736753/Blog/Pipedream/CleanShot_2022-02-24_at_16.02.47_2x.png&quot; alt=&quot;Receiving a Slack message that a shop has uninstalled and unsubscribed&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Sure, you can accomplish this functionality with coding directly within your app. It sounds easy right? Until you consider all of the steps:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Install a Slack package in your app.&lt;/li&gt;
  &lt;li&gt;Craft a message in JSON from Shopify’s API data.&lt;/li&gt;
  &lt;li&gt;Upgrade the package with new updates.&lt;/li&gt;
  &lt;li&gt;Create a new background queue for handling these notifications out of band so your app’s performance isn’t affected.&lt;/li&gt;
  &lt;li&gt;Repeat for installs, uninstalls, subscriptions, deactivations, &amp;amp; reactivations.&lt;/li&gt;
&lt;/ol&gt;

&lt;div style=&quot;display: flex;justify-content:center;&quot;&gt;
&lt;img alt=&quot;Ain&apos;t nobody got time for that&quot; src=&quot;https://media.giphy.com/media/bWM2eWYfN3r20/giphy.gif&quot; /&gt;
&lt;/div&gt;

&lt;p&gt;Read on for detailed setup instructions, or just copy my Shopify App to Slack notifications workflow here and riff on your own:&lt;/p&gt;

&lt;div class=&quot;flex justify-center my-3&quot;&gt;
  &lt;a href=&quot;https://pipedream.com/new?h=tch_3KDf8Z?via=dylan&quot; class=&quot;pd-copy-workflow shadow&quot;&gt;
    &lt;img width=&quot;50&quot; src=&quot;https://res.cloudinary.com/tinyhouse/image/upload/v1645806127/Blog/Pipedream/Pipedream-logo_1.png&quot; /&gt;
      Copy this Workflow
  &lt;/a&gt;
&lt;/div&gt;

&lt;h2 id=&quot;enter-pipedream&quot;&gt;Enter Pipedream&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://pipedream.com?via=dylan&quot;&gt;Pipedream&lt;/a&gt; is the perfect solution for this kind of integration.&lt;/p&gt;

&lt;p&gt;I wrote a Shopify Partner API Integration for Pipedream, it’s free and open source to use in your Pipedream workflows.&lt;/p&gt;

&lt;p&gt;Or create your own workflows with one of the 500+ pre-built actions, or build one of your own with Node.js, Python, Go or Bash; all without opening your IDE.&lt;/p&gt;

&lt;h2 id=&quot;steal-my-workflow&quot;&gt;Steal my workflow&lt;/h2&gt;

&lt;p&gt;Setting up the workflow doesn’t require any code, you just need a few copy pastes from your Shopify Partner dashboard to get started.&lt;/p&gt;

&lt;p&gt;Here’s how to do it.&lt;/p&gt;

&lt;p&gt;First, copy my workflow that already connects Shopify App events to Slack:&lt;/p&gt;

&lt;div class=&quot;flex justify-center my-3&quot;&gt;
  &lt;a href=&quot;https://pipedream.com/new?h=tch_3KDf8Z?via=dylan&quot; class=&quot;pd-copy-workflow shadow&quot;&gt;
    &lt;img width=&quot;50&quot; src=&quot;https://res.cloudinary.com/tinyhouse/image/upload/v1645806127/Blog/Pipedream/Pipedream-logo_1.png&quot; /&gt;
      Copy this Workflow
  &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;After your register, click &lt;strong&gt;Copy&lt;/strong&gt; in the top right of the workflow to copy it to your Pipedream account:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/tinyhouse/image/upload/v1646321834/Blog/Pipedream/CleanShot_2022-03-03_at_10.36.21_2x.png&quot; alt=&quot;Click Copy to copy the Shopify Partner Pipedream workflow your your account&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Now you’ll have your own version of the workflow saved to your Pipedream account.&lt;/p&gt;

&lt;h3 id=&quot;creating-a-shopify-parter-api-key&quot;&gt;Creating a Shopify Parter API Key&lt;/h3&gt;

&lt;p&gt;In order to integrate with our new shiny Pipedream workflow with your Shopify Account, you’ll need to create an API key.&lt;/p&gt;

&lt;p&gt;First login to your &lt;a href=&quot;https://partners.shopify.com/&quot;&gt;Shopify Partner account&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Then open your account settings, scroll to the bottom of the page and click on the &lt;strong&gt;Manage Partner API Clients&lt;/strong&gt; button:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/tinyhouse/image/upload/v1645797451/Blog/Pipedream/CleanShot_2022-02-25_at_08.56.11_2x.png&quot; alt=&quot;Enter Shopify Partner API Client management&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Then click the &lt;strong&gt;Create API Client&lt;/strong&gt; button:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/tinyhouse/image/upload/v1645797592/Blog/Pipedream/CleanShot_2022-02-25_at_08.59.25_2x.png&quot; alt=&quot;Click the Create API Client button&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Awesome. Now you have an Shopify Partner API token you can use to authenticate your Pipedream workflow with:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/tinyhouse/image/upload/v1645797834/Blog/Pipedream/CleanShot_2022-02-25_at_09.02.48_2x.png&quot; alt=&quot;Copy the Shopify Partner API Client secret key you created&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;find-your-shopify-partner-organization-id&quot;&gt;Find your Shopify Partner Organization ID&lt;/h3&gt;

&lt;p&gt;This one is hidden in plain sight.&lt;/p&gt;

&lt;p&gt;Opening up your Shopify Partner Settings reveals your Shopify Partner Organization ID:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/tinyhouse/image/upload/v1646322259/Blog/Pipedream/CleanShot_2022-03-03_at_10.43.30_2x.png&quot; alt=&quot;Copy the Shopify Partner Organization ID&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Copy this number too so we can wire our workflow up to it.&lt;/p&gt;

&lt;h3 id=&quot;connecting-your-shopify-partner-account&quot;&gt;Connecting your Shopify Partner account&lt;/h3&gt;

&lt;p&gt;Now armed with both your Shopify Partner Organization ID &amp;amp; API Key, we can return to your Pipedream workflow to finish the integration.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/tinyhouse/image/upload/v1646322070/Blog/Pipedream/CleanShot_2022-03-03_at_10.38.59_2x.png&quot; alt=&quot;Click Connect Shopify Partner to setup your connection&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Now enter in your Shopify Partner ID we copied from before, your new Shopify Partner API key, and give this integration a name:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/tinyhouse/image/upload/v1646322596/Blog/Pipedream/CleanShot_2022-03-03_at_10.49.19_2x.png&quot; alt=&quot;Creating the Shopify Partner source in Pipedream&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;connecting-your-shopify-app&quot;&gt;Connecting your Shopify App&lt;/h3&gt;

&lt;p&gt;The last integration step is to inform the workflow which of your Shopify Apps it should integrate with.&lt;/p&gt;

&lt;p&gt;So let’s find your App’s ID and enter it into the workflow.&lt;/p&gt;

&lt;h3 id=&quot;find-your-apps-id&quot;&gt;Find your App’s ID&lt;/h3&gt;

&lt;p&gt;Your App ID can be found by visiting your app details in the Shopify Partner Dashboard and viewing the URL.&lt;/p&gt;

&lt;p&gt;It’s the number after the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/apps/&lt;/code&gt; portion of the URL:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/tinyhouse/image/upload/v1645813248/Blog/Pipedream/CleanShot_2022-02-25_at_13.20.04_2x.png&quot; alt=&quot;Finding your Shopify Partner App ID in the Dashboard&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;entering-your-shopify-app-id-into-the-workflow&quot;&gt;Entering your Shopify App ID into the workflow&lt;/h3&gt;

&lt;p&gt;Back in the workflow enter in the App ID in this format:&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gid://partners/App/&amp;lt;your App ID here&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/tinyhouse/image/upload/v1646322857/Blog/Pipedream/CleanShot_2022-03-03_at_10.52.20_2x.png&quot; alt=&quot;Connecting your Shopify App to the Workflow&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Click &lt;strong&gt;Save&lt;/strong&gt; to finish the integration.&lt;/p&gt;

&lt;h2 id=&quot;connect-to-your-slack-workspace&quot;&gt;Connect to your Slack workspace&lt;/h2&gt;

&lt;p&gt;Congrats, the hard part is over. Connecting to Slack is a cinch with Pipedream. Scroll down to the last step in the workflow and click &lt;strong&gt;Connect account&lt;/strong&gt; to authorize your Slack account:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/tinyhouse/image/upload/v1646323175/Blog/Pipedream/CleanShot_2022-03-03_at_10.59.10_2x.png&quot; alt=&quot;Connecting your Slack account to the Workflow&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;configuring-the-slack-message&quot;&gt;Configuring the Slack message&lt;/h3&gt;

&lt;p&gt;This is the real final step. Enter in these values for the Slack action and click &lt;strong&gt;Save&lt;/strong&gt; then &lt;strong&gt;Deploy&lt;/strong&gt; in the top bar.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/tinyhouse/image/upload/v1646323482/Blog/Pipedream/CleanShot_2022-03-03_at_11.00.56_2x.png&quot; alt=&quot;Configuring the Slack step&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Here’s the values for each field to make it easier to copy &amp;amp; paste:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Option&lt;/th&gt;
      &lt;th&gt;Value&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Slack Channel&lt;/td&gt;
      &lt;td&gt;Choose from the dropdown menu&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Blocks&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;{{ steps.nodejs.$return_value }}&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Notification Text&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;New Shopify Notification&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Bot Username&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Shopify Partner&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Icon&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;:shopping_bags:&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Don’t forget to click &lt;strong&gt;Save&lt;/strong&gt; then &lt;strong&gt;Deploy&lt;/strong&gt; to make your Workflow live.&lt;/p&gt;

&lt;p&gt;If all goes well, you’ll be getting updates in real time from your Shopify App.&lt;/p&gt;

&lt;p&gt;This is just one example of the cool &amp;amp; useful things you can do with Pipedream.&lt;/p&gt;

&lt;p&gt;Want to see another no code workflow example? Send your tutorial requests to me by &lt;a href=&quot;mailto:me@dylanjpierce.com&quot;&gt;email&lt;/a&gt; or message me on Twitter at &lt;a href=&quot;https://twitter.com/ctrlaltdylan&quot;&gt;@ctrlaltdylan&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You can also catch me hanging out at the &lt;a href=&quot;https://join.slack.com/t/pipedream-users/shared_invite/zt-11sazmsg0-oS2VW~mZfhtk3XfEEvb~JA&quot;&gt;Pipedream community Slack&lt;/a&gt; as well as our &lt;a href=&quot;https://pipedream.com/community/&quot;&gt;forum&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Have a prosperous day!&lt;/p&gt;
</description>
        <pubDate>Thu, 24 Feb 2022 00:00:00 +0000</pubDate>
        <link>http://blog.dylanjpierce.com/blog/2022/02/24/shopify-partner-installs-to-slack-no-code.html</link>
        <guid isPermaLink="true">http://blog.dylanjpierce.com/blog/2022/02/24/shopify-partner-installs-to-slack-no-code.html</guid>
        
        
        <category>blog</category>
        
      </item>
    
      <item>
        <title>Why Pipedream?</title>
        <description>&lt;p&gt;I just wanted to make a quick write up on the next team I’ve joined and the product we’re building - &lt;a href=&quot;https://pipedream.com&quot;&gt;Pipedream&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;what-is-pipedream&quot;&gt;What is Pipedream?&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/tinyhouse/image/upload/v1641424488/Blog/Pipedream/pipedream_banner.png&quot; alt=&quot;Pipedream - connect APIs remarkably fast&quot; /&gt;&lt;/p&gt;

&lt;p&gt;In layman’s terms, Pipedream is a workflow builder. It’s a platform where you can build workflows from a series of pre-built steps - or build your own.&lt;/p&gt;

&lt;p&gt;For example, with just a few clicks in Pipedream you can build a workflow to listen for a specific hashtag on Twitter and add them onto a Google Spreadsheet:&lt;/p&gt;

&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/6eq813uEExc&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;

&lt;p&gt;What’s even more amazing is that this workflow will keep populating this spreadsheet the the newest tweets &lt;em&gt;in real time&lt;/em&gt;. Your spreadsheet is now a living database, just a few clicks.&lt;/p&gt;

&lt;p&gt;There are over 500 integrations available out of the box, which means you can build nearly limitless applications.&lt;/p&gt;

&lt;p&gt;You might be saying - ok cool Dylan; but I can do this same thing in Zapier or IFTT? What’s the big deal?&lt;/p&gt;

&lt;p&gt;The big deal is that with Pipedream you can jump down into code &lt;em&gt;at any time&lt;/em&gt;. You don’t need to register as a developer, you don’t need to jump through anyhops to customize a workflow to meet your needs.&lt;/p&gt;

&lt;p&gt;It’s abstracted just enough to get started, and flexible enough to grow with your requirements.&lt;/p&gt;

&lt;h2 id=&quot;the-dog-food-tastes-good&quot;&gt;The dog food tastes good&lt;/h2&gt;

&lt;p&gt;“Eating your own dog food” is tech speak for writing tools that you actually use.&lt;/p&gt;

&lt;p&gt;It’s a silly phrase, but the idea is powerful. By building products you actually use, you become the expert in the customer’s wants and needs.&lt;/p&gt;

&lt;p&gt;I loved working for RVshare because I am very much into travel and for a time lived out of tiny house full time. It was very close to dog fooding.&lt;/p&gt;

&lt;p&gt;Pipedream is like that, except for maybe renting an RV once a year, I have used Pipedream to do all kinds of interesting workflows &lt;em&gt;without coding&lt;/em&gt;:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Adding subscribers to a Mailerlite group automatically to kick off welcome &amp;amp; marketing email campaigns&lt;/li&gt;
  &lt;li&gt;Notifying a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#finance&lt;/code&gt; Slack channel whenever my business bank account balance changes&lt;/li&gt;
  &lt;li&gt;Sending me a daily summary of revenue &amp;amp; profit from my Shopify apps&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You might be saving to yourself, yea doesn’t Zapier &amp;amp; IFFT kind of do the same thing?&lt;/p&gt;

&lt;p&gt;In a ways yes, but Pipedream takes it a step further because you can create artibitrary living scripts on the fly.&lt;/p&gt;

&lt;h2 id=&quot;the-difference-between-high-code--no-code&quot;&gt;The difference between high code &amp;amp; no code&lt;/h2&gt;

&lt;p&gt;You’re probably aware of how often Google Spreadsheets replaces an application. It’s a quick &amp;amp; dirty malleable database with some basic permission handling, very vague history logging, and does an OK job at showing data.&lt;/p&gt;

&lt;p&gt;Where it falls short is painfully obvious for many reasons &lt;a href=&quot;https://dylanjpierce.com/personal/2020/01/04/actionsheets-concept.html&quot;&gt;I’ve written about before&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;But it’s the backbone for many “side” effect work in businesses for one off tasks or follow ups by various departments. Anyone with or without coding skills can edit a spreadsheet’s structure, modify values and formatting.&lt;/p&gt;

&lt;p&gt;On the flipside - a high code solutions are much closer to concrete - they’re much more rigid, slow and expensive to implement. The pro side is they are the operating closer to bare metal - a custom application can fit any mold, withstand change management thanks to &lt;a href=&quot;https://github.com&quot;&gt;Git&lt;/a&gt; and make custom interfaces.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/tinyhouse/image/upload/v1641606146/Blog/Pipedream/Screen_Shot_2022-01-07_at_8.41.52_PM.png&quot; alt=&quot;No code vs code-ful vs high code&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Pipedream is not another application framework, nor is it a replacement for no-code tools like Zapier or IFTT. Instead it’s enhancing the productivity for all by building a solution in the sweet spot of low code.&lt;/p&gt;

&lt;h2 id=&quot;at-the-end-of-the-day-were-all-just-internet-plumbers&quot;&gt;At the end of the day, we’re all just internet plumbers&lt;/h2&gt;

&lt;p&gt;Whether we like to admit it or not, too much of our time is spent on wiring our application with 3rd party services.&lt;/p&gt;

&lt;p&gt;We give ourselves lofty titles like Full Stack Engineer, Software Developer, etc. But let’s be honest, we know our apps just are clever integrations of 2 or more APIs with some custom logic between and the right interface for our audience.&lt;/p&gt;

&lt;p&gt;We could ship more and faster, but we’re held back by necessary yet trivial work.&lt;/p&gt;

&lt;p&gt;How many times have you had to program&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Add a newly user to your marketing email provider to start a drip campaign?&lt;/li&gt;
  &lt;li&gt;Make a one off CLI task to upload some data to a Google Sheet for accounting?&lt;/li&gt;
  &lt;li&gt;Make a Slack message on a specific event or on a timer for debugging or operation purposes?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The reality is engineers have to not only provide solutions for customers - but support internal departments as well.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How developers would like to spend their time:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/tinyhouse/image/upload/c_scale,w_450/v1641424463/Blog/Pipedream/Untitled-2022-01-05-1729.png&quot; alt=&quot;How we think we&apos;re spending out time&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The reality:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/tinyhouse/image/upload/c_scale,w_450/v1641424463/Blog/Pipedream/reality.png&quot; alt=&quot;How we&apos;re actually spending our time&quot; /&gt;&lt;/p&gt;

&lt;p&gt;After the first 3 dozen times installing a official package for your language or framework of choice, wiring it up to your business logic - you’ve already fallen for the maintainence trap.&lt;/p&gt;

&lt;p&gt;Heaven forbid you forget to make sure your app doesn’t crash when the service is down. And now you’re having to keep up with maintaince and security updates on this package within the core of your application.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Your time is expensive, you should focus on providing real value to your customers via your differentiated core product above all else.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;democraticizing-serverless--event-based-systems&quot;&gt;Democraticizing serverless &amp;amp; event based systems&lt;/h2&gt;

&lt;p&gt;The promise of serverless is &lt;em&gt;mostly&lt;/em&gt; misguided. The idea that your application would separate into microservices with sharply narrowed focus sounds smart, but in reality it &lt;em&gt;adds complexity&lt;/em&gt; not reduces it.&lt;/p&gt;

&lt;p&gt;The worst of it is that it’s a heavy investment of time &amp;amp; learning without the gain of saving time in the long run. The holy grail of infinite scalability for “free” actually costs in terms of moving the debugging level up to the network, resource intensive &amp;amp; heavily complex dev environments. Heck, the concept of keeping “warm” doesn’t exist for apps running on 1 server. Long running functions? Woof be careful there.&lt;/p&gt;

&lt;p&gt;The real benefits of serverless are only harvested by large teams that had dedicated engineers to just documenting and developing these cases, well until now.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Your app should only be concerned providing the primary process that brings value to your customer - everything else can be handled with asychronous &amp;amp; out of band workflows.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Since Pipedream’s interface to your application is really just HTTP webhooks, you get an event based serverless workflow without learning a new framework or an complex event system like Kafka.&lt;/p&gt;

&lt;p&gt;With Pipedream you can create workflows that trigger on your business events, freeing up your developers to concentrate on building the best experience for your customers.&lt;/p&gt;

&lt;p&gt;Examples of common businesses events you can map to Pipeline Workflows:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;customer.registered&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;order.created&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;subscription.upgraded&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All of these events have clear primary objectives in your businesses application. However, there are secondary actions like registering new customers with your marketing email providers, reporting to analytics dashboards, etc.&lt;/p&gt;

&lt;h2 id=&quot;raising-the-stakes-by-lowering-the-bar&quot;&gt;Raising the stakes, by lowering the bar&lt;/h2&gt;

&lt;p&gt;More often than not a good tool will do the following:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Organize complexity&lt;/li&gt;
  &lt;li&gt;Lower the bar to entry&lt;/li&gt;
  &lt;li&gt;Empower a wider audience to build solutions they couldn’t before&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pipedream is checks all of these boxes above, and is just getting started.&lt;/p&gt;

&lt;p&gt;Interested in learning more?&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://pipedream.com?via=dylan&quot;&gt;Build your first workflow&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://pipedream.com/docs/components/quickstart/nodejs/actions/?via=dylan&quot;&gt;Develop a Pipedream integration&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://twitter.com/ctrlaltdylan&quot;&gt;Tweet @ me&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;pierce@pipedream.com&quot;&gt;Email me&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://join.slack.com/t/pipedream-users/shared_invite/zt-ernlymsn-UHfPg~Dfp08uGkAd8dpkww&quot;&gt;Join our Slack community&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Tue, 04 Jan 2022 00:00:00 +0000</pubDate>
        <link>http://blog.dylanjpierce.com/blog/2022/01/04/why-pipedream.html</link>
        <guid isPermaLink="true">http://blog.dylanjpierce.com/blog/2022/01/04/why-pipedream.html</guid>
        
        
        <category>blog</category>
        
      </item>
    
      <item>
        <title>Rails can humanize strings too</title>
        <description>&lt;h2 id=&quot;enumerated-values-are-not-people-friendly&quot;&gt;Enumerated values are not people friendly&lt;/h2&gt;

&lt;p&gt;Frameworks typically don’t include this kind of method out of the box with Strings. If you have an an emum of machine level names, naturally you want to use underscores and lowercases to keep it machine friendly:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;   class Vehicle
     enum vehicle_type: %i(car truck semi_truck motorcyle)
   end
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;If you ever wanted to print out the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;vehicle_type&lt;/code&gt; in a string, your users would be a little confused as to why there would be underscores in the text:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;   @vehicle.vehicle_type = :semi_truck
   puts &quot;This type of vehicle is a #{@vehicle.vehicle_type}&quot;
   
   # not really user friendly... just say &quot;semi truck&quot;
   =&amp;gt; &quot;This type of vehicle is a semi_truck&quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;enter-humanize&quot;&gt;Enter Humanize&lt;/h2&gt;

&lt;p&gt;Developer happiness is exactly what Rails so famously preaches above all else. And the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;String#humanize&lt;/code&gt; method is a great example.&lt;/p&gt;

&lt;p&gt;Without even having to create a mapping of &lt;em&gt;cannoncial&lt;/em&gt; names to their given machine names, you can use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.humanize&lt;/code&gt; to convert underscores into spaces:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;   @vehicle.vehicle_type = :semi_truck
   puts &quot;This type of vehicle is a #{@vehicle.vehicle_type.humanize}&quot;
   
   # yay, now our output is much more _human_ friendly. Remember, we write apps for real people
   =&amp;gt; &quot;This type of vehicle is a semi truck&quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;There’s even support for options like &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;capitialize: true&lt;/code&gt; which will captialize the string:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;   @vehicle.vehicle_type = :semi_truck
   puts &quot;This type of vehicle is a #{@vehicle.vehicle_type.humanize(captialize: true)}&quot;
   
   # yay, now our output is much more _human_ friendly. Remember, we write apps for real people
   =&amp;gt; &quot;This type of vehicle is a Semi Truck&quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Anyway, &lt;a href=&quot;https://apidock.com/rails/String/humanize&quot;&gt;check the docs out&lt;/a&gt; but that’s my 5 minute cool find for today. Happy building.&lt;/p&gt;
</description>
        <pubDate>Wed, 29 Jul 2020 23:52:40 +0000</pubDate>
        <link>http://blog.dylanjpierce.com/ruby-on-rails/2020/07/29/rails-can-humanize-strings.html</link>
        <guid isPermaLink="true">http://blog.dylanjpierce.com/ruby-on-rails/2020/07/29/rails-can-humanize-strings.html</guid>
        
        
        <category>ruby-on-rails</category>
        
      </item>
    
  </channel>
</rss>
