<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">Blog posts by Francisco Quintanilla</title><link href="http://world.optimizely.com" /><updated>2026-02-12T20:47:19.0000000Z</updated><id>https://world.optimizely.com/blogs/francisco-quintanilla/</id> <generator uri="http://world.optimizely.com" version="2.0">Optimizely World</generator> <entry><title>Building a TwoColumnWideLeftSection in Optimizely CMS 13 Visual Builder</title><link href="http://powerbuilder.home.blog/?p=609" /><id>This post walks through a practical “66% / 33%” section built for Visual Builder using the composition tag helpers: &amp;#60;epi-grid&amp;#62;, &amp;#60;epi-row&amp;#62;, &amp;#60;epi-column&amp;#62;, and &amp;#60;epi-component /&amp;#62;. Visual Builder is Optimizely’s layout-and-composition editing experience (originally introduced for CMS SaaS, but the concepts carry over). What you’re building A section type that renders: A Bootstrap container One row &amp;#8230; &lt;p&gt;&lt;a href=&quot;https://powerbuilder.home.blog/2026/02/12/building-a-twocolumnwideleftsection-in-optimizely-cms-13-visual-builder/&quot; class=&quot;more-link&quot;&gt;Continue reading &lt;span class=&quot;screen-reader-text&quot;&gt;Building a TwoColumnWideLeftSection in Optimizely CMS 13 Visual&amp;#160;Builder&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;</id><updated>2026-02-12T20:47:19.0000000Z</updated><summary type="html">Blog post</summary></entry> <entry><title>Optimizely CMS 13 (Pre-release) Visual Builder</title><link href="http://powerbuilder.home.blog/?p=595" /><id>This post captures a proof of concept built on an Alloy MVC site upgraded to Optimizely CMS 13 pre-release, focused on Visual Builder, how to model the new ExperienceData and SectionData types, and how to configure editor-friendly style choices for Visual Builder elements. Sample Alloy MVC repo for CMS 13:https://github.com/evest/cms13-test1/tree/master Why CMS 13 and Visual &amp;#8230; &lt;p&gt;&lt;a href=&quot;https://powerbuilder.home.blog/2026/02/11/optimizely-cms-13-pre-release-visual-builder/&quot; class=&quot;more-link&quot;&gt;Continue reading &lt;span class=&quot;screen-reader-text&quot;&gt;Optimizely CMS 13 (Pre-release) Visual&amp;#160;Builder&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;</id><updated>2026-02-11T17:43:21.0000000Z</updated><summary type="html">Blog post</summary></entry> <entry><title>Fixing TinyMCE Initialization Failures in Optimizely CMS: A Hidden Pipeline Issue with .NET SDK Versions</title><link href="http://powerbuilder.home.blog/?p=575" /><id>Over the past few weeks, several Optimizely CMS projects began experiencing a puzzling failure: XHtmlString fields stopped initializing TinyMCE in the edit interface. The editor simply refused to load, leaving users unable to manage rich text content. This issue surfaced in multiple unrelated projects, so it was clear the root cause wasn’t project-specific code. After &amp;#8230; &lt;p&gt;&lt;a href=&quot;https://powerbuilder.home.blog/2025/12/08/fixing-tinymce-initialization-failures-in-optimizely-cms-a-hidden-pipeline-issue-with-net-sdk-versions/&quot; class=&quot;more-link&quot;&gt;Continue reading &lt;span class=&quot;screen-reader-text&quot;&gt;Fixing TinyMCE Initialization Failures in Optimizely CMS: A Hidden Pipeline Issue with .NET SDK&amp;#160;Versions&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;</id><updated>2025-12-09T00:33:29.0000000Z</updated><summary type="html">Blog post</summary></entry> <entry><title>How to Add Multiple Authentication Providers to an Optimizely CMS 12 Site (Entra ID, Google, Facebook, and Local Identity)</title><link href="http://powerbuilder.home.blog/?p=547" /><id>Modern websites often need to let users sign in with their corporate account (Entra ID), their social identity (Google, Facebook), or a simple email/password for internal users. If you’re building on Optimizely CMS 12, you can support all of them at once — without breaking the built-in CMS login system. In this post, we’ll walk &amp;#8230; &lt;p&gt;&lt;a href=&quot;https://powerbuilder.home.blog/2025/10/22/how-to-add-multiple-authentication-providers-to-an-optimizely-cms-12-site-entra-id-google-facebook-and-local-identity/&quot; class=&quot;more-link&quot;&gt;Continue reading &lt;span class=&quot;screen-reader-text&quot;&gt;How to Add Multiple Authentication Providers to an Optimizely CMS 12 Site (Entra ID, Google, Facebook, and Local&amp;#160;Identity)&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;</id><updated>2025-10-22T20:03:27.0000000Z</updated><summary type="html">Blog post</summary></entry> <entry><title>Building a Custom Payment in Optimizely Commerce 14 (with a simple “Account” method)</title><link href="http://powerbuilder.home.blog/?p=495" /><id>This post outlines a simplified method for integrating Account payments into Commerce 14, detailing a minimal working path without extensive exploration. It covers creating a Payment Option and Payment Gateway, registering them in the Admin UI, and optionally persisting Account numbers in a custom database table.</id><updated>2025-10-17T19:41:38.0000000Z</updated><summary type="html">Blog post</summary></entry> <entry><title>How to Use IPlacedPriceProcessor in Optimizely Commerce to Preserve Custom Line Item Prices (Donation Example)</title><link href="http://powerbuilder.home.blog/?p=482" /><id>Optimizely Commerce 12+ automatically validates line item prices based on catalog data, which can overwrite user-entered prices for donations or custom amounts. To avoid this, you can extend the IPlacedPriceProcessor to preserve user-defined prices by using a custom flag. This method maintains the pricing system&#39;s integrity while accommodating unique business models.</id><updated>2025-10-15T15:48:45.0000000Z</updated><summary type="html">Blog post</summary></entry> <entry><title>Secure Your CMS: A Guide to the OptiAccess Restrictor Add-on</title><link href="http://powerbuilder.home.blog/?p=464" /><id>The OptiAccess Restrictor add-on enhances CMS security by preventing unauthorized access, allowing IP whitelisting.</id><updated>2025-03-18T15:22:24.0000000Z</updated><summary type="html">Blog post</summary></entry> <entry><title>Resolving High CPU Consumption Due to Database Queries in Optimizely CMS</title><link href="http://powerbuilder.home.blog/?p=442" /><id>Have you ever encountered a scenario where your database server&#39;s CPU consumption spiked to 100%, causing major disruptions? In this blog post, we&#39;ll delve into a real-life case where a client experienced precisely that, and how we identified and resolved the root cause. The Problem Unveiled Our client, let&#39;s call them ClientX, was facing intermittent &amp;#8230; &lt;p&gt;&lt;a href=&quot;https://powerbuilder.home.blog/2024/04/01/resolving-high-cpu-consumption-due-to-database-queries-in-optimizely-cms/&quot; class=&quot;more-link&quot;&gt;Continue reading &lt;span class=&quot;screen-reader-text&quot;&gt;Resolving High CPU Consumption Due to Database Queries in Optimizely&amp;#160;CMS&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;</id><updated>2024-04-01T21:56:00.0000000Z</updated><summary type="html">Blog post</summary></entry> <entry><title>Getting Started with Optimizely SaaS Core and Next.js Integration: Content Areas and Blocks</title><link href="http://powerbuilder.home.blog/?p=399" /><id>The blog guide elaborates on improving content rendering by exploring content areas and blocks within the Optimizely CMS. It walks through setting up a ContentArea, creating blocks, populating content, and integrating these blocks in Next.js. The guide also discusses creating a helper class, a Content Area Factory class, and finally incorporating the factory into the Content Page. This allows dynamic rendering of different block types without extensive modifications.</id><updated>2023-12-08T01:00:00.0000000Z</updated><summary type="html">Blog post</summary></entry> <entry><title>Getting Started with Optimizely SaaS Core and Next.js Integration: Creating Content Pages</title><link href="http://powerbuilder.home.blog/?p=363" /><id>The blog post discusses the creation of additional page types with Next.js and Optimizely SaaS Core. It provides a step-by-step guide on how to create content pages, query content, and build pages in Next.js. The post also explains how dynamic routing and the implementation of a Factory class can streamline the creation process and enhance code maintainability.</id><updated>2023-12-01T01:30:00.0000000Z</updated><summary type="html">Blog post</summary></entry> <entry><title>Getting Started with Optimizely SaaS Core and Next.js Integration: Testing Content Updates</title><link href="http://powerbuilder.home.blog/?p=339" /><id>The blog post discusses the challenges of content updates on a website using Optimizely CMS, Next.js, and the Apollo Client due to Apollo&#39;s local caching feature. The local caching enhances application speed but fails to reflect real-time updates. A temporary solution used is the revalidate parameter set  to revalidate the cache every 5 seconds, ensuring content updates are reflected. However, this is not ideal for long-term use, and more targeted cache updates are preferable in a production environment.</id><updated>2023-11-27T13:47:09.0000000Z</updated><summary type="html">Blog post</summary></entry> <entry><title>Getting Started with Optimizely SaaS Core and Next.js Integration</title><link href="http://powerbuilder.home.blog/?p=285" /><id>The blog post covers the process of creating a website with Optimizely SaaS Core and integrating it with a Next.js project. Key steps include defining content types, setting up the website, synchronizing data with Optimizely Graph, installing Next.js, and incorporating Apollo for GraphQL data fetching. The post also provides information about styling adjustments and future topics.</id><updated>2023-11-23T18:08:30.0000000Z</updated><summary type="html">Blog post</summary></entry> <entry><title>How to Merge Anonymous Carts When a Customer Logs In with Optimizely Commerce 14</title><link href="https://world.optimizely.com/blogs/francisco-quintanilla/dates/2023/3/how-to-merge-anonymous-carts-when-a-customer-logs-in-with-optimizely-commerce-14/" /><id>&lt;p&gt;In e-commerce, it is common for users to browse a site anonymously, adding items to their cart without creating an account. Later, when the user decides to create an account or log in, they may have items already in their anonymous cart that they would like to keep. In this scenario, it is important to merge the anonymous cart with the authenticated cart to ensure a seamless shopping experience.&lt;/p&gt;
&lt;p&gt;In this blog post, I will show you how to merge anonymous carts with authenticated carts in Optimizely Commerce 14.&lt;/p&gt;
&lt;h3&gt;Overview&lt;/h3&gt;
&lt;p&gt;The code I will be using is a middleware component that runs on every incoming HTTP request. If the user is authenticated, the middleware retrieves the user&#39;s anonymous cart using the &lt;code&gt;IAnonymousIdFeature&lt;/code&gt; and merges it with their authenticated cart.&lt;/p&gt;
&lt;pre class=&quot;language-csharp&quot;&gt;&lt;code&gt;using EPiServer.Commerce.Order;
using EPiServer.ServiceLocation;
using Mediachase.Commerce;
using Mediachase.Commerce.Anonymous;
using Mediachase.Commerce.Customers;
using Mediachase.Commerce.Markets;

