Skip to content
July 9, 2020 / kiranpatils

Sending an email using SendGrid with Sitecore


We’ve been using SendGrid for sending emails for most of our Azure PaaS clients. In case you are not aware of SendGrid. The following information will help you understand more. Source:

SendGrid is a cloud-based SMTP provider that allows you to send email without having to maintain email servers. SendGrid manages all of the technical details, from scaling the infrastructure to ISP outreach and reputation monitoring to whitelist services and real-time analytics.

Recently we migrated one client from IaaS to PaaS and faced an interesting challenge where Sitecore’s OOTB Workflow was trying to send an email and it was failing due to SMTP configurations.

We wanted to get this fixed without overriding Sitecore code and have minimal impact on this change. You are also looking forward to doing the same? Then this post might help you!


As you do, We also did a quick google search and came across this blog:

We tried those configurations. But no luck 😦

As per this document: there are a couple of options to use SendGrid:

  1. Using SendGrid’s C# Library
  2. Using .NET’s Built-in SMTP Library

We wanted to avoid the options #1 route as it would cause overriding a few Sitecore’s OOTB methods.

We also created a Sitecore patch file that overrides default MailServer configuration and uses SendGrid specific details. (You need to provide exact values for following variables)

<?xml version="1.0"?>
<configuration xmlns:role="" xmlns:set="">
			<setting name="MailServer" set:value="#{SendGrid.SMTP.server}" />
			<setting name="MailServerUserName" set:value="#{SendGrid.SMTP.username}" />
			<setting name="MailServerPassword" set:value="#{SendGrid.SMTP.password}"/>
			<setting name="MailServerPort" set:value="#{SendGrid.SMTP.port}" />

Just a note: If you would like to enable SSL. Then you can configure that using following setting. <setting name=”MailServerUseSsl” value=”true”/> Which I believe is new in Sitecore 9.3 (Default value is false)

But that didn’t fix our issue. After digging more we figured out that the above configurations are only applied when an email is being sent using Sitecore.MainUtil.SendMail() method.

Post refactor we figured out that method which was causing issue has been using System.Net.Mail.SmtpClient.Send(); method. Which doesn’t respect the above changes and relies mainly on the Web. Config configuration values. Based on the above learning, we made the following changes and that fixed our issue (You need to provide exact values for following variables):

< xdt:Transform="InsertIfMissing">
    <mailSettings xdt:Transform="InsertIfMissing">
      <smtp xdt:Transform="InsertIfMissing">
        <network host="__SendGrid.SMTP.server__" password="__SendGrid.SMTP.password__" userName="__SendGrid.SMTP.username__" port="__SendGrid.SMTP.port__" />

Long story short, If you want to use SendGrid then you have to make changes at couple of places:

  1. Patch MailServer setting values
  2. Update Web.Config for System.Net Node

I’ve also created gist for your ease :

<?xml version="1.0"?>
<configuration xmlns:role="" xmlns:set="">
<setting name="MailServer" set:value="#{SendGrid.SMTP.server}" />
<setting name="MailServerUserName" set:value="#{SendGrid.SMTP.username}" />
<setting name="MailServerPassword" set:value="#{SendGrid.SMTP.password}"/>
<setting name="MailServerPort" set:value="#{SendGrid.SMTP.port}" />
< xdt:Transform="InsertIfMissing">
<mailSettings xdt:Transform="InsertIfMissing">
<smtp xdt:Transform="InsertIfMissing">
<network host="__SendGrid.SMTP.server__" password="__SendGrid.SMTP.password__" userName="__SendGrid.SMTP.username__" port="__SendGrid.SMTP.port__" />

Let me know if this helped you or you learned something new while implementing this which others should be aware of.

July 9, 2020 / kiranpatils

7 learnings from Sitecore 9.3 upgrade


Recently we have done a couple of Sitecore 9.3 upgrades and while doing that learned a few things which would like to share with you with a goal that it might make your upgrade journey smoother!

For both projects, we installed and configured Plain Sitecore 9.3 and ported over code/configurations and Sitecore items from old instance to newly setup 9.3 instance.


#1 : Core DB error while accessing /sitecore/login on CD Server

As per Security best practice, /sitecore/login should not be accessible on CD Server. We got following error when we tried the same:

We reached out to Sitecore support and they gave us a link to KB article: as you might have noticed from KB article that this issue applies to 9.1+ version.

