
GITNUXSOFTWARE ADVICE
Technology Digital MediaTop 10 Best Containerization Software of 2026
Top 10 Containerization Software picks for 2026 with ranking of Docker, Kubernetes, and Podman. Compare container stacks for deployment.
How we ranked these tools
Core product claims cross-referenced against official documentation, changelogs, and independent technical reviews.
Analyzed video reviews and hundreds of written evaluations to capture real-world user experiences with each tool.
AI persona simulations modeled how different user types would experience each tool across common use cases and workflows.
Final rankings reviewed and approved by our editorial team with authority to override AI-generated scores based on domain expertise.
Score: Features 40% · Ease 30% · Value 30%
Gitnux may earn a commission through links on this page — this does not influence rankings. Editorial policy
Editor’s top 3 picks
Three quick recommendations before you dive into the full comparison below — each one leads on a different dimension.
Docker
Dockerfile builds with layer caching and BuildKit-backed performance improvements
Built for teams shipping microservices with Docker images and Compose-managed environments.
Kubernetes
Editor pickHorizontal Pod Autoscaler driven by metrics for workload scaling
Built for teams running production microservices needing strong orchestration and scaling controls.
Podman
Editor pickRootless containers with user namespaces for safer, daemonless execution
Built for teams modernizing Linux container workflows with rootless security and pod grouping.
Related reading
Comparison Table
This table compares top containerization stacks across integration depth, data model, automation and API surface, and admin and governance controls. It reviews how each tool structures provisioning and configuration, exposes automation APIs, and supports RBAC and audit log workflows. The goal is to map each platform’s schema and extensibility to operational needs like deployment throughput and sandboxing.
Docker
container runtimeDocker builds, runs, and distributes container images with container runtime and developer tooling for local development and production deployments.
Dockerfile builds with layer caching and BuildKit-backed performance improvements
Docker stands out for its developer-first workflow around Dockerfiles and a reusable image format. It delivers core container capabilities through Docker Engine, a Dockerfile-based build pipeline, and an image registry workflow using Docker Hub or compatible registries.
The platform also supports orchestration with Docker Compose for multi-container apps and Docker Swarm for built-in clustering. Docker Desktop extends the experience with Linux and Windows container support, integrated Kubernetes, and local tooling for building, running, and debugging containers.
- +Fast container builds using Dockerfile layers and build cache
- +Compose simplifies multi-service apps with environment and network configuration
- +Integrated registry workflow supports image versioning and distribution
- +Wide ecosystem and tooling integration across CI and observability stacks
- –Swarm features and adoption lag behind mainstream Kubernetes ecosystems
- –Networking and volume semantics can confuse teams during environment parity
- –Secure-by-default posture requires careful image hardening and scanning setup
- –Large fleets benefit from orchestration discipline beyond single-host usage
Platform engineering teams
Standardize builds with Dockerfiles
Faster, consistent deployments
DevOps and SRE teams
Run multi-container services via Compose
Fewer integration issues
Show 2 more scenarios
Application developers
Package apps and publish images
Reusable distribution artifacts
Build Docker images from source and push them to Docker Hub or registries.
Infrastructure teams
Orchestrate clustered workloads with Swarm
Simplified cluster operations
Deploy services across nodes with built-in scheduling and scaling using Docker Swarm.
Best for: Teams shipping microservices with Docker images and Compose-managed environments
More related reading
Kubernetes
orchestrationKubernetes orchestrates containerized workloads across clusters with scheduling, self-healing, and scaling primitives.
Horizontal Pod Autoscaler driven by metrics for workload scaling
Kubernetes stands out for orchestrating containers through declarative desired state across clusters. It provides scheduling, scaling, service discovery, and rolling updates using core objects like Deployments and Services.
Built-in extensibility supports storage integration, network policy enforcement, and autoscaling via common add-ons and controllers. The platform’s power depends on assembling a compatible cluster, networking layer, and operational toolchain.
- +Declarative Deployments and ReplicaSets enable predictable rolling updates
- +Flexible scheduling with labels, taints, and affinity rules supports complex placement
- +Service discovery and load balancing are integrated via Services and Ingress
- –Cluster operations require strong expertise in networking, storage, and security
- –Debugging failures across controllers and distributed workloads can be time-consuming
- –Many production capabilities rely on additional components and configuration
Platform engineering teams
Standardize multi-cluster application deployments
Fewer environment-specific deployment changes
SRE and ops teams
Achieve zero-downtime rolling upgrades
Reduced production downtime risk
Show 2 more scenarios
Security and compliance teams
Enforce network segmentation policies
Tighter traffic access control
Teams apply NetworkPolicy objects to restrict pod-to-pod traffic for regulated workloads.
Data and ML platform teams
Run batch jobs with autoscaling
Higher utilization during peak runs
Teams schedule containerized workloads and use autoscalers to handle variable training and inference demand.
Best for: Teams running production microservices needing strong orchestration and scaling controls
Podman
daemonless runtimePodman runs containers and pods with a daemonless architecture and works with Docker-compatible container images.
Rootless containers with user namespaces for safer, daemonless execution
Podman stands out by running containers without a daemon while using familiar Docker-compatible commands. It supports rootless container execution, pod-level grouping, and standard image build and run workflows.
The tool integrates with common container registries and enables OCI-compliant image usage across environments. Podman’s CLI-centric design makes it well suited for environments that need strong security isolation and scriptable operations.
- +Daemonless operation reduces attack surface and simplifies lifecycle management
- +Rootless mode improves security by avoiding privileged daemon requirements
- +Pod abstraction coordinates networking and lifecycles across multiple containers
- +Docker-compatible CLI lowers migration friction for existing tooling
- –Networking behavior can be harder to predict across host and rootless modes
- –Compose-style orchestration requires extra tooling beyond the core CLI
- –Advanced debugging of layered storage and permissions can be time-consuming
DevOps engineers
Daemonless container builds in CI pipelines
More secure CI container execution
Security teams
Rootless containers for least privilege
Reduced host privilege exposure
Show 2 more scenarios
Platform administrators
Pod grouping for tightly coupled services
Cleaner service lifecycle management
Podman pods bundle related containers with shared networking and lifecycle management for simpler operations.
SRE teams
Docker-compatible workflows with OCI images
Fewer toolchain migration issues
Podman uses Docker-compatible CLI patterns while consuming OCI-compliant images from registries.
Best for: Teams modernizing Linux container workflows with rootless security and pod grouping
More related reading
OpenShift
enterprise platformOpenShift provides an enterprise Kubernetes platform with built-in developer workflows, container image management, and cluster governance.
OpenShift builds with Source-to-Image and pipelines
OpenShift stands out for its enterprise-oriented Kubernetes distribution with built-in security, developer workflows, and operational tooling. It supports application deployment using Dockerfile-based builds, container images from registries, and standard Kubernetes primitives like Deployments and Services.
Platform capabilities include integrated monitoring, logging, and role-based access controls, plus cluster management features aimed at multi-team operations. Strong alignment with hybrid and disconnected environments makes it well-suited to regulated enterprise container workloads.
- +Enterprise Kubernetes with strong default security controls and policy tooling
- +Integrated developer build workflows from source and container images
- +Operational monitoring and logging components reduce stitching work
- +Good fit for multi-team cluster governance and namespace isolation
- –Cluster operations can require deep Kubernetes and OpenShift knowledge
- –Platform abstractions can feel heavyweight for small workloads
- –Customization of platform-level components often adds complexity
- –Learning curve for enforcing policies across CI and runtime
Best for: Enterprises standardizing Kubernetes with secure governance and hybrid deployments
Rancher
cluster managementRancher manages Kubernetes clusters through a centralized interface with multi-cluster lifecycle and workload operations.
Rancher cluster management with multi-cluster UI control and policy-driven governance
Rancher stands out by centralizing Kubernetes operations for multiple clusters through a single management plane. It provides workload lifecycle tools like cluster and namespace management, Helm integration, and built-in applications catalog workflows.
Strong access control and user management support multi-team platform administration across environments. It is most compelling for organizations that need consistent Kubernetes governance rather than just single-cluster deployment tooling.
- +Centralized management across multiple Kubernetes clusters with consistent policies
- +Helm workflows and app catalog style deployment for repeatable releases
- +Role-based access control and multi-namespace governance for platform teams
- –Complex setup and upgrades can be challenging for smaller teams
- –Operational debugging may still require direct Kubernetes CLI knowledge
- –Advanced customization can feel constrained by the UI-first workflows
Best for: Platform teams managing multiple Kubernetes clusters with governed deployments
Docker Compose
multi-container toolingDocker Compose defines multi-container applications using declarative configuration and orchestrates startup and networking for local runs.
Compose file service definitions with built-in networking and volume wiring
Docker Compose stands out by turning multi-container setups into a single declarative YAML file. It coordinates containers, networks, volumes, and environment variables using one command, with lifecycle actions like up, down, and restart. Compose also supports build steps, service scaling, and healthchecks to manage startup order more reliably in local development and CI pipelines.
- +Declarative service definitions with networks and volumes in one Compose file
- +Simple orchestration using up, down, and restart for local and test environments
- +Built-in support for healthchecks and depends_on ordering controls
- +Scales via replicas per service for repeatable integration testing
- –Compose is not a full production orchestrator for large fleet scheduling
- –Complex dependency graphs can still require manual tuning and scripting
- –Cross-host deployments require additional tooling beyond core Compose
Best for: Teams building repeatable local stacks and integration test environments
More related reading
Helm
package managementHelm packages and deploys Kubernetes applications using versioned charts and templated configuration.
Helm’s templating system renders Kubernetes manifests from chart templates and values files
Helm distinguishes itself with a package manager for Kubernetes that turns complex manifests into versioned, reusable charts. It provides a templating engine that renders YAML from values files, making deployments reproducible across environments.
Release management with install, upgrade, and rollback workflows supports safer application changes. Chart dependency handling and a large ecosystem of existing charts reduce effort for common infrastructure components.
- +Versioned charts standardize Kubernetes deployments with consistent release workflows
- +Template rendering from values enables environment-specific configuration without duplicating manifests
- +Helm upgrade and rollback improve change control for Kubernetes releases
- +Chart dependencies simplify installing multi-component applications
- –Templating can obscure final YAML output and complicate debugging
- –Chart sprawl and inconsistent value schemas create maintenance overhead
- –Helm does not replace Kubernetes controllers for long-running orchestration logic
Best for: Teams standardizing repeatable Kubernetes deployments with reusable chart packages
Terraform
infrastructure as codeTerraform provisions and manages infrastructure needed for container platforms such as Kubernetes clusters and container networking.
Terraform state with refresh, drift detection, and targeted updates using resource addressing
Terraform stands out by modeling infrastructure and container platforms as versioned, declarative configurations. It can provision Kubernetes resources, manage container images through workflows, and integrate with CI systems using plan and apply output for repeatable releases.
Strong state management supports controlled rollouts across environments. Broad provider coverage connects Terraform-managed infrastructure to the container workloads that run on top of it.
- +Declarative HCL lets teams describe container platforms and dependencies as code
- +Plan and apply workflow provides predictable infrastructure changes
- +Large provider ecosystem supports wiring containers to cloud resources
- +State enables controlled updates and drift detection across environments
- –State handling adds operational complexity for container-centric deployments
- –Module composition can become difficult to maintain at scale
- –Learning curve exists around dependency graphs and lifecycle controls
- –Terraform does not run containers, it provisions the systems around them
Best for: Teams standardizing Kubernetes infrastructure and container dependencies with infrastructure-as-code
More related reading
Argo CD
GitOps deploymentArgo CD continuously syncs Kubernetes manifests from Git repositories to running clusters using declarative GitOps deployments.
Application health and drift detection with continuous sync against Git
Argo CD stands out by turning Kubernetes Git workflows into continuous, declarative deployments. It tracks desired state from a Git repository and reconciles live cluster state by using the Argo CD controller and sync operations. Core capabilities include application manifests, automated sync, rollbacks via revision history, and health and drift detection to highlight configuration differences.
- +Declarative GitOps with automated reconciliation and drift detection
- +Rich health reporting for Kubernetes resources to surface sync risks
- +Repeatable deployments using revisions, rollbacks, and application history
- +Flexible application composition with projects, destinations, and RBAC
- –Setup requires solid Kubernetes and GitOps concepts for correct operation
- –Large multi-tenant setups can demand careful configuration and security tuning
- –Advanced sync options increase operational complexity during troubleshooting
Best for: Teams standardizing Kubernetes deployments with GitOps and continuous reconciliation
Argo Workflows
workflow orchestrationArgo Workflows executes containerized steps on Kubernetes with DAG workflows, artifact passing, and task retry support.
Workflow DAGs with template parameters and retries across containerized steps
Argo Workflows turns Kubernetes into a workflow engine by defining steps as Kubernetes-native templates. It supports complex orchestration with DAGs, retries, parameters, artifacts, and cron schedules.
Container execution runs in pods, so workflow steps integrate directly with container images, volumes, and service accounts. This makes it a strong fit for containerized batch processing and multi-step automation with Kubernetes primitives.
- +Kubernetes-native workflow orchestration maps directly to pods and templates
- +DAGs, retries, and parameters support robust multi-step container pipelines
- +Artifacts enable passing files between steps via consistent Kubernetes storage patterns
- –YAML-heavy workflow definitions add complexity for large, frequently changing pipelines
- –Debugging can be difficult when failures occur across dependent pods and retries
- –Operational overhead increases when clusters need dedicated controllers and permissions
Best for: Teams running Kubernetes batch workflows needing DAG scheduling and artifact passing
Conclusion
After evaluating 10 technology digital media, Docker stands out as our overall top pick — it scored highest across our combined criteria of features, ease of use, and value, which is why it sits at #1 in the rankings above.
Use the comparison table and detailed reviews above to validate the fit against your own requirements before committing to a tool.
How to Choose the Right Containerization Software
This buyer's guide covers Docker, Kubernetes, Podman, OpenShift, Rancher, Docker Compose, Helm, Terraform, Argo CD, and Argo Workflows for containerization workflows that span build, runtime, governance, and automation.
The guide focuses on integration depth, a concrete data model for desired state or configuration, automation and API surface, and admin and governance controls across the container toolchain.
The recommendations map specific stack choices to real mechanisms like Dockerfile layer caching with BuildKit, Kubernetes Deployments and Services, Podman rootless pods, and OpenShift Source-to-Image pipelines.
Containerization tooling for building images, running pods, and governing desired state
Containerization software covers the tools that build container images, run containers and pods, orchestrate workload lifecycles, and manage configuration as declarative state. It targets problems like repeatable provisioning of runtime environments, predictable rollout and reconciliation, and controlled multi-team access to cluster actions.
Tools like Docker provide a Dockerfile-based build pipeline with layer caching and a registry workflow via Docker Hub or compatible registries. Kubernetes then manages the runtime using declarative desired state through objects like Deployments and Services, plus scheduling, self-healing, and rolling updates.
Evaluation criteria for integration, configuration data models, automation surfaces, and governance
Containerization tool selection succeeds when integration depth matches the target workflow, from Dockerfiles and registries to Kubernetes manifests and GitOps. It also succeeds when the configuration data model is explicit enough to support auditing, rollback, and controlled change.
Automation and API surface determine whether teams can provision and reconcile environments consistently. Admin and governance controls then decide whether multi-team operations can enforce RBAC, policy controls, and audit-grade visibility without manual tribal knowledge.
Declarative desired-state objects for predictable rollout and reconciliation
Kubernetes uses Deployments and ReplicaSets to drive rolling updates and predictable Replica changes, which supports controlled production rollouts. Argo CD continuously reconciles live cluster state with Git repository desired state and provides automated sync, rollbacks via revision history, and drift detection.
Dockerfile build pipeline with layer caching and BuildKit-backed performance
Docker builds images using Dockerfile layers with build cache and BuildKit-backed improvements that reduce rebuild time across CI and local runs. This matters when throughput depends on fast iteration across image changes and when teams distribute versioned images through a registry workflow.
Daemonless and rootless execution model with pod-level grouping
Podman runs containers without a daemon and supports rootless execution using user namespaces, which reduces the privileged surface required for local and CI execution. Pod grouping coordinates networking and lifecycles across multiple containers, which helps when one app needs multiple cooperating services.
Cluster administration controls and multi-team governance primitives
OpenShift includes role-based access controls and policy tooling aimed at enterprise multi-team governance, and it integrates operational monitoring and logging into the platform. Rancher centralizes multi-cluster lifecycle operations with RBAC and multi-namespace governance, which reduces duplicated admin work across environments.
Extensibility through Kubernetes packaging and templated release configuration
Helm packages Kubernetes manifests into versioned charts and renders YAML from chart templates and values files. That chart templating supports environment-specific configuration without duplicating manifests, which helps standardize repeated Kubernetes deployments across teams.
Automation orchestration with Kubernetes-native workflows and artifact passing
Argo Workflows turns Kubernetes into a workflow engine using templates that run containerized steps in pods. It provides DAG scheduling, retry logic, cron schedules, and artifact passing through Kubernetes storage patterns, which fits multi-step batch pipelines that must move files between tasks.
A decision path from build and runtime mechanics to governance and automation depth
Start with the runtime control plane and align every downstream automation tool to the same operational model. Kubernetes targets production workload orchestration using scheduling, self-healing, and rolling updates via core objects like Deployments and Services.
Then verify the configuration and automation surface, since image build automation differs from cluster reconciliation automation. Finally confirm governance fit, since OpenShift and Rancher target RBAC and multi-team cluster administration while Docker Compose and Docker focus on local and single-host multi-container setups.
Pick the orchestration control plane based on production vs local lifecycle needs
For production microservices that need scaling and self-healing, choose Kubernetes as the orchestrator and plan for Deployments and Services as the workload data model. For local multi-container stacks and integration tests, choose Docker Compose with a single declarative Compose file that wires networks and volumes and controls startup with healthchecks and depends_on.
Match the configuration data model to how changes must be reviewed and rolled back
For Git-based change control and continuous reconciliation, use Argo CD so Kubernetes desired state stays synchronized with Git and includes health, drift detection, and revision history rollbacks. For templated Kubernetes releases, use Helm so teams render consistent manifests from values files and can standardize repeated deployments.
Select image build and distribution tooling that fits the rebuild loop
If image build iteration speed is the bottleneck, choose Docker because it uses Dockerfile layer caching and BuildKit-backed performance improvements. If the runtime host model needs reduced privilege, choose Podman for rootless container execution with user namespaces while keeping Docker-compatible CLI workflows and OCI-compliant image usage.
Confirm admin and governance controls across clusters and namespaces
For enterprise Kubernetes standardization with policy tooling, use OpenShift because it includes built-in role-based access controls plus operational monitoring and logging. For platform teams managing multiple clusters from one interface, use Rancher because it centralizes cluster and namespace management with RBAC and policy-driven governance.
Add automation only where the workflow engine fits the workload shape
For multi-step containerized batch jobs with retries, parameters, DAG scheduling, and artifact passing, use Argo Workflows so workflow steps run as pods with Kubernetes-native templates. For infrastructure and cluster dependency provisioning that surrounds Kubernetes, use Terraform to manage Kubernetes resources and container dependencies as versioned declarative configurations with plan and apply plus drift detection via state refresh.
Which teams should adopt which containerization tools
Containerization tooling differs sharply by whether the priority is build and local orchestration, cluster runtime, or cluster operations governance. The best fit can be determined by the target lifecycle object, such as Dockerfile builds, Kubernetes desired state, or workflow DAG steps.
The sections below map real audience targets to specific tools from the ranked list.
Teams shipping microservices with Docker images and Compose-managed environments
Docker fits this audience because its Dockerfile build pipeline uses layer caching with BuildKit-backed performance and because Docker Compose provides a single declarative YAML file for networks, volumes, and environment wiring.
Teams running production microservices that need orchestration, scaling, and self-healing
Kubernetes fits this audience because Deployments and ReplicaSets drive rolling updates and because Horizontal Pod Autoscaler scales workloads based on metrics. Kubernetes teams often pair it with Helm for templated releases or Argo CD for GitOps reconciliation and drift detection.
Teams modernizing Linux container workflows that require rootless security
Podman fits this audience because it runs containers without a daemon and supports rootless execution through user namespaces. Pod grouping helps teams coordinate multi-container apps as pods while keeping Docker-compatible CLI workflows for existing scripts.
Enterprises that must standardize Kubernetes with governance and hybrid constraints
OpenShift fits this audience because it is an enterprise Kubernetes distribution with built-in role-based access controls, plus Source-to-Image builds and integrated monitoring and logging. It also supports hybrid and disconnected patterns for regulated workloads.
Platform teams managing multiple Kubernetes clusters and governed workloads
Rancher fits this audience because it provides centralized multi-cluster lifecycle operations with RBAC and multi-namespace governance. Rancher complements Kubernetes by reducing duplicated admin work while keeping workload actions aligned across environments.
Common containerization tool pitfalls tied to real gaps in the reviewed toolchains
Common failures happen when teams pick the wrong layer of the stack or when they assume a tool will cover orchestration and governance that it does not. Several tools also introduce failure modes around networking behavior, templating complexity, or operational debugging across distributed controllers.
The pitfalls below map directly to concrete limitations seen across Docker, Kubernetes, Podman, OpenShift, Rancher, Docker Compose, Helm, Terraform, Argo CD, and Argo Workflows.
Treating Docker Compose as a production orchestrator
Docker Compose coordinates multi-container services with networks and volumes, but it does not act as a large fleet scheduler for production orchestration. Use Kubernetes for rollout, self-healing, and scaling when workloads grow beyond single-host integration testing.
Forcing Helm templating on workflows that require controller-level debugging
Helm templating can obscure the final Kubernetes YAML, which complicates debugging when a rendered manifest fails. When controller behavior and runtime reconciliation matter, use Kubernetes-native inspection and consider Argo CD for drift detection tied to Git revisions.
Assuming Podman networking and permissions behave identically in all modes
Podman can show harder-to-predict networking behavior across host and rootless modes, which impacts environment parity. Validate rootless and host networking behavior in the same runtime mode used by CI and developers before locking in permission and networking assumptions.
Skipping governance and RBAC design for multi-team cluster operations
Kubernetes can require strong expertise to operate networking, storage, and security controls, which increases the risk of ad hoc access patterns. Use OpenShift RBAC and policy tooling or Rancher centralized RBAC and multi-namespace governance to standardize admin controls.
How We Selected and Ranked These Tools
We evaluated Docker, Kubernetes, Podman, OpenShift, Rancher, Docker Compose, Helm, Terraform, Argo CD, and Argo Workflows using a criteria-based scoring model that emphasizes feature coverage, ease of use, and value. Features carry the most weight at 40% while ease of use and value each account for 30% of the overall result. The scoring reflects how directly each tool supports concrete mechanisms like Dockerfile layer caching with BuildKit, Kubernetes Deployment and Service desired state, and Argo CD continuous sync with drift detection.
Docker separated itself from lower-ranked tools because its Dockerfile build pipeline with layer caching and BuildKit-backed performance improvements directly accelerates the developer and CI rebuild loop, which lifted both the features coverage and the ease-of-use outcomes.
Frequently Asked Questions About Containerization Software
Docker vs Kubernetes vs Podman: what changes in day-to-day operations?
Which tool best fits container builds that need reproducible pipelines and cached layers?
How do container orchestration choices affect service discovery and scaling behavior?
What role does GitOps play with Kubernetes deployments, and which tool implements it?
Which Kubernetes configuration workflow is better for templating and reusable deployment definitions: Helm or direct manifests?
How do data migrations typically integrate with containerized platforms during rollout?
What security controls map to RBAC, SSO, and audit logging in Kubernetes-centered stacks?
How do admin controls differ between a Kubernetes platform distribution and a multi-cluster management UI?
Which tool should teams pick for Kubernetes workload automation beyond service deployments?
What extensibility and API-driven integrations matter most when building platform automation around containers?
Tools reviewed
Primary sources checked during evaluation.
Referenced in the comparison table and product reviews above.
Keep exploring
Comparing two specific tools?
Software Alternatives
See head-to-head software comparisons with feature breakdowns, pricing, and our recommendation for each use case.
Explore software alternatives→In this category
Technology Digital Media alternatives
See side-by-side comparisons of technology digital media tools and pick the right one for your stack.
Compare technology digital media tools→FOR SOFTWARE VENDORS
Not on this list? Let’s fix that.
Our best-of pages are how many teams discover and compare tools in this space. If you think your product belongs in this lineup, we’d like to hear from you—we’ll walk you through fit and what an editorial entry looks like.
Apply for a ListingWHAT THIS INCLUDES
Where buyers compare
Readers come to these pages to shortlist software—your product shows up in that moment, not in a random sidebar.
Editorial write-up
We describe your product in our own words and check the facts before anything goes live.
On-page brand presence
You appear in the roundup the same way as other tools we cover: name, positioning, and a clear next step for readers who want to learn more.
Kept up to date
We refresh lists on a regular rhythm so the category page stays useful as products and pricing change.