namespace Infrastructure.Commerce.Extensions
{
    public class AnonymousCartMergingMiddleware
    {
        private readonly RequestDelegate _next;

        public AnonymousCartMergingMiddleware(RequestDelegate next)
        {
            _next = next;
        }

        public async Task InvokeAsync(HttpContext context)
        {
            if (context.User.Identity != null &amp;amp;&amp;amp; context.User.Identity.IsAuthenticated)
            {
                var anonymousId = context.Features.Get&amp;lt;IAnonymousIdFeature&amp;gt;().AnonymousId;
                
                if (!string.IsNullOrWhiteSpace(anonymousId))
                {
                    var orderRepository = ServiceLocator.Current.GetInstance&amp;lt;IOrderRepository&amp;gt;();
                    var marketService = ServiceLocator.Current.GetInstance&amp;lt;IMarketService&amp;gt;();
                    
                    var market = marketService.GetMarket(MarketId.Default);
                    var cart = orderRepository.LoadCart&amp;lt;ICart&amp;gt;(new Guid(anonymousId), Constants.CartName.ShoppingCart, market.MarketId);

                    if (cart != null &amp;amp;&amp;amp; cart.GetAllLineItems().ToList().Count &amp;gt; 0)
                    {
                        var currentMarket = ServiceLocator.Current.GetInstance&amp;lt;ICurrentMarket&amp;gt;();
                        cart.MarketId = currentMarket.GetCurrentMarket().MarketId;
                        orderRepository.Save(cart);
                        
                        var profileMigrator = ServiceLocator.Current.GetInstance&amp;lt;IProfileMigrator&amp;gt;();
                        profileMigrator.MigrateCarts(new Guid(anonymousId));
                    }
                }
            }

            await _next(context);
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You can use an extension method to expose the middleware through `IApplicationBuilder`.&lt;/p&gt;
&lt;pre class=&quot;language-csharp&quot;&gt;&lt;code&gt;namespace Infrastructure.Commerce.Extensions
{
    public static class AnonymousCartMergingMiddlewareExtensions
    {
        public static IApplicationBuilder UseAnonymousCartMerging(this IApplicationBuilder builder)
        {
            return builder.UseMiddleware&amp;lt;AnonymousCartMergingMiddleware&amp;gt;();
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The following code calls the middleware from `Startup.cs`&lt;/p&gt;
&lt;pre class=&quot;language-csharp&quot;&gt;&lt;code&gt;    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        app.UseAnonymousCartMerging();        
    }&lt;/code&gt;&lt;/pre&gt;</id><updated>2023-03-27T22:44:18.0000000Z</updated><summary type="html">Blog post</summary></entry> <entry><title>Organize page content into folders dynamically</title><link href="https://powerbuilder.home.blog/?p=255" /><id>Why do we need organized content into folders or containers? As your content tree grows, it gets more difficult to locate items and performance can decrease.All the items inside the folder or container are automatically organized in a logical format. When to use dynamic folders? When you need to manage large number of items in &amp;#8230; &lt;p&gt;&lt;a href=&quot;https://powerbuilder.home.blog/2022/03/03/organize-page-content-into-folders-dynamically/&quot; class=&quot;more-link&quot;&gt;Continue reading &lt;span class=&quot;screen-reader-text&quot;&gt;Organize page content into folders&amp;#160;dynamically&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;</id><updated>2022-03-03T20:59:35.0000000Z</updated><summary type="html">Blog post</summary></entry> <entry><title>Organize page content into folders dynamically</title><link href="http://powerbuilder.home.blog/?p=255" /><id>Why do we need organized content into folders or containers? As your content tree grows, it gets more difficult to locate items and performance can decrease.All the items inside the folder or container are automatically organized in a logical format. When to use dynamic folders? When you need to manage large number of items in &amp;#8230; &lt;p&gt;&lt;a href=&quot;https://powerbuilder.home.blog/2022/03/03/organize-page-content-into-folders-dynamically/&quot; class=&quot;more-link&quot;&gt;Continue reading &lt;span class=&quot;screen-reader-text&quot;&gt;Organize page content into folders&amp;#160;dynamically&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;</id><updated>2022-03-03T20:59:35.0000000Z</updated><summary type="html">Blog post</summary></entry> <entry><title>Cache Tag Helpers in Optimizely 12</title><link href="https://powerbuilder.home.blog/?p=237" /><id>As developers, we always should look for opportunities to boost the performance of web applications. Caching is one of them. It can significantly improve our application load time and responsiveness and ASP.NET Core helps us with this by providing server-side caching using Caching Tag Helpers in views.</id><updated>2021-11-26T22:27:32.0000000Z</updated><summary type="html">Blog post</summary></entry> <entry><title>Cache Tag Helpers in Optimizely 12</title><link href="http://powerbuilder.home.blog/?p=237" /><id>As developers, we always should look for opportunities to boost the performance of web applications. Caching is one of them. It can significantly improve our application load time and responsiveness and ASP.NET Core helps us with this by providing server-side caching using Caching Tag Helpers in views.</id><updated>2021-11-26T22:27:32.0000000Z</updated><summary type="html">Blog post</summary></entry> <entry><title>Downgrade Optimizely (Former Episerver)</title><link href="http://powerbuilder.home.blog/?p=226" /><id>Downgrade Episerver library verions</id><updated>2021-05-29T17:04:11.0000000Z</updated><summary type="html">Blog post</summary></entry> <entry><title>Downgrade Optimizely (Former Episerver)</title><link href="https://powerbuilder.home.blog/?p=226" /><id>This may sound a bit strange, but I had to downgrade Episerver Find in lower environments. It is not enough to install the old NuGet library into your development environment and publish it again to Integration. First, you need to make sure that the database has not been upgraded, but if it was, you should &amp;#8230; &lt;p&gt;&lt;a href=&quot;https://powerbuilder.home.blog/2021/05/29/downgrade-optimizely-former-episerver/&quot; class=&quot;more-link&quot;&gt;Continue reading &lt;span class=&quot;screen-reader-text&quot;&gt;Downgrade Optimizely (Former&amp;#160;Episerver)&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;</id><updated>2021-05-29T17:04:11.0000000Z</updated><summary type="html">Blog post</summary></entry> <entry><title>Content Usages Add-on</title><link href="http://powerbuilder.home.blog/?p=205" /><id>It is very important for editors to know the impact of changing content, especially what exact pages will be affected when changing block content. This add-on will help editors know on what pages the item is being used. Content Link Add-on Content Links Report Installation The module is available for download and installation as&amp;#160; NuGet &amp;#8230; &lt;p&gt;&lt;a href=&quot;https://powerbuilder.home.blog/2020/12/16/content-usages-add-on/&quot; class=&quot;more-link&quot;&gt;Continue reading &lt;span class=&quot;screen-reader-text&quot;&gt;Content Usages Add-on&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;</id><updated>2020-12-16T21:25:08.0000000Z</updated><summary type="html">Blog post</summary></entry></feed>