We tried KB article steps. But with no luck 😦

We had some back and forth with Sitecore and finally following steps worked for us, Which was approved by Sitecore support as well:

  1. Deployed modified patch file under App_Config\Include\z.Hotfix folder. (We had to keep shell site, which is required for EXM, as per error message)
<?xml version="1.0" encoding="utf-8"?>
<configuration xmlns:patch=""
  <sitecore role:require="ContentDelivery">
      <site name="login">
        <patch:delete />
      <site name="modules_shell">
        <patch:delete />

2. Added following node in CD’s Web.Config. (You can also add web.config transform for automatic deployment)

<location path="sitecore">
      <deny users="*"/>

#2 : Identified Content delivery users as editors

We’ve been using Federated Authentication (Azure AD B2C) for Content delivery users/visitors. As soon as 5+ users/visitors login from CD Server they were getting redirected to Users are getting redirected to : /sitecore/client/Applications/LicenseOptions/StartPage – Usually you hit this page on CM server. When the number of logged-in content author’s count has exceeded your allowed license limit

From log file, We came across following log entry

“7692 17:25:11 WARN The maximum number of simultaneously active (logged-in) editors exceeded. The User extranet\x9lg8FkakV cannot be logged in to the system. The maximum of editors allowed by license is 5.”

Came across this As per this post – “Sitecore support has registered this a bug with reference number 366550, and there is (on request) a hotfix available for 9.3.”

We reached out to Sitecore support and they shared SC Hotfix 402431-1.update package with us. Deploying this patch fixed our issue!

#3 : Final step Workflow will not be listed in Workbox

This will be a super rare issue. But this was due to the client’s earlier setup and internal process, Where If an item reaches the final state. Someone will go to Workbox and manually publish. We were having parallel discussions and suggested a better approach. The client team wanted to have this functionality as-is. which works in Sitecore 8.2.

We reached out to Sitecore support and they were not able to find out when and why this got changed. But Sitecore support was able to help us with CustomWorkboxForm.cs file. Let me know if you also have a similar issue and I’ll share the file with you. I still believe this should be handled using Auto publish configuration.

#4 : Redis driver timeout issues

This KB Article: indicates that the issue is fixed in CMS 9.2 Initial Release. Which is true from the code point of view. But you still need to tweak your REDIS configurations. I’ve already penned down my thoughts on this earlier :

#5 : CTRL + S shortcut does not work in Experience editor

We noticed that CTRL + S operation was not working in the experience editor. Sitecore support was able to reproduce this issue and registered it as Bug: 359703. There is a change in PageEditor.JS. If you don’t have any customization in your PageEditor.JS then you can follow the steps given below:

