惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Martin Fowler
Martin Fowler
L
LINUX DO - 最新话题
P
Proofpoint News Feed
Cyberwarzone
Cyberwarzone
Know Your Adversary
Know Your Adversary
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
L
Lohrmann on Cybersecurity
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Security Latest
Security Latest
T
The Exploit Database - CXSecurity.com
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
P
Privacy & Cybersecurity Law Blog
K
Kaspersky official blog
The Last Watchdog
The Last Watchdog
Webroot Blog
Webroot Blog
Scott Helme
Scott Helme
T
Threat Research - Cisco Blogs
C
Cyber Attacks, Cyber Crime and Cyber Security
WordPress大学
WordPress大学
L
LINUX DO - 热门话题
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - Franky
V
Visual Studio Blog
O
OpenAI News
AI
AI
Hacker News: Ask HN
Hacker News: Ask HN
V2EX - 技术
V2EX - 技术
GbyAI
GbyAI
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Simon Willison's Weblog
Simon Willison's Weblog
S
Schneier on Security
Spread Privacy
Spread Privacy
Y
Y Combinator Blog
I
InfoQ
H
Hackread – Cybersecurity News, Data Breaches, AI and More
T
Threatpost
C
Cybersecurity and Infrastructure Security Agency CISA
F
Fortinet All Blogs
C
CERT Recently Published Vulnerability Notes
T
The Blog of Author Tim Ferriss
C
Check Point Blog
Apple Machine Learning Research
Apple Machine Learning Research
有赞技术团队
有赞技术团队
人人都是产品经理
人人都是产品经理
N
News and Events Feed by Topic
Project Zero
Project Zero
小众软件
小众软件
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
B
Blog
G
Google Developers Blog

Bryan Robinson's Blog

Does our technology still work for us? Astro Server Island for latest Bluesky post (heavily cached!) Type-safe environment variables in Astro 5.0 New Website, but really is it? Netlify Durable Cache: Caching for a third-party world Introducing the Hygraph Astro Content Loader Integrating Astro.js Starlight Documentation into a Next.js Project Using Proxies Jamstack is meaningless 😱 Book Release: Eleventy by Example – Learn 11ty with 5 in-depth projects 11ty Second 11ty: Creating Template Filters 11ty Second 11ty: Global Data files (JS and JSON) 11ty second 11ty: The Render Plugin Part 1 Help needed: Netlify Frontend environment variables with Astro.js Quick experiment with the Slinkity 11ty plugin Creating a dynamic color converter with 11ty Serverless Using 11ty JavaScript Data files to mix Markdown and CMS content into one collection How to show your template code in 11ty blog posts New City, New Job, New Content Using Nunjucks Climbing the 11ty Performance leaderboard with Cloudinary, critical CSS and more Three JAMstack movements to watch in 2020 Create a Codepen promo watermark with no additional HTML, CSS or JS 3 underused CSS features to learn for 2020 Use CSS Subgrid to layout full-width content stripes in an article template Adapt client-side JavaScript for use in 11ty (Eleventy) data files CSS Gap creates a bright future for margins in Flex as well as Grid Create your first CSS Custom Properties (Variables) Use CSS Grid to create a self-centering full-width element Creating an 11ty Plugin - SVG Embed Tool Now offering design and code reviews at PeerReviews.dev Routing contact-form emails to different addresses with Netlify, Zapier and SendGrid Create an Eleventy (11ty) theme based on a free HTML template Client work and the JAMstack Grid vs. Flex: A Tale of a "Simple" Promo Space Using Eleventy The Tech Barrier to Entry What Can We Learn from CERN Let Practical CSS Grid - Launching My First Course Build Trust on the Web incorporating User Worries with your User Stories 2019 The Year of Markup-First Development Refactoring CSS into a Sass mixin Starting a new journey with Code Contemporary Dynamic Static Sites with Netlify and iOS Shortcuts Top 3 uses for the ::before and ::after CSS pseudo elements How To: Use CSS Grid to Mix and Match Design Patterns Use CSS ::before and ::after for simple, spicy image overlays Modern CSS: Four Things Every Developer and Designer Should Know About CSS 3 Strategies for Getting Started with CSS Grid CSS Tip: Use rotate() and skew() together to introduce some clean punk rock to your CSS The 5 Stages of Grid Love How To: A CSS-Only Mobile Off Canvas Navigation How To: Use CSS Grid Layout to Make a Simple, Fluid Card Grid Make a More Flexible Cover Screen with CSS Grid Can CSS Grid open up interesting CMS Layout options? Firefox 52 to Introduce New Box-Alignment Values Falling Forward — Rethinking Progressive Enhancement, Graceful Degradation and Developer Morality Start Exploring the Magic of CSS Grid Layout I Converted My Blog to CSS Grid Layout and Regret Nothing Feature Queries are on the Rise CSS Shapes — Let the Text Flow Around You Flexbox -- Let Memorializing Prince and Print vs. The Web I went to Italy and noticed UX fails How to Get Designers to Contribute in Open Source The True Gift of Your Former Code
Product pricing, dev bad habits, and the role of the pit of success
2024-12-19 · via Bryan Robinson's Blog
a well-designed system makes it easy to do the right things and annoying (but not impossible) to do the wrong things” - Jeff Atwood

