Skip to main content
← All notes
Building

Not every package has a price tag and that is deliberate

software

Some services cannot be priced upfront. A full web application, a multi-day musician booking, an enterprise accessibility remediation — these need a conversation before a number. The product catalog handles this with a single check. Every product has a pricePence field. Fixed-price packages store a real number. Quote-based packages store null and a priceLabel like Get a quote. The isPurchasable function checks whether pricePence is a valid positive number. If it is, the checkout page renders the full four-step Stripe payment wizard. If it is not, the page renders a QuoteRequest component instead. The QuoteRequest shows the package name, description, features with accent-coloured checkmarks, the price label, and two calls to action — Call me about this project and E-mail your dream. Both are anchor links that jump to sections in the sidebar accordion on the same page. The call button uses a solid accent background. The email button uses a bordered outline. Both have a two-percent scale on hover. No dead ends. A client who lands on a quote-based package is guided straight into a conversation instead of bouncing off a missing Buy Now button. The ProductCard component on the service page adapts too. Purchasable products show a Buy now button with the accent background. Quote products show a Get a quote button with a bordered outline. Same card, same layout, one conditional style. The entire branching logic between paid checkout and quote request is one boolean check on one field. No separate routes, no feature flags, no conditional page components. One product array, one checkout page, one boolean.

Comments coming soon

Sign in with TikTok to leave a comment. Coming soon.