npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2025 – Pkg Stats / Ryan Hefner

@ntitle-ai/sdk

v0.2.4

Published

Stripe native, low code pricing, plans and feature analytics for SaaS founders.

Readme

Feature Tracking State Model

1. High-Level States (Feature Lifecycle)

A feature flow typically involves the following core states:

| Context Field | Description | Example Values | | ------------------ | ------------------------------------- | ------------------------------------- | | feature_name | The feature being tracked | "subscription_modal" | | trigger_source | What initiated the feature? | "navigation_menu", "promo_banner" | | modal_id | Identifier for modals (if applicable) | "upgrade_options" | | selected_option | If an option was chosen, which one? | "premium_plan", "basic_plan" | | error_code | If an error occurs, what was it? | "500_INTERNAL_SERVER_ERROR" | | interaction_type | What type of user action? | "click", "input", "hover" |

Understanding Sub-States

Each parent state can have multiple sub-states that provide important context about how or why a state transition occurred. Here's the logical purpose of each group of sub-states.

Feature Checked

Feature checks are a special case of events that are captured when the SDK checks to see if the user is entitled to a feature or has used up their feature allowance. You do not need to track these events manually as they are automatically captured when calling meterCheck or featureCheck.

  • entitled: Represents a check from FE or BE to see if the user is entitled to the feature
  • meter: Represents a check from FE or BE to see if the user has used up their feature allowance

Feature Initiated

  • user: Represents intentional, direct actions by the user
  • system: Represents automated or programmatic triggers of featuresoutside of user control

Feature Configuration

  • modal: Represents configuration that interrupts the main workflow with a focused interface
  • inline: Represents configuration that occurs within the natural flow of the interface

Feature Interaction

  • selected: Represents choosing from predefined options or making discrete choices
  • edited: Represents free-form modifications or custom input

Feature Progressed

  • advanced: Represents forward progress through a defined sequence
  • reversed: Represents backward movement through a defined sequence

Feature Completed

  • confirmed: Represents successful, intended completion of the feature flow
  • inaccessible: Represents completion blocked by business rules or permissions

Feature Abandoned

  • cancelled: Represents explicit, intentional abandonment
  • idled: Represents passive or timeout-based abandonment
  • closed: Represents interface-level abandonment
  • clicked_away: Represents indirect or navigation-based abandonment

Feature Paywalled

  • configured: Represents setup or customization prior to payment
  • plan_selected: Represents primary monetization choice
  • frequency_selected: Represents secondary monetization parameters

Feature Error

  • validation: Represents user-correctable input or logic errors
  • system: Represents technical failures outside of user control

These sub-states help categorize the specific manner in which a state change occurred, enabling more detailed analysis of user behavior and system performance. When tracking events, choose the sub-state that best describes the logical nature of the transition, rather than focusing on the specific UI implementation.

| Parent State | Sub-State | Event Name | Example Use Case | | ----------------------- | -------------------- | -------------------------------------- | ----------------------------------------------------------------------- | | feature_initiated | user | feature_initiated.user | User clicks a button. The common case, used in most cases. | | | system | feature_initiated.system | System pops a feature e.g., during onboarding. | | feature_configuration | modal | feature_configuration.modal | A modal loads to request further information or decision from the user. | | | inline | feature_configuration.inline | A user is asked to provide more data or a decision. | | feature_interaction | selected | feature_interaction.selected | User chooses an option. | | | edited | feature_interaction.edited | User edits a form field. | | feature_progressed | advanced | feature_progressed.advanced | User completes a wizard step. | | | reversed | feature_progressed.reversed | User goes back a step. | | feature_completed | confirmed | feature_completed.confirmed | Form submitted or confirmation button clicked. | | | inaccessible | feature_completed.inaccessible | User's plan or role does not allow them to use the feature. | | feature_abandoned | cancelled | feature_abandoned.cancelled | User hits cancel button and backs out of the flow. | | | idled | feature_abandoned.idled | User inactive for too long. | | | closed | feature_abandoned.closed | User closes a modal to back out of the flow. | | | clicked_away | feature_abandoned.clicked_away | User clicks away to back out of the flow. | | feature_paywalled | configured | feature_paywalled.configured | User selects a number of seats or usage level. | | | plan_selected | feature_paywalled.plan_selected | User selects from one of the plans. | | | frequency_selected | feature_paywalled.frequency_selected | User chooses between month or year. | | feature_error | validation | feature_error.validation | Form validation failed. | | | system | feature_error.system | API call failed. |


2. Contextual Metadata (System & Developer Provided)

To enrich events and make analysis easier, each event should include both system-generated and developer-provided context, which together provide a complete view of user behavior. System-generated data ensures consistency and captures environmental factors, while developer-provided context adds domain-specific insights that help interpret user intent.

System-Generated Context (Captured Automatically)

| Context Field | Description | Example Values | | ------------------ | ------------------------------------------------- | --------------------------------------------- | | session_id | Unique identifier for the user's session | "abc123" | | timestamp | Event timestamp | "2025-02-21T12:30:00Z" | | device_type | Device category | "mobile", "desktop" | | browser | Browser type/version | "Chrome 120", "Safari 17" | | os | Operating system | "Windows 11", "iOS 17" | | network_status | Connection quality | "4G", "Wi-Fi" | | latency | API response time (if applicable) | 250ms | | dom_event | The raw DOM event associated with the interaction | { type: "click", target: "#submit-button" } | | interaction_type | Extracted from the DOM event | "click", "input", "hover" |


Developer-Provided Context (Captured from Application Logic)

| Context Field | Description | Example Values | | ----------------- | ------------------------------------------------------------------------------------------ | -------------------------------- | | system_id | Unique ID from your Db. This allows events to be tracked through your BE and other systems | "user_789" | | feature_name | The feature being tracked. This does not have to be a valid Stripe feature | "awesome_mode" | | selected_option | If an option was chosen, which one? | "premium_plan", "basic_plan" | | error_code | If an error occurs, what was it? | "500_INTERNAL_SERVER_ERROR" |