Cannot start analytics Tracker Exception – The Certificate was not found – Sitecore Azure Webapps

ERROR Cannot start analytics Tracker Exception: System.InvalidOperationException Message: The certificate was not found. Store: My, Location: CurrentUser, FindType: FindByThumbprint, FindValue: 23ACB78F3CDA99BA00646EA867C77466EBE8C718, InvalidAllowed: False. Source: Sitecore.Xdb.Common.Web at Sitecore.Xdb.Common.Web.Synchronous.SynchronousExtensions.SuspendContextLock[TResult](Func`1 taskFactory) at Sitecore.Analytics.DataAccess.Dictionaries.DataStorage.ReferenceDataClientDictionary.EnsureDefinitionType(String definitionTypeName) at Sitecore.Analytics.DataAccess.Dictionaries.DataStorage.ReferenceDataClientDictionary.LoadAs[T](Object key) at Sitecore.Analytics.DataAccess.Dictionaries.AverageCounterExtensions.MeasureMilliseconds[T](AverageCounter counter, Func`1 func) at Sitecore.Analytics.DataAccess.Dictionaries.ReferenceDataDictionary`2.Get(TKey key, LookupStrategy strategy) at Sitecore.Analytics.DataAccess.Dictionaries.UserAgentsDictionary.Register(String userAgentName) at Sitecore.Analytics.Tracking.CurrentVisitContext.set_UserAgent(String value) at Sitecore.Analytics.Pipelines.CreateVisits.InitializeWithRequestData.Process(CreateVisitArgs args) at (Object , Object ) at Sitecore.Pipelines.CorePipeline.Run(PipelineArgs args) at Sitecore.Pipelines.DefaultCorePipelineManager.Run(String pipelineName, PipelineArgs args, String pipelineDomain, Boolean failIfNotExists) at Sitecore.Pipelines.DefaultCorePipelineManager.Run(String pipelineName, PipelineArgs args, String pipelineDomain) at Sitecore.Analytics.Pipelines.CreateVisits.CreateVisitPipeline.Run(CreateVisitArgs args) at Sitecore.Analytics.Tracking.StandardSession.CreateInteraction(HttpContextBase httpContext) at Sitecore.Analytics.Pipelines.InitializeTracker.CreateVisit.Process(InitializeTrackerArgs args) at (Object , Object ) at Sitecore.Pipelines.CorePipeline.Run(PipelineArgs args) at Sitecore.Pipelines.DefaultCorePipelineManager.Run(String pipelineName, PipelineArgs args, String pipelineDomain, Boolean failIfNotExists) at Sitecore.Pipelines.DefaultCorePipelineManager.Run(String pipelineName, PipelineArgs args, String pipelineDomain) at Sitecore.Analytics.Pipelines.InitializeTracker.InitializeTrackerPipeline.Run(InitializeTrackerArgs args) at (Object , Object ) at Sitecore.Pipelines.CorePipeline.Run(PipelineArgs args) at Sitecore.Pipelines.DefaultCorePipelineManager.Run(String pipelineName, PipelineArgs args, String pipelineDomain, Boolean failIfNotExists) at Sitecore.Pipelines.DefaultCorePipelineManager.Run(String pipelineName, PipelineArgs args, String pipelineDomain) at Sitecore.Analytics.Pipelines.StartTracking.StartTrackingPipeline.Run(StartTrackingArgs args) at Sitecore.Analytics.DefaultTracker.StartTracking()

 

This error came up after we upgrade the certificate or I would say after we removed the Expired Certificate and add the new valid Certificate on Webapp (Sitecore on Azure).

This causes analytics to stop working.

To solve this error, Certificate Thumbprint has to be updated at various locations:

  1. Configuration files:
    On different web-apps of scaled environments, this Thumbprint needs to be updated.1.1 In App_Config/ConnectionStrings.config file of the following web-apps one might need to update any/all of xconnect.collection.certificate, xdb.marketingautomation.operations.client.certificate, xdb.referencedata.client.certificate (if exist):
    – CM
    – CD (all CD web-apps)
    – MA-Ops
    – PRC (processing)

    1.2 One needs to update the value of key validateCertificateThumbprint in App_Config/AppSettings.config file in following WebApps.
    – XC-Collect
    – XC-RefData
    – XC- Search
    – MA-Rep
    – MA-Ops

    1.3 <CertificateThumbprint> Tag’s value of Config/production/Sitecore.IdentityServer.Host.xml in following WebApp:
    – Si (Sitecore Identity)Once these configuration files of various Web-Apps has been updated, restart these Web-Apps.

  2.  If the above doesn’t solve the issue, following Web-App configurations also needs to be changed like below. Open the Configuration tab, and check for “Certificate” – all the Thumbprint needs to be updated where it is referring to old/incorrect Thumbprint:2.1 CM:
    Open the CM web-app in Azure –>Go to Configuration Tab –> And edit the certificates’ configuration.
    Make sure you update the Thumbprint value to valid/correct Thumbprint.
    – Cortex Reporting Client Certificate
    – WEBSITE_LOAD_CERTIFICATES
    – XConnect Collection Certificate
    – XDB MA Ops Client Certificate
    – XDB MA Reporting Client Certificate
    – XDB Reference Data Client Certificate
    2.2 SI:
    Update the valid/correct Thumbprint for Certificate Configuration in Sitecore-Identity WebApp as well.
    Replace the expired/incorrect thumbprint for “Certificate Thumbprint” & “WEBSITE_LOAD_CERTIFCATES”

    2.3 CDs:
    Go to the configuration tab for each CD server and update the thumbprint value for the following configuration:
    – WEBSITE_LOAD_CERTIFICATES
    – XConnect Collection Certificate
    – XDB MA Ops Client Certificate
    – XDB Reference Data Client Certificate

    2.4 Cortex Processing:
    From the configuration node, update the following Certificate configuration with valid/correct Thumbprint for Cortex Processing Web-App:
    – Processing Engine Xconnect Collection Client Certificate Thumbprint
    – Processing Engine Xconnect Search Client Certificate Thumbprint
    – WEBSITE_LOAD_CERTIFICATES
    – XConnect Server Certificate Validation Thumbprint

    2.5 Cortext Reporting:
    Update the below two certificate configuration for Cortext Reporting:
    – WEBSITE_LOAD_CERTIFICATES
    – XConnect Server Certificate Validation Thumbprint

    2.6 Ma-Ops
    Update the WEBSITE_LOAD_CERTIFICATES thumbprint for Ma-ops

    2.7 Ma-Rep
    Update below two configurations with the correct/valid thumbprint value:
    – WEBSITE_LOAD_CERTIFICATES
    – XConnect Server Certificate Validation Thumbprint

    2.8 Prc (Processing)

    Update the below two Certificate configuration with appropriate certificate thumbprint value:
    – WEBSITE_LOAD_CERTIFICATES
    – XConnect Collection Certificate

    2.9 XC-Collect
    Update the configuration for XC-Collect as well:
    – XConnect Server Certificate Validation Thumbprint

    2.10 XC-RefData
    Update the “XConnect Server Certificate Validation Thumbprint” configuration for XC-RefData Web-App as well.

 

Once you update these configurations, restart these Web-Apps and then try again. The analytics tracker error due to the Certificate was no longer in your log files.

 

Happy Sitecoring…

How to Change Coveo Organization for Sitecore

We had set up Coveo with Trial period license and then we need to update it and change the organization for already running instance of Sitecore.

Below are the steps we performed:

  1. Log in to https://platform.cloud.coveo.com/
  2. Make sure you can see the target organization in the dropdown.
  3. Log into Sitecore CMS and open Control Panel.
  4. From COVEO SEARCH section, select “Coveo Cloud Manager”.
  5. In the COVEO CLOUD MANAGER section, select Configuration.
  6. Click on Login button to change the organization.
  7. Once you Login, You will have options to select from existing Organizations or Create New organization.
  8. Once selected, Click on APPLY AND RESTART
  9. Rebuild the indexes.
  10. This changes will be reflected in file: /App_Config/Include/Coveo/Coveo.CloudPlatformClient.Custom.config on CM server. Open this file and you can see the updated organization id.Make sure this file is pushed/changed on all CD servers.

 

Happy Sitecoring & Coveoing….

Hhogdev.SitecorePackageDeployer – stop auto update package installation on webapp/server restarts

Background:

As a part of Octopus deployment process, we are installing update package to deploy newly created /changed sitecore items on upper environments. These packages are installed using HedgehogDevelopment.TDS.SitecorePackageDeployer.Azure nuget package.

Just before this step, there are two steps: one of the step is to upload the update packages at App_Data/Pacakges folder and after then a step which restarts the CM server.

 

Issue: As soon as CM gets restarts, it started installing the packages which are there under App_Data/Packages folder. and also, the other step will also start the package installation and at the end that steps fail.

 

Debugging Root Cause & Solution:

    • We have explored the TDS Sitecore Package Deployer nuget package and found one configuration file: App_Config\Include\Hhogdev.SitecorePackageDeployer.config
    • In this file, we have checked the agent Tasks.InstallPackage and found its Interval is set to 00:00:00
       &amp;amp;lt;agent type="Hhogdev.SitecorePackageDeployer.Tasks.InstallPackage, Hhogdev.SitecorePackageDeployer" method="Run" interval="00:00:00"/&amp;amp;gt;
      
  • Everything seems good with this file but still packages gets installed on the restart of the webapp which we need to stop.
  • Then we found a comment above this agent.
    </pre>
    <scheduling>
    <!-- Agent to install update packages -->
    <!-- Comment this out if using the OnDemand url to install a package -->
    <agent type="Hhogdev.SitecorePackageDeployer.Tasks.InstallPackage, Hhogdev.SitecorePackageDeployer" method="Run" interval="00:00:00"/>
    
    </scheduling>
    <pre></pre>
    <pre>
  • We then comment out this agent.
  • But still, the packages installation gets started on restart. so the issue was still there.
  • Then, we came across the processor of initialize pipeline mentioned in the same configuration.
     
    &nbsp;&lt;initialize&gt;
            &lt;!-- Processor to execute post steps--&gt;
            &lt;processor type="Hhogdev.SitecorePackageDeployer.Pipelines.Initialize.RunPostInstallSteps, Hhogdev.SitecorePackageDeployer"/&gt;
            
          &lt;/initialize&gt;
    

    We commented out this processor as well.

    And then tried to do a deployment, this time, the package didn’t installed after Webapp restarts. And it gets installed only when – when actual installation steps started in the deployment process.

 

Other information:
Sitecore version: 9.1 update-1
Hhogdev Sitecore Package Deployer Version: 1.10.0.0

 

Get rid of empty html tags in Sitecore SXA

This blog is about how can we stop rendering of empty html tags in Sitecore SXA. Thank you Nathan Hase for your suggestion to use Rule Engine.

Issue:

We have hero component which has following rendering/html structure.

Now if you notice the Hero Headline, it has a wrapper div. So, the title will be rendered in following html structure.

Now what if there is no content in Headline field. The same structure will be rendered without Headline value.

You can see, empty h1 tag and its parent div tag. And we don’t want that.

 

Solution:
Sitecore SXA provides OOTB solution for this.

We need to update two things:

  1. The field itself i.e. Variant field.
  2. Its parent div which is wrapper/Variant Section

If you select Variant field, you can see checkbox Render if empty in Variant Details Section.

Make sure it is not checked/ticked. This means, it will not render – if it is empty (means field-name mentioned in this Variant Field is not having any value).

 

Now let’s update wrapper/variant section i.e. HeaderWrapper:

  1. Select the Variant Section item.
  2. You can see Rules section. It means that this Variant Section will be enabled only if the mentioned rule is true. Click on Edit rule.
  3. Search for field and under Fields related rule, click on “where the specific field is empty” rule.
  4. In the selected rule, click on “specific” text and enter the field name (in this context it is HeroHeadline).
  5. Now this means, if HeroHeadline field is empty, section will be enabled. But we want a rule which is completely opposite. Click on “where” and it will get converted into “except where”.

    So now, our rule is correct i.e. Enable the section except where the “HeroHeadline” field is empty.You can add multiple rules.
  6. Publish the Variant.

Now, empty h1 tag and its parent div tag will not get rendered.

That’s it.

Happy Coding 🙂

Things to consider while integrating Sitecore and Salesforce

This year at SUGCON India, me and my colleague Varun Shringarpure presented a session on how to connect Sitecore with Salesforce using Sitecore-Salesforce Connector.

sitecore connect

Here are some points which you need to consider before working/finalizing the integration:

Available Connectors:

  • You need to understand that Salesforce is not one system. It has four parts:
    • Sales Cloud
    • Marketing Cloud
    • Service Cloud
    • Community Cloud

First find out which system you are connecting Sitecore to? There are only two connectors are available from Sitecore:

  1. for Sales-cloud : Sitecore Connect for Salesforce CRM
  2. for Marketing-cloud : Sitecore Connect for Salesforce Marketing Cloud

As of now, no connector is available for Service and Community Cloud from Sitecore. We will here more on Service and Community Cloud in future from Sitecore.

Well, Sitecore Connector is not only connector available in market. Many third party connectors available in Market. FuseIT is one of them. During Sugcon India 2019, I got a chance to talk with Mr. Duane Franklet – Director of Operations at FuseIT and we have discussed various functionality FuseIT connector offers. It is very user-friendly tool available in the market.

The main advantage of using Sitecore Connector is Support, Strong road map and Strong partnership ahead.

 

License:

  • Sitecore Salesforce Connector needs a separate license from Sitecore. If you need more details, you need to talk with your Sitecore representative.
  • Also, the other available Connectors in the Market Place are not free.
  • So before recommending any of the connector or trying to plan for it, you should consider licensing.

Versions:

  • Different versions of Sitecore Salesforce Connector are available to support the respective sitecore instance. But to use latest features, it is recommended that you use latest Sitecore version and its compatible latest connector version.

Pre requisites:

  • You need to read all the pre-requisites instruction available installation guide of the Salesforce connector carefully. If you miss any of those, it will cause issue for sure.

Customization:

  • In terms of sitecore, xConnect platform is the area where customization is mostly possible using custom facets. Custom facet might contain additional attributes which one can customize.
  • In terms of salesforce, you can easily create some custom fields.
  • You need to take care of the mappings b/w sitecore and salesforce and make sure to define unique identifier between these two systems for example sitecore id.

 

That’s it. Best of luck for Integration.

Happy Coding 🙂

Install-SitecoreConfiguration : The certificate does not have a property that references a private key

I was trying to install Sitecore 9.0 update 1 instance on a local machine where I am already having couple of 9.0 instances. While installation, I was facing Certificate error, specifically at the time of Creating certificate of xConnect site: Install-SitecoreConfiguration : The certificate does not have a property that references a private key

image

I have checked Log file, in my case it is xconnect-createcert log file. I found following error.

[----------------------------------------------------- CreateSignedCert : NewSignedCertificate -------------------------------------------------]
VERBOSE: Resolving ConfigFunction extension 'GetCertificate'
VERBOSE: Resolved 'Invoke-GetCertificateConfigFunction'
VERBOSE: Invoke-GetCertificateConfigFunction
VERBOSE: Id: DO_NOT_TRUST_SitecoreRootCert
VERBOSE: CertStorePath: cert:\LocalMachine\Root
VERBOSE: Found Cert with thumbprint: 01C12329C899F2B535258E3C15BBC3D56B20D7D4
VERBOSE: Performing the operation "New-SignedCertificate: New signed certificate for sc901.local.xconnect_client" on target "c:\certificates".
VERBOSE: Searching certificates in cert:\LocalMachine\My for Name sc901.local.xconnect_client
VERBOSE: Failed to find certificate with Name sc901.local.xconnect_client
VERBOSE: New-SignedCertificate: Create a signed certificate for 'sc901.local.xconnect_client'
VERBOSE: New-SignedCertificate: Using PKI parameters for Windows Server 2016 and Windows 10
**********************
Command start time: 20180619121947
**********************
PS>TerminatingError(New-SelfSignedCertificate): "The certificate does not have a property that references a private key. 0x8009200a (-2146885622 CRYPT_E_UNEXPECTED_MSG_TYPE) CertEnroll::CSignerCertificate::Initialize: Cannot find object or property. 0x80092004 (-2146885628 CRYPT_E_NOT_FOUND)"
>> TerminatingError(New-SelfSignedCertificate): "The certificate does not have a property that references a private key. 0x8009200a (-2146885622 CRYPT_E_UNEXPECTED_MSG_TYPE) CertEnroll::CSignerCertificate::Initialize: Cannot find object or property. 0x80092004 (-2146885628 CRYPT_E_NOT_FOUND)"
Install-SitecoreConfiguration : The certificate does not have a property that references a private key. 0x8009200a 
(-2146885622 CRYPT_E_UNEXPECTED_MSG_TYPE) CertEnroll::CSignerCertificate::Initialize: Cannot find object or property. 
0x80092004 (-2146885628 CRYPT_E_NOT_FOUND)
At C:\SCResources\SCReources9_1_171219\InstallSitecore.ps1:40 char:1
+ Install-SitecoreConfiguration @certParams -Verbose
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 + CategoryInfo : NotSpecified: (:) [Write-Error], WriteErrorException
 + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException,Install-SitecoreConfiguration
Install-SitecoreConfiguration : The certificate does not have a property that references a private key. 0x8009200a (-2146885622
CRYPT_E_UNEXPECTED_MSG_TYPE) CertEnroll::CSignerCertificate::Initialize: Cannot find object or property. 0x80092004 (-2146885628
CRYPT_E_NOT_FOUND)
At C:\SCResources\SCReources9_1_171219\InstallSitecore.ps1:40 char:1
+ Install-SitecoreConfiguration @certParams -Verbose
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 + CategoryInfo : NotSpecified: (:) [Write-Error], WriteErrorException
 + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException,Install-SitecoreConfiguration

[TIME] 00:00:03
**********************
Windows PowerShell transcript end
End time: 20180619121948
**********************

 

I have googled this issue but unfortunately, not able to find any specific solution which solves this issue. Then I raised Sitecore Support ticket, and our great Sitecore Support Team (Mr. Michael Toh) came for rescue and has provided the solution:

Solution:

  1. Go to mmc > Add/Remove Snap in > Certificates > Computer Account > Local Computer;
  2. Delete following certificate (if exist) under “Personal/Certificates” and “Trusted Root Certification Authorities/Certificates”;
    • *.xconnect
    • *.xconnect_client
    • <Sitecore9 site name>
    • DO_NOT_TRUST_SitecoreFundamentalsRoot
    • DO_NOT_TRUST_SitecoreRootCert
  3. Go to mmc > Add/Remove Snap in > Certificates > Computer Account > My user account;
  4. Repeat step (2);
  5. Go to C:\certificates, delete all *.crt files;

This is basically clean up all Sitecore Certificates. Make sure,you should not delete the certificate specific to your existing sites.

Thank you Sitecore Support team for solving this weird issue. Hope, this will helpful to others to save their day.

Happy Sitecoring… version 9.0 🙂

Basics of xConnect – Step 6 – Create Interaction

An interaction is the point where contact interacts with the application/organization like Login, Adding item to the Cart or placing order via phone, Payment or just simply browsing the site.

Sitecore.XConnect.Interaction is the class using which, Interaction can be created.

To create interaction, following are the mandatory proeprties you need to pass:

  • Initiator
  • ChannelId
  • UserAgent

Initiator: who initiates the interaction. Either the user/contact or the application

ChannelId: Through which channel contact interact with the application/organization. Channels are represented as items under Sitecore CMS content tree /sitecore/system/Marketing Control Panel/Taxonomies/Channel.

UserAgent: User Agent which every device used to connnect the xConnect web service

For more information on Interaction, have a look at https://doc.sitecore.net/developers/xp/xconnect/xconnect-model/interactions.html

Lets initiate the Interaction now,….

I have already created one goal and channel in the Sitecore Marketing Control Panel.  The variable offlineGoal and channelId in following code are refering to those items.

                //Interaction
                var offlineGoal = Guid.Parse("A9948719-E6E4-46D2-909B-3680E724ECE9");//offline goal - KioskSubmission goal
                var channelId = Guid.Parse("3FC61BB8-0D9F-48C7-9BBD-D739DCBBE032"); // /sitecore/system/Marketing Control Panel/Taxonomies/Channel/Offline/Store/Enter store - offline enter storl channel
                //Create a new interaction for that contact
                Interaction interaction = new Interaction(knownContact, InteractionInitiator.Contact, channelId, "");
                // Add events - all interactions must have at least one event
                var xConnectEvent = new Goal(offlineGoal, DateTime.UtcNow);
                interaction.Events.Add(xConnectEvent);
                //Add interaction to client
                client.AddInteraction(interaction);

After adding this final segment, the method createUpdateContact() would finally look like following:

        public void createUpdateContact()
        {
            //Certificate
            CertificateWebRequestHandlerModifierOptions options =
            CertificateWebRequestHandlerModifierOptions.Parse("StoreName=My;StoreLocation=LocalMachine;FindType=FindByThumbprint;FindValue=587d948806e57cf511b37a447a2453a02dfd3686");
            var certificateModifier = new CertificateWebRequestHandlerModifier(options);

            //Model - xConnect Client Configuration
            List clientModifiers = new List();
            var timeoutClientModifier = new TimeoutHttpClientModifier(new TimeSpan(0, 0, 20));
            clientModifiers.Add(timeoutClientModifier);

            // This overload takes three client end points - collection, search, and configuration
            var collectionClient = new CollectionWebApiClient(new Uri("https://sc9.xconnect/odata"), clientModifiers, new[] { certificateModifier });
            var searchClient = new SearchWebApiClient(new Uri("https://sc9.xconnect/odata"), clientModifiers, new[] { certificateModifier });
            var configurationClient = new ConfigurationWebApiClient(new Uri("https://sc9.xconnect/configuration"), clientModifiers, new[] { certificateModifier });

            var config = new XConnectClientConfiguration(
                new XdbRuntimeModel(CollectionModel.Model), collectionClient, searchClient, configurationClient);
            //initialize the configuration
            config.Initialize();

            //create the xConnect Client
            using (Sitecore.XConnect.Client.XConnectClient client = new XConnectClient(config))
            {
                // Identifier
                var identifier = new ContactIdentifier[]
                {
                    new ContactIdentifier("HIxConnect", "contact.name@demo.com", ContactIdentifierType.Known)
                };

                //Contact & Facets
                // Create a new contact with the identifier
                Contact knownContact = new Contact(identifier);
                client.AddContact(knownContact);

                //Facets
                #region Personal Information Facet
                //Persona information facet
                PersonalInformation personalInfoFacet = new PersonalInformation();
                personalInfoFacet.Title = ddTitle.SelectedValue;
                personalInfoFacet.FirstName = "Alok";
                personalInfoFacet.MiddleName = "S";
                personalInfoFacet.LastName = "KaduDeshmukh";
                personalInfoFacet.PreferredLanguage = "en";
                personalInfoFacet.Gender = "Male";
                personalInfoFacet.JobTitle = "Sitecore Web Developer";
                client.SetFacet(knownContact, PersonalInformation.DefaultFacetKey, personalInfoFacet);
                #endregion
                #region EmailAddress Facet
                EmailAddressList emails = new EmailAddressList(new EmailAddress("alok.kadudeshmukh@gmail.com", true), EmailAddressList.DefaultFacetKey);
                //OR the following code
                //var emails = existingContact.GetFacet(EmailAddressList.DefaultFacetKey);
                //emails.PreferredEmail = new EmailAddress("alok.kadudeshmukh@gmail.com", true);
                client.SetFacet(knownContact, EmailAddressList.DefaultFacetKey, emails);
                #endregion

                //Interaction
                var offlineGoal = Guid.Parse("A9948719-E6E4-46D2-909B-3680E724ECE9");//offline goal - KioskSubmission goal
                var channelId = Guid.Parse("3FC61BB8-0D9F-48C7-9BBD-D739DCBBE032"); // /sitecore/system/Marketing Control Panel/Taxonomies/Channel/Offline/Store/Enter store - offline enter storl channel
                //Create a new interaction for that contact
                Interaction interaction = new Interaction(knownContact, InteractionInitiator.Contact, channelId, "");
                // Add events - all interactions must have at least one event
                var xConnectEvent = new Goal(offlineGoal, DateTime.UtcNow);
                interaction.Events.Add(xConnectEvent);
                //Add interaction to client
                client.AddInteraction(interaction);

                client.Submit();
            }
        }

That’s it. Run the method and you can find the Contact added in the Expereince Profile.

Happy Coding 🙂

 

You can go back to previous step Step 5 – Facets or jump to the Main Page