![]() |
VOOZH | about |
dotnet add package Ekom.Core --version 0.2.178
NuGet\Install-Package Ekom.Core -Version 0.2.178
<PackageReference Include="Ekom.Core" Version="0.2.178" />
<PackageVersion Include="Ekom.Core" Version="0.2.178" />Directory.Packages.props
<PackageReference Include="Ekom.Core" />Project file
paket add Ekom.Core --version 0.2.178
#r "nuget: Ekom.Core, 0.2.178"
#:package Ekom.Core@0.2.178
#addin nuget:?package=Ekom.Core&version=0.2.178Install as a Cake Addin
#tool nuget:?package=Ekom.Core&version=0.2.178Install as a Cake Tool
<h1 align="center"> Ekom
👁 Nuget
👁 Nuget
👁 Nuget
👁 Publish Ekom.Klaviyo
👁 Publish Ekom.Algolia
</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.
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
dotnet add package Ekom.Web
PM> Install-Package Ekom.Web
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,
"OrderDiscountCalculation": {
"ApiKey": "integration-secret"
},
"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, default false): Use per-store stock cache instead of product/variant stock.ExamineSearchIndex (string, default ExternalIndex): Examine index name used for search.ExamineSearchNormalizedFields (list, default nodeName, title, pageTitle, sku, searchTags, summary, description): Examine fields duplicated into *_normalized fields so catalog search can match diacritics and symbol-separated terms more reliably.ShareBasket (bool, default false): Share baskets between stores; requires same currencies across stores.BasketCookieLifetime (number, days, default 1): Order cookie lifespan in days.CustomImage (string, default images): Media folder alias for product images.ReservationTimeout (number, minutes, default 30): Checkout reservation timeout in minutes.CategoryRootLevel (int, default 3): Minimum Umbraco level for categories.VatCalcRounding (Rounding enum, default AwayFromZero): None, RoundDown, RoundUp, RoundToEven, AwayFromZero.VatRoundingScope (VatRoundingScope enum, default PerUnit): PerUnit, PerTotal.VatIncludedPerUnitPolicy (VatIncludedPerUnitPolicy enum, default PreserveStickerGross): PreserveStickerGross, LineLevelVat.ApplyVatOnShipping (bool, default false): Apply VAT to shipping costs.UserBasket (bool, default false): Single basket per member stored on the member "orderId".DisableStock (bool, default false): Disable stock checks.AbsoluteUrls (bool, default false): Force backoffice URLs to be absolute for multi-site setups.DefaultProductOrderBy (OrderBy enum, default DateDesc): See Ekom.Utilities.Enums.OrderBy values for options.GlobalCatalog (bool, default false): If product not found in current store, search other stores.EmailNotifications (string, optional): Override Umbraco email for MailService notifications.CustomerData (bool, default false): Store checkout customer data in ekmCustomerData table.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 for Manager:SectionAccessGroup.Headless:ReValidateApis (list): Items with Store, Url, Secret for headless revalidation.OrderDiscountCalculation:ApiKey (string, required to enable): POST /ekom/order-discounts/calculate requires this value in the X-Ekom-Api-Key header. When missing or empty, the endpoint always returns unauthorized.Payments (object): Provider-specific configuration used by payment providers.Ekom resolves catalog search through ICatalogSearchService. The default Umbraco implementation is CatalogSearchService, registered as scoped by AddEkom(...).
ICatalogSearchService is async-only and exposes three override points:
ProductQueryAsync(...): product search used by product listings and Catalog.ProductSearchAsync(...). Override this when an external product search provider should return matching Ekom product IDs.PublicQueryAsync(...): public-facing search returning SearchResultEntity records. Override this for autocomplete, site search, or mixed product/category result cards.InternalQueryAsync(...): backoffice/internal search, including the Umbraco searchable tree. Override this when internal CMS search should use a custom provider/index.To replace search completely, register your implementation after AddEkom(...):
services.AddEkom(configuration);
services.AddScoped<ICatalogSearchService, CustomCatalogSearchService>();
Example implementation:
using Ekom.Models;
using Ekom.Services;
public sealed class CustomCatalogSearchService : ICatalogSearchService
{
public async Task<(IEnumerable<int> Ids, long Total)> ProductQueryAsync(
SearchRequest req,
CancellationToken ct = default)
{
var ids = await SearchProductsInExternalIndexAsync(req, ct);
return (ids, ids.Count());
}
public async Task<(IEnumerable<SearchResultEntity> Results, long Total)> PublicQueryAsync(
SearchRequest req,
CancellationToken ct = default)
{
var results = await SearchPublicContentAsync(req, ct);
return (results, results.Count());
}
public async Task<(IEnumerable<SearchResultEntity> Results, long Total)> InternalQueryAsync(
SearchRequest req,
CancellationToken ct = default)
{
var results = await SearchBackofficeContentAsync(req, ct);
return (results, results.Count());
}
}
If you only need to customize part of the default Examine behavior, inherit from CatalogSearchService and override the relevant async method. Register the derived type for ICatalogSearchService after AddEkom(...).
Use the order discount calculation API to quote an order-level coupon discount without creating or loading an order. The public API accepts a coupon code only; Ekom resolves the linked discount internally.
POST /ekom/order-discounts/calculate
X-Ekom-Api-Key: integration-secret
{
"couponCode": "12345",
"storeAlias": "Store",
"lines": [
{
"sku": "SKU-123",
"variantSku": "VARIANT-SKU-123",
"quantity": 1
}
]
}
variantSku is optional. Configure Ekom:OrderDiscountCalculation:ApiKey to enable the endpoint; callers must send the same value in X-Ekom-Api-Key.
Ekom tracking supports order-level Consent and Tracking data for automatic GA4 and Meta purchase dispatch.
Ekom:Tracking:Enabled turns tracking features on or off.Ekom:Tracking:CaptureEnabled controls whether Ekom captures consent and browser tracking data from incoming requests.Ekom:Tracking:LogPurchaseEventData controls whether outbound GA4 and Meta purchase payloads are logged before dispatch.Ekom:Tracking:CookieName and Ekom:Tracking:CookieLifetimeDays control Ekom's own tracking cookie.Ekom:Tracking:SiteBaseUrl is used as a fallback base URL when no landing URL can be resolved from the request.Ekom:Tracking:Consent defines the default consent cookie/header names and fallback values.Ekom:Tracking:Consent:Stores lets you override consent handling per store alias.ITrackingConsentResolver services.cookiehub for any store that uses CookieHub.Ekom:Tracking:Ga4 configures GA4 purchase dispatching per store.Ekom:Tracking:Meta configures 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[*] uses MeasurementId and ApiSecret for Measurement Protocol purchase events.Meta:Stores[*] uses PixelId and AccessToken for Conversion API purchase events.Ga4:Testing sends events through the GA4 debug endpoint.Meta:Testing uses TestEventCode when configured for the store.Dispatching:Capacity and Dispatching:MaxConcurrency control 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:SectionAccessGroup or to any group configured under Manager:StoreGroupPermissions.Manager:StoreGroupPermissions are denied.Example:
"Manager": {
"SectionAccessGroup": "ekom",
"StoreGroupPermissions": {
"Store": ["StoreGroup"],
"Store2": ["Store2Group"]
}
}
With this setup:
ekom can access the manager sectionStoreGroup can access the manager and work only with StoreStore2Group can access the manager and work only with Store2We 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 net8.0 is compatible. net8.0-android net8.0-android was computed. net8.0-browser net8.0-browser was computed. net8.0-ios net8.0-ios was computed. net8.0-maccatalyst net8.0-maccatalyst was computed. net8.0-macos net8.0-macos was computed. net8.0-tvos net8.0-tvos was computed. net8.0-windows net8.0-windows was computed. net9.0 net9.0 was computed. net9.0-android net9.0-android was computed. net9.0-browser net9.0-browser was computed. net9.0-ios net9.0-ios was computed. net9.0-maccatalyst net9.0-maccatalyst was computed. net9.0-macos net9.0-macos was computed. net9.0-tvos net9.0-tvos was computed. net9.0-windows net9.0-windows was computed. net10.0 net10.0 was computed. net10.0-android net10.0-android was computed. net10.0-browser net10.0-browser was computed. net10.0-ios net10.0-ios was computed. net10.0-maccatalyst net10.0-maccatalyst was computed. net10.0-macos net10.0-macos was computed. net10.0-tvos net10.0-tvos was computed. net10.0-windows net10.0-windows was computed. |
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 |
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 0.2.178 | 2,086 | 6/9/2026 |
| 0.2.177 | 2,071 | 6/9/2026 |
| 0.2.176 | 2,069 | 6/9/2026 |
| 0.2.175 | 2,178 | 6/8/2026 |
| 0.2.174 | 2,243 | 6/8/2026 |
| 0.2.173 | 2,258 | 6/8/2026 |
| 0.2.171 | 2,295 | 6/8/2026 |
| 0.2.170 | 2,365 | 6/7/2026 |
| 0.2.169 | 2,364 | 6/7/2026 |
| 0.2.168 | 2,360 | 6/7/2026 |
| 0.2.167 | 2,730 | 6/5/2026 |
| 0.2.166 | 2,747 | 6/5/2026 |
| 0.2.165 | 2,765 | 6/5/2026 |
| 0.2.164 | 2,756 | 6/5/2026 |
| 0.2.163 | 2,762 | 6/5/2026 |
| 0.2.162 | 2,788 | 6/5/2026 |
| 0.2.161 | 2,850 | 6/4/2026 |
| 0.2.160 | 2,856 | 6/4/2026 |
| 0.2.159 | 2,853 | 6/4/2026 |
| 0.2.158 | 2,853 | 6/4/2026 |