The Most In-Depth Review of Top 2 .NET eCommerce Platforms: Virto Commerce vs. nopCommerce
Well, luckily for you, I've already done the work, so I want to present you with the ultimate guide for comparing the two most popular .NET ecommerce platforms: Virto Commerce versus nopCommerce.
Consider the Scope of the eCommerce Software When Assessing It
Here it should be said, first of all, that it is impossible to directly compare two ecommerce products from different vendors. In fact, you should never say ‘this product is better or worse’ in general terms, you have to always specify — the best for which size of business, for the B2C or B2B sector, on which platform the development was done, and using many other criteria. As a result, there are really no two ecommerce platforms on the market that are nearly identical.
So the most important issue to clarify is that this review of Virto Commerce and nopCommerce is comparing two ecommerce platforms developed on Microsoft .NET. nopCommerce is a lightweight product for SMBs in the B2C sector, and it mainly uses the ASP.NET Core web development framework, which is just a part of Microsoft .NET.
For its turn, Virto Commerce is a B2B platform for enterprise-level ecommerce. During development, either ASP.NET Core or another .NET framework is used, including development for Azure services, for AI and Mobile.
products, you may be confused by terms like
ASP.NET, ASP.NET Core, .NET, frameworks,
and development environments. You can find a special article,
Understanding Open-Source eCommerce Platform
ASP.NET Core and .NET Terminology,in our blog to help you understand all the nuances of these technologies.
By comparison, nopCommerce is like a B2C manufacturer of passenger cars with lots of bright colors and different interiors and bodies. So, keep this in mind when reading this review.
Since the review is published on the Virto Commerce blog, I propose to first start talking about the nopCommerce platform, including in the context of ASP.NET Core. Let's get started!
nopCommerce at a Glance
Over the course of a dozen years, there were several positionings of nopCommerce in the market, including an open-source ecommerce engine, open-source CMS shopping cart software, and, finally, ASP.NET Core ecommerce platform based on Microsoft technologies.
In 2011, version 2.0 was released, which was ported to ASP.NET MVC 3 and supported Razor syntax for views. Then in 2013, version 3.0 was released, and new versions appeared as Microsoft updated frameworks. Most recently, the migration of the nopCommerce project to .NET 6 took place in February 2022.
major focus is on realizing basic B2C scenarios,
but has some extensions for B2B scenarios for SMBs.
nopCommerce is an open-source ecommerce software that contains both a catalog front end and back-end database with an administration tool. nopCommerce has a fully customizable shopping cart — stable, secure, and extendable. It has a rich ability to style the look of an online store and provides a large set of ready-made extensions available from the NOP Marketplace plug-ins.
- Web platform: ASP.NET Core 6.0 (2022)
- Admin: Razor, Kendo UI, JQuery
- Storefront: Razor + custom themes
- ORM: Linq2db
- Supported databases: Microsoft SQL Server, MySQL Server, PostgreSQL
- Caching: Redis
License Type: Free for “as-is” downloadable distributive, and about $50/month if you prefer to have nopCommerce preinstalled in the cloud with a ready-to-run online store. Although the preinstalled version is residing on a third-party hosting provider, it is assumed that some of your money comes back to nopCommerce as a commission.
nopCommerce is distributed in accordance with Public License Version 3.0. https://github.com/nopSolutions/nopCommerce/blob/develop/LICENSE.md. However, the monetization model assumes that there are paid plug-ins and services from the nopCommerce team like customization and support services. For example, if you want to remove the "Powered by nopCommerce" link from the footer of your nopCommerce website, you will have to pay $250 for a copyright removal (or $125 in some cases).
nopCommerce feature list
Below is the feature list provided on the vendor website:
- Multi-store. You can have as many stores as you want. You manage all stores from a single admin panel. In addition, since all stores share a single database, you can easily share data between them.
- Multi-vendor. You can create a marketplace and allow other merchants to sell their products on your website.
- Drop shipping. You can assign each product in your store to a specific vendor. When a customer orders the product, the vendor will receive an email and ship the order on your behalf. Thus, you won’t have to worry about logistics, inventory turnover, or storage space.
- ACL (access control list). You can control the permissions assigned to each product, category, vendor, etc.
- Responsive web design of the administration panel and the storefront.
- Multilingual support is provided by 300+ language packs.
- RTL support for languages that are written and read from right to left, such as Hebrew, Arabic, Persian, etc.
- SEO. XML and HTML sitemap support, Twitter and Open Graph (Facebook) META tags support, breadcrumbs support, URL canonicalization, SEO-friendly URLs, etc.
- CMS support. You can create a blog, a forum, custom pages, etc.
- Product attributes. SKU (unique “stock keeping unit”), size, weight, color, price, etc.
- Rental products. You can permit customers to rent products.
- Recurring products. You can enable customers to subscribe to products.
- Downloadable products. You can enable customers to download digital offerings, i.e., digital products or services, such as ebooks, online courses, music, or software.
- Reward points program. Your customers can accumulate reward points by spending money on your website. For example, if a customer spends $100 on one order, they get 1 point, each worth $1. When the same customer places another order, they can use the point and $1 will be subtracted from their order total.
- Discounts, coupons, and gift card support.
- Multi-currency supported.
- Tax configuration with EU VAT supported.
- Multiple payment methods. NopCommerce integrates with more than 50 payment methods and gateways.
- Anonymous/guest checkout. You can allow customers to complete their orders without having to log in to your website.
- Multiple shipping methods. You can define custom shipping methods or work with major shipping carriers such as FedEx or UPS. You can also enable in-store pickup and more.
- GDPR compliance supported.
At the same time, there is an ecosystem of plug-ins that allows you to expand the standard capabilities of the platform by installing new plug-ins without having to recompile the project. As of now, plug-ins can be used to expand the level of business logic and front-end user interface.
- Nop.Core, Nop.Data, Nop.Service is a layer of business logic, containing levels of data access, database operation, implementation of basic domain services, security, caching, etc.
- Nop.Web.Framework is a library of visual components, building blocks on which all the presentation part is built.
- Nop.Web – This is ASP.NET Core application, which is the front end of an online store, i.e., user interface.
- Nop.Admin is an administrative panel for working with store data and orders and configuring and viewing user activities.
nopCommerce modularity and plug-in support
nopCommerce plug-ins work as extensions to the platform's basic functionality developed by third-party developers or the NopCommerce team itself, and are distributed via the platform's own marketplace.
With nopCommerce plug-ins and widgets, you can only extend certain parts of the business logic, as well as the front-end user interface and the administrative part. It can be done using the so-called WidgetZones, which are special places in the UI where the plug-ins can be loaded. Note that a plugin also can be used to deliver into the platform the custom implementation of .NET components that can extend or override default Nop implementations via registration them in the DI container (ServiceCollection).
Here's a partial list of the features that can be extended or added by installing plug-ins:
- Various integrations with payment and shipping services
- Tax settlement
- Calculation of discounts and marketing promotions
- Expanded search options
- Adding new controls for admins
- Changes in the front-end theme
nopCommerce uses at least three different types of caching data, which can drastically speed up application performance,
- Memory cache (local)
- Distributed cache using a Redis server, typically activated when needed to run the platform on WebFarms
- FPC (Full-Page Caching) for caching entire front-end pages.
The official nopCommerce Web API plug-in covers all methods of nopCommerce. The Web API plug-in is available with source code. It is a RESTful API built according to the OpenAPI 3.0 specification (OAS). Using a tool like the Swagger UI or within the SwaggerHub platform, it is possible to convert OAS contract into an interactive API console that developers can use to interact with the API. nopCommerce offers a suite of APIs that allows developers to use and extend the platform's built-in features.
Extensibility and customization
For extensions, nopCommerce offers the following capabilities:
- Extending the domain model with new fields requires development, but for some data types, it's possible to add new fields without modification of the code directly from the admin area.
- Extensions with plug-ins and themes are the most preferred way of extensions, as there are no code changes. This means it is easier to get updates and does not affect other plug-ins. But this may require a deep knowledge of the principles of nopCommerce, and cause duplication of code in the plug-in, due to the fact that not all functionality contains extension points. For example, extensions such as overriding the standard controller logic or view would require copying the original code into the plug-in.
- Customization of the solution by directly changing the code is the fastest way to change the standard behavior of the platform, but can cause serious problems with getting updates. Moreover, changes can disrupt the functionality of existing plug-ins and make it difficult to get support from the nopCommerce team.
become critically dependent on the implementation partners
who own the modified code.
It is like a fork in cryptocurrencies —
when this happens, the chain splits,
producing a second blockchain that shares all of its history
with the original, but is headed in an entirely new direction.
Microsoft's ASP.NET Core framework brings built-in security to your online store. By comparison, when you use PHP-based platforms (not like nopCommerce or Virto Commerce), it is necessary to design a protection system from scratch to maintain a minimum level of security.
- GDPR support: nopCommerce meets all the requirements of the European Union laws. All legislative changes are tracked and updates to the platform are made accordingly.
- PCI DSS compliance: Meets all PCI compliance requirements. 50+ integrated payment methods and gateways to transmit credit card data securely.
- Other security features include:
- SSL support to provide secure browsing and online store checkout;
- support of Honeypot to prevent spam;
- strong, yet flexible customer password policy; and
- protection from common web attacks like CSRF or XSS.
With a lack of independent performance benchmark data, only data provided by the nopCommerce team or their partners is available for nopCommerce platform 4.50 version.
- Max number of products is up to 2 million SKUs.
- Max number of stores is up to 50 per instance.
Synthetic test on a cloud server with the following configuration:
- CPU – Intel(R) Core(TM) i5-7400 CPU 3.00 GHz
- RAM – 16.0 GB
- 4.50 version based on .NET 6 against versions on .NET 5 and .NET Core 3.1 provides the following results for the load profile with 250 users connected within a minute and visited a few random application pages (the fewer, the better)
Documentation and support
- Quality and sufficiency of the documentation – Sufficient, good structure, there are sections for users and for developers. Installation scenarios are described in detail.
- Support channels – Only Forum and GitHub issues plus premium paid support
- Open source – Facilitates rapid development and allows users to understand the logic of the platform or make changes to the project without depending on the vendor team.
- Cost – The platform is free in its basic version.
- The technology stack is based on ASP.NET Core 6.0, and the vendor provides regular updates at the pace of the Microsoft .NET roadmap.
- Allows users to run their application on different Windows/Linux platforms.
- Features a simple project (monolithic solution) with a focus on native MS technologies, an almost homogeneous ASP.NET stack of technologies, which does not require developers to have versatile knowledge of other frameworks and platforms. It has a low entry threshold for technical teams.
- Has a plug-in-based extension model and a large number of ready-made plug-ins and widgets (WordPress-like extension model).
- Offers support for front-end themes, which allows for easily changing the appearance of your stores. A large number of ready-made themes from partners are also available, which significantly contributes to the speed of development and changes.
- Provides built-in, basic functionality typical for B2C ecommerce projects.
- The monolithic nature of the nopCommerce solution does not allow for flexible scalability of development and deployment infrastructure.
- There is no possibility to perform independent development of the presentation and back-end parts with independent delivery to the environments.
- It is not possible to horizontally scale the database, in which case it will always be a performance bottleneck.
- In the case of platform customization, you have to make changes to the original platform code, which significantly complicates the process of obtaining updates and increases the compilation time of the project.
Virto Commerce at a Glance
Virto Commerce background
The first version was released in 2011; currently, there are several versions for SaaS, on-premises and cloud-ready ecommerce applications. In addition to the classic Virto Commerce .NET-based platform, which can be installed locally or in the cloud, the SaaS version, Virto Commerce Cloud, and the specialized Virto Marketplace version have been available since 2022.
With Virto Marketplace, your company creates an industry portal or vendor portal with the ability to invite third-party sellers, or just convert your existing online store to a marketplace.
For customers who want to focus entirely on their business without getting sidetracked by technical issues, the brand new Virto Start version is offered, which includes full support for installation and customization from Virto Professional Services. The Virto Start version has been available since May 2022.
the main focus is on creating B2B ecommerce solutions
for enterprise-level projects. With Virto Marketplace version,
companies can convert existing ecommerce B2C or B2B portals
into a private or industry-oriented marketplace with third-party seller products.
Virto Commerce technology stack
The following technologies are used in the development of Virto Commerce:
- .NET Core 6.0 and as a base web API platform
- EF Core as primary ORM
- ASP.NET Core Identity for authentication and authorization
- OpenIddict as OpenID Connect server and for OAuth 2.0 protocol implementation
- SignalR Core for push notifications
- HangFire for running background tasks
- Redis as cache backplane on scale-out
- ASP.NET Core 6.0
- Vue 3.0 – Progressive Java Script framework
- Tailwind CSS – As main CSS framework for presentation
- Typescript – All components and composables have type definitions, so IDE can help you build clean working code
- Vite – Script and CSS bundler
Also, with its rich possibilities for expansion and the general orientation toward developer convenience, the platform can act as an application framework for the creation of more complex ecommerce projects. The modular architecture, along with flexible horizontal scalability, allows for use in heavily loaded projects with a large number of users.
License Type: Virto Commerce Commercial License has a free Small Business License edition which is offered at no charge if your company meets the requirements of the Small Business License (mainly revenue restriction, i.e., group yearly revenue not exceeding US $1,000,000).
For prices on Virto Cloud SaaS, Virto Marketplace, and Virto Start versions, please contact the Virto sales team.
The Virto Commerce Open Source License Version 3.0 (VCOSL) consists of the Open Software License 3.0 (OSL-3.0) with the Additional Terms in Exhibit A:
Logically ordered Virto Atomic Architecture™
The lack of clear rules for how different components fit together has been a challenge in developing software applications. With every new module needing to be integrated into the application ecosystem, especially from third parties, it becomes increasingly difficult without well-defined standards on what needs to be done when integrating.
Until now, among ecommerce vendors, no one except Virto has offered partners’ and clients’ development teams such a harmonious and logically understandable architecture as the Virto Atomic Architecture™.
The core concept behind Virto Atomic Architecture™ is to think about an ecommerce application as a nested-structure universe, in which the smallest components (atoms) are included inside bigger elements (cells) that are, finally, included in large, fully functional apps we call the “organisms”.
You can read about Virto Atomic Architecture™ in detail in our blog posts:
What Is Virto Atomic Architecture™?
Reusing and Recomposing as Key Benefits of Virto Atomic Architecture™
Virto Commerce feature list
Below is the feature list for Virto Commerce:
- Enterprise-oriented – Ready for all types of ecommerce, regardless of the size of the business.
- Open source/transparency – Transparent code and development processes, an open product community hosted on GitHub.
- Headless – The content presentation layer is separated from the business logic and functional layer.
- API-driven – All methods are available via REST-API.
- Modularity – Virto Commerce has a truly modular architecture. Such an approach achieves all the benefits of an agile development process in a multi-dev team environment. This makes feature development and the delivery process much faster, reduces the overall complexity of the system, and, as a result, lowers the cost of ownership.
- Modern – Uses a modern technology stack of ASP.NET Core, EF Core, HTML 5, Elastic Search, Angular, Bootstrap 4.0, and Progressive Web App (PWA).
- Cloud-oriented – Originally designed and optimized to run in the MS Azure cloud; seamlessly integrates with native cloud services provided by the MS Azure ecosystem.
- Scalable – By design, supports vertical and horizontal scalability.
- Extendable – Custom solution development is accomplished without the need for modification of the source code of the platform. There are several extensibility levels, such as the replacement of existing modules, subsystems, or extension of existing functionality. Many subsystems, such as catalog management, order management, and others, have a very flexible structure that allows implementation of a broad variety of business requirements.
- Evolutionary – Designed for evolution with independent feature development and frequent small releases – no monolithic solution with strongly developed CI/CD processes.
- Seamless integration – Allows a new module or feature of an application or hardware to be added or integrated without resulting in any discernable errors or complications.
- Storefront (front end)
- Admins (SPA) applications
- Platform runtime (back end)
The separation of application levels brings three main benefits:
- Performance: Front-end applications in Virto Commerce uses the specialized xAPI service layer that operates as a back end for various kind of front ends. This feature optimizes the handling of all incoming requests from customers.
- Scalability: Because front ends and back ends have their own applications, storages, and deployments, scalability becomes easily achievable given the architecture. Virto Commerce can be scaled out horizontally by simply adding more instances with additional storage without affecting the back-end application and business logic. It is possible to use multiple databases to store data of different domains like catalogs or orders.
- Security: The back-end application is usually hidden behind a firewall, making Virto Commerce even more secure for different ecommerce applications.
- Storefront: Stateless front-end presentation layer for customers connected to xAPI (GraphQL) layer hosted by platform runtime. This layer consists of the following:
- Default VC-theme-B2B-vue theme, which exists out of the box (also might be multiple themes)
- ASP.NET Core storefront application that hosts the themes
- Admins (SPA) applications is a set of applications that contains all back-office presentation logic and uses REST API hosted by platform runtime.
- Platform manager UI, default back-office admin user interface
- Set of specialized UIs like a marketplace vendor portal
- xAPI and REST API provide resources for customer interaction based on GraphQL and Open API standards.
- Modules represent a set of custom extensions that are loaded to the platform runtime and extend the base functionality with new ones. The modules are divided into two groups:
- Core modules are developed and maintained by the Virto team.
- Custom modules are developed by third-party vendors or partners
Modularity and plug-in support
The module structure is constructed as loosely coupled with other modules and represents a delivery unit of desired features that has an independent delivery and release cycle. The typical module structure consists of four main layers:
Each layer provides a single purpose inside a module. In further detail, the:
- Persistence layer is responsible for defining and dealing with the database in a module. Database table schemas and query objects are defined in this layer.
- Business logic layer implements a logical data flow according to the company’s processes. It usually has several business models to serve the necessary functionality.
- Service facade is an entry point of the module. When front-end and back-office applications communicate with the module, they access the service layer first.
- Presentation layer implements back-office related content. In Virto Commerce, each module can extend the admin manager interface in a micro-fronted mode, in which the resulting admin interface is composed of multiple different, loosely coupled parts defined in the modules.
Virto Commerce currently offers around 60+ proprietary Core modules, which provide features ranging from basic ecommerce functions such as catalog management to specific third-party integrations such as Shipstation or Avalara. All these modules are supported by the Virto Commerce team and have regular releases and updates.
You can install modules in the following ways:
- Through the platform manager administrative interface
- Through specialized CLI vc-build, or
- Simply by copying to disk folder ~/modules
This is a partial list of non-functional features that developers declare:
- Development performance. Facilitates accelerated development using the most effective solution. Users can enroll the starter theme in seconds and start to modify code with HMR features.
- Client performance. Virto strives to reach and maintain green metrics provided by Google PageSpeed Insights.
- Decoupled structure. The presentation layer is decoupled from the back end. Shared logic is decoupled from visual components. A developer can concentrate on a single task without the need for massive code manipulations.
- Atomic design pattern. Theme UI is based on atoms, molecules, and organisms, combined within pages and shared components. This provides a high level of code reusability.
- Simple styling and theme customization. We use TailwindCSS to provide the easiest and most convenient way of CSS usage. This allows you to write as little code as possible, and reuse existing highly-customizable framework features.
- Fully aligned with Virto Commerce Storefront. In fact, the theme is just a visual representation — we are fully aligned with the Virto Storefront to provide all common B2B and B2C scenarios processed by the Virto platform.
- Fully responsive. Our theme works on a number of devices, from desktops to mobile phones, with an emphasis on both UI and UX.
In the case of horizontal scaling, the consistency of local caches of different instances is supported by the Redis server, which acts as a (backplane) for broadcasting data about changes.
Virto Commerce is designed as a headless, API-first platform, so all functionality is available through API layers.
- xAPI (GraphQL) is primarily an intermediate layer between clients and enterprise services powered by GraphQL protocol and is tightly coupled to a specific user/touchpoint experience with fast and reliable access. It represents an implementation of backend-for-frontend (BFF) design pattern.
- Platform Rest API (OpenAPI) is used for master data management and back-office operations as well as for integrations.
Extensibility and customization
Unlimited extensibility is an indisputable advantage of Virto Commerce. This means end-user solution developers can adapt or replace Virto Commerce modules with their own functionality. This adaptation can be done in an elegant, simple way without workarounds.
Three types of vendor-made extensions guarantee their seamless delivery to Virto Commerce architecture. Virto Commerce guarantees that these ways of extensibility are sufficient to build an ecommerce solution of any complexity on top of it.
1. No-code extensions mean the ability of declarative extensions through the admin interface and API to extend the data model, UI, and workflow processing.
- Dynamic properties extends entities, like cart, order, organization, etc., with new properties.
- Statuses allow the implementation of any business process.
- Role-based security and permissions means restricted access for a user (API) based on role. For example, if you want the user only allowed to call “search products” API, you can achieve that. Also, for example, you can permit a user to have access to the “orders” API for only a specific store, for example.
2. API-based extensions are extensions based on API calls and events (hooks).
- Web API or GraphQL endpoints
3. Native extensions without source code change. This is an advanced mode of modular extensions. It is called “native” because it refers to the way Virto Commerce is built internally. With a custom module, you can extend every layer:
- Admin UI
- Business Logic and domain model
The HangFire library is widely used for repetitive tasks as well as for background tasks. The HangFire library is an easy way to perform background processing in .NET and .NET Core applications. No Windows Service or separate process is required.
- Backed by persistent storage.
- Open and free for commercial use.
Along with the declared support of working with multiple databases, each for a particular domain, this makes the scalability of the solution quite flexible.
Microsoft's ASP.NET Core framework brings built-in security to an online store using this framework.
- GDPR support – Virto Commerce meets all the requirements of the European Union laws. We track legislative changes and make updates to the platform accordingly.
Other security features include:
- SSL support to provide secure browsing and online store checkout
- Strong, flexible customer password policy
- Protection from the most common web attacks like CSRF or XSS
Virto represented performance test data as follows.
Test machine configuration:
- Intel Core i7-855U CPU @ 1.8 GHz
- 16GB RAMx64
- Windows 10 Enterprise Operation System
- Virto Commerce 3.0.0
- Microsoft SQL Server 2016 Express Edition (64-bit)
- Windows 10 Enterprise
- Products – 10,859
- Variations – 7,854
- Categories – 894
- Product properties – 344,461
- Prices – 37,745
- Pricelists – 20
- Max concurrent requests – 300
- Initial concurrent requests count – 1
Step duration – 10 sec
- Step concurrent requests count – 20
- Load pattern – step
Documentation and support
- Quality and sufficiency of the documentation – sufficient, good structure. There are sections for developers and content-rich blogs for users. Installation scenarios are described in the online help and videos.
- Support channels – free support plus community forum. For customers who want to focus entirely on their business, without getting sidetracked by technical issues, premium support for installation and customization is available from Virto Professional Services.
Virto Commerce summary
Virto Commerce advantages
- Modularity – Features are easily extensible or adjusted simply by installing a set of modules. The partners’ and clients’ development teams benefit from the enhanced productivity associated with the harmonious, logically understandable Virto Atomic Architecture™.
- Headless design – Rich, omnichannel capabilities and integrations abound.
- Extensibility – A plug-in-based extension model and a large number of out-of-the-box extensions and integrations are included.
- Cloud-native – Features rich integration with Azure cloud services and is optimized to run in Azure cloud.
- Upgradability – Developers withstand backward compatibility in new versions. If you follow the rules of extensions, you can easily get updates.
- High scalability – Flexible architecture and support for multiple databases allow the environment to scale effortlessly.
- Modern tech stack – Regularly releases new versions of the software keeping up with the on-edge tech stack, presently .NET 6.0 and Vue 3.0.
- Composable, enterprise feature set for sophisticated use cases – Architectural flexibility and general versatility allow you to implement various scenarios and integrate Virto Commerce into existing solutions and implement a large number of business scenarios.
- Cross platforming – Allows running applications on different Windows/Linux platforms.
- Open source – Enables developers to quickly develop and understand the logic of the platform or make changes to the project without depending on the vendor team.
Virto Commerce disadvantages
- Cost – The platform is free for annual sales below $1M only.
- Limited Web CMS features – Proprietary PageBuilder CMS to manage content from the administrative area, but it’s possible to integrate any third-party CMS and PIM software.
- The documentation updates do not always match the speed of releases and updates. In such cases, the help of the Virto team is required.
- A rather long initial time to learn the software by developers, i.e., a steep learning curve, but its composable extensibility makes up for it.
You want my honest recommendations? For lightweight B2C stores in the SMB sector and a quick startup of online trading projects, nopCommerce looks preferable. This is because nopCommerce features a great variety of design themes and the possibility to use an already pre-installed version in the partner's data center.
Virto Commerce, on the other hand, is an exceptionally suitable platform for B2B applications. The large number of B2B business scenarios and the possibility of integration with any back-office systems allow for a seamless integration of Virto Commerce into the corporate information system of an enterprise level business, such as a manufacturer or a retail chain.
I hope you found a detailed comparison of the platforms useful, so you know all the details of what's under the hood.