Ekom.Core
0.2.125
See the version list below for details.
dotnet add package Ekom.Core --version 0.2.125
NuGet\Install-Package Ekom.Core -Version 0.2.125
<PackageReference Include="Ekom.Core" Version="0.2.125" />
<PackageVersion Include="Ekom.Core" Version="0.2.125" />
<PackageReference Include="Ekom.Core" />
paket add Ekom.Core --version 0.2.125
#r "nuget: Ekom.Core, 0.2.125"
#:package Ekom.Core@0.2.125
#addin nuget:?package=Ekom.Core&version=0.2.125
#tool nuget:?package=Ekom.Core&version=0.2.125
<h1 align="center"> Ekom
</h1>
<h2 align="center"> Open Source Ecommerce package for Umbraco </h2>
Supports Umbraco version 10+
Ekom is a versatile and fully customizable eCommerce solution that is free to use forever. This package has been built with ASP NET Core, focusing on performance and security, and is compatible with Umbraco versions 10 and above.
Installation
Install the appropriate Umbraco versioned package to your solution (f.x. Ekom.U10) Install the Ekom.Web package into your sites main project (contains wwwroot)
NuGet: https://www.nuget.org/packages/Ekom.U10
dotnet add package Ekom.U10
PM> Install-Package Ekom.U10
Ekom.Web
dotnet add package Ekom.Web
PM> Install-Package Ekom.Web
Some of the key featured of Ekom includes:
- 100% free and open source forever.
- Support for both B2B (Business to Business) and B2C (Business to Customer) transactions
- Headless capabilities, allowing for more flexibility in frontend design and development
- Multilingual and multicurrency support, making it suitable for international businesses
- A powerful order management system
- Out-of-the-box support for multiple payment providers, along with the ability to plug in additional providers as needed
- Flexible shipping provider configurations, including the ability to connect with external services
- The capability to set up flexible discounts
- Support for complex variants, a crucial feature for eCommerce platforms
- Integration support with external systems like Microsoft Dynamics Business Central, Dynamics AX, DK, Salesforce, and others
- Advanced inventory management tools
- Built with ASP NET Core with focus on performance and security
- The ability to be extended as per your business requirements
- And many more features....
Appsettings configuration
All Ekom settings live under the Ekom section in appsettings.json.
"Ekom": {
"PerStoreStock": false,
"ExamineSearchIndex": "ExternalIndex",
"ShareBasket": false,
"BasketCookieLifetime": 1,
"CustomImage": "images",
"ReservationTimeout": 30,
"CategoryRootLevel": 3,
"VatCalcRounding": "AwayFromZero",
"VatRoundingScope": "PerUnit",
"VatIncludedPerUnitPolicy": "PreserveStickerGross",
"ApplyVatOnShipping": true,
"UserBasket": false,
"DisableStock": false,
"AbsoluteUrls": true,
"DefaultProductOrderBy": "DateDesc",
"GlobalCatalog": false,
"EmailNotifications": "orders@example.com",
"CustomerData": false,
"Manager": {
"SectionAccessGroup": "ekom,commerce-admins",
"StoreGroupPermissions": {
"store1": [ "group-a", "group-b" ]
}
},
"Headless": {
"ReValidateApis": [
{ "Store": "store1", "Url": "https://example.com/api/revalidate", "Secret": "secret" }
]
},
"Payments": {
"valitor": {
"merchantId": "1",
"verificationCode": "xxxxx",
"merchantName": "",
"paymentPageUrl": "https://paymentweb.uat.valitor.is/"
}
}
}
PerStoreStock(bool, defaultfalse): Use per-store stock cache instead of product/variant stock.ExamineSearchIndex(string, defaultExternalIndex): Examine index name used for search.ShareBasket(bool, defaultfalse): Share baskets between stores; requires same currencies across stores.BasketCookieLifetime(number, days, default1): Order cookie lifespan in days.CustomImage(string, defaultimages): Media folder alias for product images.ReservationTimeout(number, minutes, default30): Checkout reservation timeout in minutes.CategoryRootLevel(int, default3): Minimum Umbraco level for categories.VatCalcRounding(Rounding enum, defaultAwayFromZero):None,RoundDown,RoundUp,RoundToEven,AwayFromZero.VatRoundingScope(VatRoundingScope enum, defaultPerUnit):PerUnit,PerTotal.VatIncludedPerUnitPolicy(VatIncludedPerUnitPolicy enum, defaultPreserveStickerGross):PreserveStickerGross,LineLevelVat.ApplyVatOnShipping(bool, defaultfalse): Apply VAT to shipping costs.UserBasket(bool, defaultfalse): Single basket per member stored on the member "orderId".DisableStock(bool, defaultfalse): Disable stock checks.AbsoluteUrls(bool, defaultfalse): Force backoffice URLs to be absolute for multi-site setups.DefaultProductOrderBy(OrderBy enum, defaultDateDesc): SeeEkom.Utilities.Enums.OrderByvalues for options.GlobalCatalog(bool, defaultfalse): If product not found in current store, search other stores.EmailNotifications(string, optional): Override Umbraco email forMailServicenotifications.CustomerData(bool, defaultfalse): Store checkout customer data inekmCustomerDatatable.Manager:SectionAccessGroup(CSV string): Backoffice groups that can access the manager section.Manager:StoreGroupPermissions(object): Store alias to allowed group list mapping.SectionAccessRules(CSV string, legacy): Backwards-compatible alias forManager:SectionAccessGroup.Headless:ReValidateApis(list): Items withStore,Url,Secretfor headless revalidation.Payments(object): Provider-specific configuration used by payment providers.
Tracking and consent
Ekom tracking supports order-level Consent and Tracking data for automatic GA4 and Meta purchase dispatch.
Ekom:Tracking:Enabledturns tracking features on or off.Ekom:Tracking:CaptureEnabledcontrols whether Ekom captures consent and browser tracking data from incoming requests.Ekom:Tracking:LogPurchaseEventDatacontrols whether outbound GA4 and Meta purchase payloads are logged before dispatch.Ekom:Tracking:CookieNameandEkom:Tracking:CookieLifetimeDayscontrol Ekom's own tracking cookie.Ekom:Tracking:SiteBaseUrlis used as a fallback base URL when no landing URL can be resolved from the request.Ekom:Tracking:Consentdefines the default consent cookie/header names and fallback values.Ekom:Tracking:Consent:Storeslets you override consent handling per store alias.- Consent is resolved through a chain of
ITrackingConsentResolverservices. - The first resolver that returns a value wins; if none resolve, Ekom falls back to the configured fallback values.
- CookieHub consent resolution is built in. Set the relevant consent cookie name(s) to
cookiehubfor any store that uses CookieHub. Ekom:Tracking:Ga4configures GA4 purchase dispatching per store.Ekom:Tracking:Metaconfigures Meta purchase dispatching per store.
Full tracking config example:
"Tracking": {
"Enabled": true,
"CaptureEnabled": true,
"LogPurchaseEventData": false,
"CookieName": "EkomTracking",
"CookieLifetimeDays": 30,
"SiteBaseUrl": "https://www.example.com",
"Consent": {
"FallbackAnalyticsConsent": false,
"FallbackMarketingConsent": false,
"AnalyticsCookieName": "ekom_consent_analytics",
"AnalyticsHeaderName": "X-Ekom-Consent-Analytics",
"MarketingCookieName": "ekom_consent_marketing",
"MarketingHeaderName": "X-Ekom-Consent-Marketing",
"Stores": [
{
"Alias": "Store",
"AnalyticsCookieName": "cookiehub",
"MarketingCookieName": "cookiehub"
}
]
},
"Ga4": {
"Enabled": true,
"Testing": false,
"Dispatching": {
"Capacity": 1000,
"MaxConcurrency": 2
},
"Stores": [
{
"Alias": "Store",
"MeasurementId": "G-XXXXXXXXXX",
"ApiSecret": "your-ga4-api-secret"
}
]
},
"Meta": {
"Enabled": true,
"Testing": false,
"Dispatching": {
"Capacity": 1000,
"MaxConcurrency": 2
},
"Stores": [
{
"Alias": "Store",
"PixelId": "123456789012345",
"AccessToken": "your-meta-access-token",
"TestEventCode": "TEST12345"
}
]
}
}
Notes:
Ga4:Stores[*]usesMeasurementIdandApiSecretfor Measurement Protocol purchase events.Meta:Stores[*]usesPixelIdandAccessTokenfor Conversion API purchase events.Ga4:Testingsends events through the GA4 debug endpoint.Meta:TestingusesTestEventCodewhen configured for the store.Dispatching:CapacityandDispatching:MaxConcurrencycontrol the background queue used for provider dispatching.
Default consent config example:
"Tracking": {
"Consent": {
"FallbackAnalyticsConsent": false,
"FallbackMarketingConsent": false,
"AnalyticsCookieName": "ekom_consent_analytics",
"AnalyticsHeaderName": "X-Ekom-Consent-Analytics",
"MarketingCookieName": "ekom_consent_marketing",
"MarketingHeaderName": "X-Ekom-Consent-Marketing"
}
}
Store-specific override example:
"Tracking": {
"Consent": {
"FallbackAnalyticsConsent": false,
"FallbackMarketingConsent": false,
"Stores": [
{
"Alias": "Store",
"AnalyticsCookieName": "cookiehub",
"MarketingCookieName": "cookiehub"
}
]
}
}
When a store points AnalyticsCookieName and/or MarketingCookieName to cookiehub, Ekom automatically reads the CookieHub cookie, decodes its JSON payload, and maps CookieHub categories to OrderConsent. Additional notes and config examples are available in Samples/U10/Ekom.Site/CookieHubConsentResolver.md.
Manager access rules
- A user can open the Ekom manager when they belong to
Manager:SectionAccessGroupor to any group configured underManager:StoreGroupPermissions. - Store access is still checked per store. A user only sees and can query stores where one of their groups matches that store's configured group list.
- Stores missing from
Manager:StoreGroupPermissionsare denied. - Umbraco administrators bypass these restrictions and can access all stores.
Example:
"Manager": {
"SectionAccessGroup": "ekom",
"StoreGroupPermissions": {
"Store": ["StoreGroup"],
"Store2": ["Store2Group"]
}
}
With this setup:
- members of
ekomcan access the manager section - members of
StoreGroupcan access the manager and work only withStore - members of
Store2Groupcan access the manager and work only withStore2 - users without a matching group cannot access the related store
Plugins
- https://github.com/Vettvangur/Ekom/tree/Ekom/Plugins/Ekom.Klaviyo
- https://github.com/Vettvangur/Ekom/tree/Ekom/Plugins/Ekom.Algolia
Documentation
Contributing
We use squash merges and Conventional Commit style PR titles so release-please can generate release PRs.
If you must use merge commits, every individual commit message still has to be Conventional Commits.
Example PR titles:
feat: add vat rounding settings to docs
fix: handle null payment provider in checkout
chore: update dependencies
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net8.0
- Azure.Identity (>= 1.17.1)
- CommonServiceLocator (>= 2.0.7)
- Ekom.Common (>= 0.2.125)
- Ekom.Payments.Core (>= 0.2.59)
- Hangfire (>= 1.8.18)
- linq2db (>= 5.4.1)
- Microsoft.AspNetCore.Http.Extensions (>= 2.3.0)
- Microsoft.AspNetCore.Mvc.Abstractions (>= 2.3.0)
- Microsoft.AspNetCore.Mvc.Core (>= 2.3.9)
- Microsoft.AspNetCore.Mvc.NewtonsoftJson (>= 8.0.11)
- Microsoft.Data.SqlClient (>= 6.1.2)
- Microsoft.Data.Sqlite (>= 8.0.11)
- Microsoft.Extensions.Caching.Abstractions (>= 8.0.0)
- Microsoft.Extensions.Configuration (>= 8.0.0)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 10.0.2)
- Microsoft.Extensions.Logging.Abstractions (>= 10.0.2)
- murmurhash (>= 1.0.3)
- Newtonsoft.Json (>= 13.0.4)
NuGet packages (2)
Showing the top 2 NuGet packages that depend on Ekom.Core:
| Package | Downloads |
|---|---|
|
Ekom.Web
Ekom Web. This Package has all the web files that Ekom requires. |
|
|
Ekom.AspNetCore
Ekom ASP.NET Core - Vettvangur E-Commerce solution |
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 0.2.134 | 0 | 4/30/2026 |
| 0.2.133 | 0 | 4/30/2026 |
| 0.2.132 | 150 | 4/28/2026 |
| 0.2.131 | 155 | 4/28/2026 |
| 0.2.130 | 178 | 4/27/2026 |
| 0.2.129 | 211 | 4/27/2026 |
| 0.2.128 | 278 | 4/23/2026 |
| 0.2.127 | 287 | 4/23/2026 |
| 0.2.126 | 286 | 4/23/2026 |
| 0.2.125 | 320 | 4/22/2026 |
| 0.2.124 | 299 | 4/22/2026 |
| 0.2.123 | 319 | 4/22/2026 |
| 0.2.122 | 321 | 4/22/2026 |
| 0.2.121 | 345 | 4/21/2026 |
| 0.2.120 | 347 | 4/21/2026 |
| 0.2.119 | 348 | 4/20/2026 |
| 0.2.118 | 372 | 4/20/2026 |
| 0.2.117 | 364 | 4/20/2026 |
| 0.2.116 | 369 | 4/20/2026 |
| 0.2.115 | 367 | 4/20/2026 |