Pricing disincentivizes best practices.

It shouldn’t.

How? Well, you might recognize the Atwood quote from his blog “Falling into the pit of success” (which was originally a talk by Rico Mariani and blog by Brad Abram.

The Pit of Success basically states that language or API design should be made so that “our customers [can] simply fall into winning practices by using our platform and frameworks”.

While Atwood (and Abram and Mariani) were talking about language and API design, I recently had the pleasure of attending a Developer Experience (DX or DevX) talk by Chris Coyier where he made “the pit of success” more accessible to me, a developer with a penchant for frontend:

”React’s dangerouslySetInnerHTML prop is a perfect example of making the wrong thing harder. If you have a bit of raw HTML, it’s the wrong thing, generally, to just plop it onto a page (that’s ripe for XSS security vulnerabilities). So React automatically escapes, and thus makes safe, that HTML, but it also won’t really be HTML anymore, it will be a string representation of that HTML and probably not what you want. If you absolutely know it’s safe and need to do it anyway, you can but it’s annoying in that you have to use this weirdly named prop and pass in the value in a bit of a convoluted way”.

In other words, React protects you from doing something you may not be aware is wrong. It makes you think. It makes you pause. It annoys you. You REALLY have to want to do it that way to do it.

By relating it to React and relating that back to his developer product Codepen, it hit me: the “well-designed systems” that Atwood referred to are broader than API design or even framework design; “well-designed systems” refers to to connection between the goals of your users, the functionality of your product, and the design of how users can accomplish what they want with your product.

What does all this have to do with pricing?

Let’s be honest, the teams building the features are probably not the same teams pricing them or deciding what feature is available in which pricing plan or what the quota is. In fact, the teams building the features are probably focused on building a “well-designed system”. But your customer journey doesn’t begin at “logged in”, it begins at “should I invest my time and money to adopt this product”.

Remember, a “well-designed system” takes the goals of your users, the functionality of your product, and the design of how users can accomplish what they want with your product into consideration. And when your product does exactly what a team needs, but you have seat caps, you might have an entire team sharing 1 seat. So the pricing of your product might actually be undoing all of the effort to build a “well-designed system”.

And here is a fact that we have to acknowledge: Pricing is a gate.

If that gate keeps people from using your features in the “proper way,” then it will encourage bad behaviors. Devs and small businesses will seek to get as much value out of your lowest plan or your free plan as they can. Workarounds are inevitable.

Let’s go back to the sharing seats example. Is an entire team sharing 1 seat ideal? No. Is it a bigger deal for your business than for your customer? Yeah, probably. But even if we think this is a relatively small issue, your customers are learning a bad habit. And as a result, they are likely missing out on the “well-designed system” that the engineering team has built behind the login. They probably can’t use collaboration features, or are losing out on security features because they’re forced to share credentials, or they are missing out on the ability to customize each team member’s experience with the product because it needs to be generic enough to fulfill an entire team’s needs. And this is the best case scenario!

When a specific pricing tier forces customers into really bad habits or workarounds, they begin to wonder if your product is worth it. While you intended your pricing to be a small gate to encourage customers to upgrade, what you’ve done is make your customer think you’ve hurt their user experience, and they’ll begin to find other products.

Real-world examples

Here are a few examples. These are REAL examples, though I’m purposefully obfuscating companies and some have even been fixed.

A search engine product

There’s an amazing search product. You’ve probably used it. The free tier will get you a long way and this particular pricing issue has been cleared up.

Here’s the rub: When you have a search index, it’s made up of multiple pieces of data. Once upon a time, part of pricing was how many items you had in your indices. That makes sense from a business perspective, for sure. It also doesn’t seem like a big deal. I’ve got a small blog, I don’t need too many items in my index. I’ve got a relatively small e-commerce store, not a big deal.

The problem comes when you consider a specific best practice the company pushed for: search results from deep parts of content.

Imagine you do a search and instead of getting the entire article as a result, you want to link a user to a deep section of that content. In order to do this, the best practice was to split your content items up into individual chunks that would be entered into the index. One article in search would result in a dozen or more items in your index. When part of pricing is how many items you have in your index, you’ll make the customer begin to wonder if they can afford you OR make them shy away from your suggested best practice.

  • Best practice: Deconstruct your content to allow for deeper linking, thus getting users to what they want faster
  • Pricing Gate: I can stay on the lower plan by keeping each content item as one entry, even if it’s slightly worse for my user.

Same search product, different story

Pricing can also affect the perception of your company as a best practice for whole industries!

Much of the marketing around this product was centered on the value of well-tailored search results when tied directly to things that generate revenue. When you have a high-end e-commerce site, you get a lot of revenue from one sale. Each small interaction on your site is hugely important and search and personalization are critical. They’re also highly critical for content sites and for applications, but they’re harder to assign direct value capture.

The easy sell for the company was to high-end e-commerce. They focused most of their energy and content on this market segment. The problem was they wanted to get more customers that were content sites and full applications.

The pricing made sense for high-end e-commerce. Value was easy to associate. The pricing jump from free to even mid-level self-service pricing was HUGE: hundreds of dollars a month. When each search can directly correlate to a direct conversion, sale, or upsell, it’s an easy cost to justify. If you can’t associate direct revenue to each search, the price made no sense. So while the product was easily the industry-best paid search, customers outside of a narrow persona would churn quickly. They just didn’t see the value.

Instead of using this industry-leading search structure, application developers would just create their own search. Not what I’d consider a best practice. The amount of work, thought, architecture, design and more that goes into good search is ridiculous (and not something many teams are equipped to take on).

I actually worked at a product that made the switch from this platform to an in-house developed search because the pricing didn’t make economic sense. Part of the core of the product was searching a database of users. Needless to say, the user experience plummeted as a result of this switch.

It took months to reach some amount of feature parity and to fix many of the issues that came up as a result. We had search best practices built into the SaaS. We had to build those from scratch or ignore them… and honestly, many were ignored.

That being said, it “just cost internal resources.” It didn’t cost $5,000+ a year with no “discernible revenue impact.” And this is where the search product failed. Because the company I worked for probably ended up investing more through employee time and had a worse search experience. With a slight change to pricing, the search product could have kept us as a customer, my company could have saved money, developers could have built more interesting features, and our customers would have had an all around better experience.

The worst part is that the search company wanted this use case. It was exactly the target market they wanted to enter, but because of the pricing, they couldn’t effectively attack it.

I’d have to do a cost analysis on the SaaS’s new pricing structure, but this might also have been fixed in the years since. In all honesty, their pricing is still highly complex, so I don’t plan on running that analysis for fun

  • Best Practice: Search is an integral feature for many applications and websites; SaaS search products will almost always create better experiences than internally-developed quick searches
  • Pricing Gate: If your product is priced with the assumption that each search will lead to more revenue, but search isn’t directly tied to revenue, I’ll be more likely to create my own.

A federated platform that didn’t encourage federation

In this example, we have a federation platform whose pricing actively discouraged proper federation.

Federation is the concept that you can bring multiple APIs together into one unified experience. Often this is a big benefit to developers, but with the right platform, can be excellent for non-technical users, as well.

The platform wasn’t solely a federation platform, but had a series of pieces that allowed developers and non-technical folks to access and use data from multiple data sources. This was truly interesting and was a great feature set. It truly shined when you could add multiple external APIs to federate. While one API was interesting, being able to combine multiple APIs began to show real promise. Imagine an e-commerce platform where your marketing team had access to up-to-date product information and inventory, and both the marketing and product teams had access to reviews. All the information living in their own tailored systems, but federated into one useful place.

The free plan allowed for 1 source. That’s fine. It would have showed the true value if it allowed for 2, but I understand the need to gate complex use cases. The problem was even on the paid tier (which was expensive), you still had a strong limit. I believe it was 2-3. (Now 0 on free and 1 on paid with pricing per additional source).

Here’s the issue: As a developer, I can work around this and remain on the free plan. One way would be to consolidate APIs before putting them into the platform. In other words, federating my API before putting it into a federation platform. By doing this, I end up negating half the value proposition: the platform is supposed to combine my APIs, I shouldn’t have to do that before entering the platform.

From there, all that’s left is the value proposition for the non-technical folks. In general, that was a new segment of people to benefit from federation. Most of them had never had access to external data, and wouldn’t even know they would want it. So, but alienating the developer persona, we made it harder to sell to the non-technical persona. If the non-technical persona wasn’t asking for the feature, the developer persona would just turn to the tools they were already familiar with to do the job.

By pricing it in this way, they encouraged a bad habit which encouraged users to not engage with that feature set. And again, we’ve landed in a scenario where developers lose (they have to set up a new platform), cross-functional collaborators lose out (they don’t have access to all the data, and may even need to ask developers for help regularly, and end-users lose out on the remixed content, products, and other ideas that could have been if these personas could work together better.

  • Best Practice: Combine all your APIs into one API that is available for developers and non-tech users alike, allowing for interesting remixes and combinations.
  • Pricing Gate: If I’m only allowed 1 API, I’m more likely to federate my APIs externally and possibly never give my non-technical users access. We lose out on high-potential cross-team collaboration and new content types that could have been…

Hosting platform that makes me question best practices

This section is less about pricing encouraging bad practices and more about the capitalistic drive to make money at the theoretical direct expense of best practices.

There exists a hosting platform that has its own meta framework. They’re both very popular. I’ve enjoyed using them both.

Their meta framework started out as a solid static-site generator with great frontend features. As the hosting business got stronger, more and more server-side features continued to roll out in the meta framework. No big deal, having some server-side and some build-time and some client-side seemed like a good idea! Best of all worlds, right?

Over time, the server-side aspects of the framework took more and more of the “best practice” conversation. Now, I wouldn’t necessarily consider this framework a “meta” framework. I consider it more a server-side framework. Which is quite odd when I think about it.

The hosting platform pushes the narrative that the server-side conversation is actually best practice. It may very well be. I’m not fully convinced personally, but that may be my own bias towards static. The problem is that I truly have to think: “Are they pushing me to server side rendering because their hosting prices on API calls and function invocations?” I’d like to think that’s not the case, but I’ve been in startup world for too long not to know that it’s at least partially the case.

  • Best Practice: For any given site or application, what IS the best practice? Static? SSR? Client-rendered? Each use case is unique and has different feature needs. Pick the right one.
  • Pricing Gate: Incentives of a framework created by a hosting company obfuscates best practices by shoe-horning SSR into all sites.

Back to the pit of success

I understand business. I even understand capitalism. I understand that we need to make money on our products. I understand that pricing needs to gate valuable features. Here’s the thing: we need to gate the right features in the right ways to encourage upgrading and upsells and discourage bad habits and bad practices.

A well-designed system can do that. A well-designed system includes pricing. By helping users accomplish their goals in ways they’ll enjoy using, they’ll be life-long product users. Each sale, will be less vulnerable to the churn that comes from a system that has “workarounds.”

Again, I’m not a pricing expert (though, I DO love telling CEOs—and product managers, and product marketing managers, and product leads, and CPOs… you get the picture— what I think of their pricing, so hit me up if you want to chat about this), but there has to be a better way.

I’ve got a couple thoughts on that. I’ll add them lightly here and maybe dig deeper in a follow-up article.

When thinking about pricing, focus on two areas: security and convenience.

Security and peace of mind

Security can mean things like Single-Sign On and authentication features, but more than anything, what I mean by this style of feature is peace of mind. I’m willing to pay money to feels secure in what’s happening inside my application.

Each change I make inside your product is a chance to introduce a bug or a regression. Each new piece of data is a chance to add a typo. Each new user in the system is a potential for accidental carnage. Here are some pricing elements that can help ease a user’s worries around using your product.

  • Backups for the entire database
  • Backups for individual pieces of data
  • Rollbacks
  • Strong permissions
  • Content locks

Convenience features

Never underestimate the human desire for laziness. While we can get the job done without convenience features, we’ll be much more comfortable if we use them.

This is why users/seats are often a great pricing lever. We mentioned seats as a “benign” bad practice before. One seat can get the job done and the bad habits have minimal impact on product use… it can be much more annoying to only have one user. At some point, that inconvenience can be a great driver into a paid plan.

Here are some other thoughts on sales levers based on convenience:

  • Scheduled publishing
  • Scheduled releases
  • Workflow management
  • Commenting and collaboration features
  • Strong search (hey! Just like in one of our examples!)
  • Duplication
  • Integrations with other systems

Landing and expanding

These features aren’t always necessary. In fact, many of them aren’t necessary when a customer is just starting up. They need them later on when they’ve established more value from use of your product. When more users are in the system or more aspects of their product are using yours.

These features enable what we see in the SaaS world as a strong “land and expand” motion. Get them using the product; allow them to do things at a best practice; and when they’re happy (to use a sales technique), then “twist the knife” and show them that they can have even better experiences and sleep better at night with the paid plan. Of course, this only works if your customers are happy with your product. All the more reason to make sure they’re using the product correctly.

Conclusion

When I worked in user experience, I used to talk about how all pricing is technically “bad UX.” I stand by that, but I also used to remind everyone that UX can’t just be about “what’s best for the user,” it has to be about marrying business goals with user needs. Good relationships are built on compromise, but require a shared set of core values. In this case, users need to feel they get more value out of your product than the value you’re asking in return. Give them the best experience possible so that they share the value properly.

This is also the case with developer experience and developer tools.

We need to find ways to make the best DX that can drive people toward both best practices and eventually paying when the value proposition finally takes hold. Pricing is an integral part of how UX and DX work. If you’re a DevRel or DX lead, you need to be vocal in pricing conversations. This isn’t always easy (and is probably a subject for a follow-up blog post). The key is as a DevRel is that you know exactly how developers will work around your company’s pricing. Talk to your users and community, show your team exactly what their amazing features look like when a customer is reticent to pay and works around pricing.

Long-term, pricing that makes doing best practices harder will always catch up with a company, whether through churn based on perceived bad experience, missed opportunities due to misunderstandings, or just not realizing your product is a good fit for my company.

A well-designed system allows for your users to make an easy decision on paying you money; not an easy decision on hacking together solutions to work around paying.