Multi-country content catalogs


  • There are N regional websites, one per country.
  • The global marketing teams are responsible for global content.
  • The local marketing teams should be able to manage local content only.
  • Global teams should be able to manage some local content also if they have enough permissions.
  • The system should be idiot-proof, which means that any changes made by the regional administrators should affect only their website, not other local websites.
There are two ways to implement it partially:
  • Multi-language”: It is good if all the websites have the same design and components. Any exceptions should be implemented as hybris CMS restrictions. It is impossible or very difficult to configure the proper permissions. In this solution, the CA website administrator can change US website content – this is why this solution is partial. When the number of regions/countries is more than 3-4 this solution is also inconvenient.
  • Different pages for different countries. Per-page permissions. It will work, but with data duplications. Out-of-the-box apparel stores are implemented this way.


Although the data model is prepared for having multiple content catalogs assigned to a single website (CMSSite), the cockpit itself is not ready. For the single content catalog, out-of-the-box hybris doesn’t have any capabilities to hide a particular content slot for the user who doesn’t have enough permissions to manage it.


Hide particular content slots in hybris WCMS, depending on  the current administrator’s rights. content.png


Technical solution


WCMS part

There is an “interceptor” – the hybris layer between the model class and the service class. This interceptor replaces slot names on the fly.  

Sequence diagram of WCMS-LoadInterceptor interaction


Storefront part

Page Controller or Filter should set a variable “region” and push into JSP. JSP’s pageSlot tag has an attribute “position”. In our solution we will build the value of “position” attribute dynamically using value of “region” variable. content2

PageTemplateModel.onLoad Interceptor

public class LoadVelocityTempateInterceptor implements LoadInterceptor<PageTemplateModel> {

UserService userService;

SessionService sessionService;

CMSSiteService cmsSiteService;

public void onLoad(PageTemplateModel o, InterceptorContext var2) throws InterceptorException
// check if the request is from backoffice (WCMS)
if (cmsSiteService.getCurrentSite() != null) { return; }
String vt = o.getVelocityTemplate();
UserModel currentUser = userService.getCurrentUser();
Set < UserGroupModel > groups = userService.getAllUserGroupsForUser(currentUser);
Iterator < UserGroupModel > iter = groups.iterator();
while (iter.hasNext()) {
UserGroupModel ugm =;
String groupStr = ugm.getUid();
if (groupStr.indexOf("reg_")!=-1) {
vt = vt.replace("_regional_", "_reg_"+groupStr);

Page Controller

model.addAttribute("regional", AreWeOnCanadianWebsite() ? "reg_ca" : "reg_us");

JSP template


Velocity Template (for WCMS)

reg2.png   © Rauf Aliev, June 2016

12 Responses

  1. Tobias Ouwejan

    Tobias Ouwejan


    15 September 2016 at 04:41

    Hi Rauf, interesting article and approach! Thanks for sharing. Not sure if you’re aware, but we (Expert Services) have implemented a multi-country solution to tackle this problem as well and provide that as a solution add-on to hybris. Have a look at or find more details at

  2. Vikramjit



    28 September 2016 at 05:11

    Hi Rauf,

    Thanks for sharing the important concepts in and around Multi country content catalog design and implementation

    Is this extension available on request for reference?

  3. npkismyhomeRoy



    30 August 2017 at 06:12

    Hi Rauf, Could you share the extension you created for the multi country content catalog implementation or at least a comprehensive document. Thanks in anticipation

  4. Cistus Plus werking

    Cistus Plus werking


    29 October 2018 at 05:29

    I enjoy reading through your site. With thanks!

Leave a Reply