To resolve this issue, please uncomment the following from your “Website/sitecore/shell/Applications/Page Modes/PageEditor.js“: = function(postaction) {
  var command = "webedit:save";
  if (postaction) {
    command += "(postaction=" + postaction + ")";

  this.postRequest(command, null, false);


if (e.keyCode == 83 && e.ctrlKey) {

#6 : SQL Exception when login to Sitecore

During login we faced following SQL Exception :

Nested Exception

    Exception: System.Data.DataException
    Message: Error executing SQL command:  
		INSERT INTO [Properties] (   [Key], [Value] ) VALUES (   @name, @value )

    Nested Exception

    Exception: System.Data.SqlClient.SqlException
    Message: String or binary data would be truncated.
    The statement has been terminated.
    Source: .Net SqlClient Data Provider

We were able to fix this issue by following steps given in this post :

But as per this KB Article: This issue is fixed when we asked more about this to Sitecore support. Here’s what they shared

I checked deeper and found out that it was because the texts: “SC_TICKET_” and “CORE_SC_TICKET”.
The KB mentions about “SC_TICKET” which is actually fixed (you could clarify that there is only CORE_SC_TICKET now but not SC_TICKET).Internally, Product team targets to fix this bug 223702 in the version 9.4. I have already informed Product team about this.

It looks like this issue is still open and If you come across this error then you can follow steps given in earlier post by Thom Sip.

#7 : Indexing error : sitecore- prefix is used for two Solr indexes

Core name for sitecore_testing_index and sitecore_suggested_test_index have “sitecore-” prefix. But other cores are using sitecore_ prefix.

To keep it consistent. We’ve created the following patch file to update Core names for those two indexes.

<?xml version="1.0"?>
<configuration xmlns:patch="" xmlns:role="" xmlns:search="">
<sitecore role:require="Standalone or ContentManagement" search:require="Solr">
<!–Somehow following two indexes has prefix "sitecore-" in their name and our Solr cores are not made that way.
For naming consistency updating core names–>
<configuration type="Sitecore.ContentSearch.ContentSearchConfiguration, Sitecore.ContentSearch">
<indexes hint="list:AddIndex">
<index id="sitecore_testing_index" type="Sitecore.ContentSearch.SolrProvider.SolrSearchIndex, Sitecore.ContentSearch.SolrProvider">
<param desc="core" patch:instead="param[@desc='core']">$(id)</param>
<index id="sitecore_suggested_test_index" type="Sitecore.ContentSearch.SolrProvider.SolrSearchIndex, Sitecore.ContentSearch.SolrProvider">
<param desc="core" patch:instead="param[@desc='core']">$(id)</param>

That’s it for now. As you can see we had a lot of learnings and it wasn’t done by me alone. Thanks to everyone who has been involved in these efforts!

If you have new learnings, It will be good to share it with the community. I’m looking forward to your learnings!

June 7, 2020 / kiranpatils

TDS update package errors with Sitecore 9.3


Recently worked on couple of Sitecore upgrade projects, where we used TDS’s update package feature in release mode. So, we can automate package installation process using CI/CD tools.

This feature, Just works! But recently we faced two challenges which I would like to share with you. In case, you are also facing the same.


Some Basics:

Before we talk about specific errors and solutions. Would like to share with you about how Package generation works? [If you already know about this, feel free to skip this section and move to next section]

  1. I strongly recommend you to read this :
  2. For this feature to work – You’ve to ensure that you’ve following configurations:

Above list will work for < Sitecore 9.X version. But you need to have few additional DLLs for your Sitecore 9.X+ version.

  • Sitecore.Kernel
  • Sitecore.Update
  • Sitecore.Log
  • Sitecore.Zip
  • Microsoft.Extensions.DependencyInjection.Abstractions
  • Microsoft.Extensions.Logging.Abstractions
  • “The package builder failed. Please set the build logging level to Normal or Detailed and see the build output log for more information on the failure.”

We got above error when we were trying to use TDS package generation feature with TDS Version and Sitecore 9.3:

As you can see above error, doesn’t provide much information about the exact error. We enabled detailed logging as explained in this post :

After doing above configurations, we could find following entry from log :

Looking for Sitecore assemblies in C:\projects\SCBasics\SC-New\Sitecore\packages
Found assembly C:\projects\SCBasics\SC-New\Sitecore\packages\Sitecore.Kernel.9.3.0\lib\net471\Sitecore.Kernel.dll
Found assembly C:\projects\SCBasics\SC-New\Sitecore\packages\Sitecore.Logging.9.3.0\lib\net471\Sitecore.Logging.dll
Found assembly C:\projects\SCBasics\SC-New\Sitecore\packages\Sitecore.Update.9.3.0\lib\net471\Sitecore.Update.dll
Found assembly C:\projects\SCBasics\SC-New\Sitecore\packages\Sitecore.Zip.9.3.0\lib\net471\Sitecore.Zip.dll
Found assembly C:\projects\SCBasics\SC-New\Sitecore\packages\Microsoft.Extensions.DependencyInjection.2.1.1\lib\net461\Microsoft.Extensions.DependencyInjection.dll
Found assembly C:\projects\SCBasics\SC-New\Sitecore\packages\Microsoft.Extensions.DependencyInjection.2.1.1\lib\netcoreapp2.0\Microsoft.Extensions.DependencyInjection.dll
Found assembly C:\projects\SCBasics\SC-New\Sitecore\packages\Microsoft.Extensions.DependencyInjection.2.1.1\lib\netstandard2.0\Microsoft.Extensions.DependencyInjection.dll
Found assembly C:\projects\SCBasics\SC-New\Sitecore\packages\Microsoft.Extensions.DependencyInjection.Abstractions.2.1.1\lib\netstandard2.0\Microsoft.Extensions.DependencyInjection.Abstractions.dll
Exception Could not load file or assembly ‘Microsoft.Extensions.Logging, Version=, Culture=neutral, PublicKeyToken=adb9793829ddae60’ or one of its dependencies. The system cannot find the file specified.(System.IO.FileNotFoundException):
at Sitecore.DependencyInjection.DefaultSitecoreServicesConfigurator.Configure(IServiceCollection serviceCollection)
at Sitecore.DependencyInjection.BaseServicesConfiguratorFactory.Configure(IServiceCollection serviceCollection)
at Sitecore.DependencyInjection.BaseServiceProviderBuilder.ConfigureServiceCollection()
at Sitecore.DependencyInjection.ServiceLocator.ConfigureServiceProvider()
at Sitecore.DependencyInjection.ServiceLocator.get_ServiceProvider()
at Sitecore.Configuration.Settings.<>c.<.cctor>b__351_0()
at System.Lazy1.CreateValue() at System.Lazy1.LazyInitValue()
at Sitecore.Update.Update.Serialization.SerializerFactory.GetSerializationType()
at Sitecore.Update.Update.Serialization.SerializerFactory.GetSerializer()
at HedgehogDevelopment.SitecoreProject.PackageBuilder.PackageBuilder.GetSitecoreItemCommands(List1 cmds, BuildContext ctx, String projectFileFolder, Project sourceTDSProject, HashSet1 includedItems)
at HedgehogDevelopment.SitecoreProject.PackageBuilder.PackageBuilder.BuildPackage(BuildContext ctx)
at HedgehogDevelopment.SitecoreProject.PackageBuilder.Program.Main(String[] args)
C:\projects\SCBasics\SC-New\Sitecore\packages\HedgehogDevelopment.TDS.\build\HedgehogDevelopment.TDS.targets(180,5): error : The package builder failed. Please set the build logging level to Normal or Detailed and see the build output log for more information on the failure.

We reached out to TDS Support team and they gave us new nuget package, which helped us resolve the issue. If you are starting your new project. I recommend you to use latest TDS version. This issue has been fixed in TDS

  • “Exception Could not load file or assembly ‘System.Runtime, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a’ or one of its dependencies. The system cannot find the file specified.(System.IO.FileNotFoundException):”

We got above error with TDS. with Sitecore 9.3

We reached out to TDS Support and this is what they replied:

This is likely caused by mixing the assemblies from .net core and standard in your package references. TDS doesn’t know which assemblies to use. The simplest way out of this is to create a folder relative to the solution root that contains just the assemblies needed by packaging and point the “Sitecore Assembly Path” value at that folder.
Please make sure to put the specific versions of the assemblies into that folder that are distributed with Sitecore. The best thing to do is to get them from the /bin folder in the Sitecore distribution. The assemblies you will likely need are:


If you need more than this, the update package step will warn you and you can get them from the /bin folder.

After correcting our nuget references to use standard package reference and NOT .net core helped us fix the issue, Apart from that we also had to make sure that we use 2.1.1 version of Microsoft.Extensions.Options nuget package.

That’s it, Happy TDS Deployment! 🙂

May 6, 2020 / kiranpatils

SXA Renderings Cheat Sheet


Recently have been doing SXA GAP analysis for new project. Sitecore documentation team has done great job documenting those here :

As you can see there are 70+ components and it’s easy to remember all of them (you no need to in real world). But when you are doing quick analysis and try to map Non SXA component with SXA.

Mark and SXA team has done great job help you visualize all components using this SXA Style guide : (Thank you so much!)

Still I wanted to have list of all components as a single reference card. So, I can quickly review it. And that’s how idea of having SXA Renderings Cheat Sheet came into existence!


You can view/Download PDF from here :

  1. First column indicates Rendering name
  2. Second column indicates whether it supports rendering variant or not (If this column doesn’t exist means it doesn’t support rendering variant)
  3. Third column indicates Description

Happy SXA Development! 🙂

February 19, 2020 / kiranpatils

Sitecore Experience Accelerator (SXA) Basics


Howdy Friends, I’m really excited to share my first SXA post with you!

SXA 1.0 was launched in 2016 and SXA 9.3 (Yes, Sitecore has changed SXA versioning!) has been released on November 2019.

I just explored little bit when it was launched, But I had my own apprehensions about It’s adoption due to unclear Sitecore licensing process [at-least to me] and lot of other things. But as following quote says:

All change is hard at first, messy in the middle, and so gorgeous at the end.” – Robin Sharma.

I think this is true for SXA as well. SXA 9.3 is gorgeous version! [That doesn’t mean past version has been hard/messy 😉 ]

I wanted to learn SXA, But there were lot of resources on the web posted by great people. As a newbie, I was confused. From where to start? [You as well!?]

Image result for confused kid with options
Image Credits :

Or, If you have following questions in your mind, then this post is for you!

  • Where to learn SXA basics?
  • What is SXA?
  • Why I should learn and adopt SXA?
  • How can I be expert in SXA?
  • What is co-relation between Sitecore Custom, Sitecore SXA, and Sitecore JSS? Are they competing development methodologies or complementing each other?
  • We are starting new project — It should be on SXA or Custom?
  • How SXA development is different than my earlier Sitecore Custom Development (Sitecore WebForms/MVC Development)?
  • I’m working on Sitecore since long time, So, whatever I’ve learnt on Sitecore platform till this point of time will be of no use?
  • Our FED-BED integration process will be impacted by SXA?
  • All my FED team need to learn SXA?
  • All my FED team need to have Sitecore instance in local?
  • BED Developer Can’t I work ahead of FED Developers?

Wow, There are lot of questions. I might not be able to cover all of them in this post. But I will try to share SXA fundamentals and try to answer few questions and by end of this post my goal will be that you will be self sufficient to find your own answers!

Quotable Quote:

Give a man a fish and you feed him for a day. Teach him how to fish and you feed him for a lifetime


Let’s follow the W-W-H (What, Why, How) learning framework for SXA.

What is SXA?

Let’s refer Sitecore’s definition :

Web development teams use Sitecore Experience Accelerator (SXA) to speed up the production of websites and to reuse components, layouts, and templates across a variety of sites.

SXA separates structure from design, so front-end designers, creative designers, content authors, and developers can work in parallel and you can deploy and maintain multiple sites quickly and cost effectively. Once a basic user experience plan is in place, everyone can get started on the platform. For example: the content author can start entering the content in the wireframe environment, while the front-end developer works on the theme, and the developer sets up the data templates.

Before we go in further details about SXA. Let’s understand type of Sitecore Development:

Image credits :
  • Custom : If you have been doing Sitecore Development since long time, then you must have seen Sitecore framework ivolved from XSLT [You are getting old? :-)], to Web Forms and MVC. We’ve taken a big leap in development from XSLT to MVC for sure. But as a human we always want to do better than yesterday. Sitecore industry folks also wanted to make product better for the full eco system. Developers across different companies/projects/agencies have been spending more time on building those similar components – Header, Footer, Menu etc. rather than focusing on core business challenges and this was impacting “Time to market” for business. Everyone was looking for something better and there were few accelerators built by few companies for either their in-house use or as a product. But Configide‘s Zengarden was promising. It got adopted by lot of companies and community members. Sitecore also noticed that and adopted SXA in Sitecore’s offerings!
  • SXA : SXA stands for Sitecore Experience Accelerator. As name suggests, it helps you to speed up your website development. SXA comes with over fifty components that can be completely customized for the needs of your brand.
  • Sitecore JSS : For headless development.

Refer following diagram which depicts SXA benefits :

SxA Website development process 
User Experience 
Visual Design 
Frontend Development 
Backend Development 
Content Entry 
Time to market

Let’s try to understand above diagram with an example – Company Contoso Inc. acquired new brand and would like to spin up a new website. They asked two different teams to develop website using different approaches. Sitecore Custom vs Sitecore SXA.

This is how overall process looks like:

Sitecore custom approach – Looks more like old manufacturing assembly approach. Where each department can work on module, once last department completes their work.
SXA approach – Looks more like round-table approach. Where everyone can work collaborate together!

As you rightly guessed, SXA team could spin up new website faster than Custom Development team.

ALERT! — If your Maths is good and you are a business stakeholder, Then please don’t create formula that SXA site should take 5 times less than Custom Development approach. It might not work that way. As each Site has different features, integrations and complexity. Please let your implementation team come up with proposed solution and time it needs to build. You also need to consider some learning curve for this new tool set. But relatively SXA should take less time than Custom. But how much that all depends on lot of factors. Which your implementation team will be able to share with you.

Also, depends on your site’s complexity, you might need to divide some work between Design, FED and BED team.

If you want to read more about SXA, I strongly recommend you to read this doc :

As you might have noticed from architecture diagram. Lot of other Sitecore pieces are old e.g. MVC, WFFM, Presentation etc. You must have noticed Sitecore Powershell module in architecture diagram.

Powershell module is heart of SXA.

Why SXA?

I believe by this time you might have already been clear with “Why SXA?” and you must be saying “Why not SXA?” 🙂 But still if you are someone who needs more reasons before deciding. I would recommend you to read following posts:

If you reached thus far and have heard following feedback from your colleagues/friends about SXA and hesitant to use SXA with that feedback or not:

  • Front-end and Back-end integration is challenging.
  • It’s cumbersome to make rendering variants.
  • Front-end markups can’t be exactly applied in Back-end.
  • Export and Import process of Creative exchange is cumbersome when project is complex and team is big.
  • It’s good for small sites. But if Site has complex custom design. Then customization takes lot of time.

This all is great feedback and learnings. Sitecore product team have been listening and working on it, and came up with SXA 9.3 version. Which has major updates. Two of my favorites are:

  • Scriban templates support – This is huge and solves two main challenges – FED-BED integration and makes customization super simple and extensible!
  • Front-end and Back-end integration workflow has been revamped : Raw FED Assets has been moved to file system rather than media library. So, your FED team mates can work in isolation and larger team can work together. Only compiled assets will be stored in Sitecore media library.

I will not spend much time writing about SXA 9.3 as lot of great souls have already written/shared about it:

What!? You are still not convinced to use SXA and need to see more reasons to use SXA over Custom Development?

Let me share few examples using which you can compare Custom and SXA way to do things and understand how efficient SXA is:

  1. SXA Caching Options : Read this section : – Allows you to apply HTML Caching at Site, Component, Placeholder level along with donut caching.
  2. Source field report OOTB :
  3. Helps you choose option :
  4. Easy cloning : – You can create pattern library and clone it as per your need.
  5. SXA Site manager : – No more restarts for adding/deleting website!
  6. Standard Security and roles management :

Hopefully you must have been convinced to use SXA by this time. If not, then please drop your use case and we can try to understand more about it :-). It might be possible that custom development might be more efficient for you to use than SXA.

Please remember technology and tools can’t solve all problems!

How to use SXA?

If you reached thus far. Then it means you are all charged up to learn SXA and looking for sources from where you can start learning basics of SXA.

I will share my learning sources and approach which I followed. Feel free to tweak it as per your need.

  1. Sitecore e-learning courses : I was very impressed with Sitecore training course’s new design. If you are developer, you might not find lot of value from Development Point of view. But these courses are great to have SXA’s fundamental understanding. You can follow your suitable approach to learn SXA. I learnt following two courses:
    1. Introduction to Sitecore® Experience Accelerator 9
    2. Fast-Track Design in Sitecore® Experience Accelerator 9
  2. Short, unofficial, ad-hoc, Sitecore SXA tutorials : This is second great source to learn SXA. Lot of great videos have been posted here. But please don’t get overwhelmed with all videos. To learn SXA, you no need to go through all videos. To keep things simple, go through some basic videos – especially – How to create site, Page Design, Partial design, Rendering variants etc. :
  3. Sitecore Documentation : – This is another great source to learn more about SXA features. I would really like to shout-out documentation team for doing great job in documenting SXA as well as some of the recent document updates have been really great! – Looks like, Sitecore documentation team is going in right direction.
  4. Practice, Practice, Practice : Nothing can beat this step. You must need to do hands-on with SXA concepts. As there are lot of concepts to explore and you can’t remember those, until you practice.
    1. Install SXA : If you are using Sitecore Install Assistant then installing SXA is super easy.
    2. Create one website : Create one simple website, which has header, footer and some pages.
    3. Create new theme using SXA CLI and try to create few rendering variants with or without Scriban
    4. If you have been working with Sitecore Custom Development since long time, and have been aware about some best practices like Standard values, Renderings, Layouts etc. try to understand their Sitecore SXA approaches.
  5. Advanced learnings:
    2. Build complex website using SXA 9.3 and Scriban templates.

Hope you found this post helpful, and will help you to quick start your SXA learning. If you learn something new please blog and share with everyone!

Have a happy site building experience! 🙂

Good reads:

Image credits:

%d bloggers like this: