We’re writing the future – together

We are dedicated professionals – shaped by a “family-like” approach to work. By looking out for all the members of our team, wherever they are based and whichever position they hold, we take the time to develop each and every one so that they can excel within a fast-paced financial world. Armed with the latest technology and tools to challenge the status quo and bring banking to another level.

A uniquely open and agile network

Creating an inspiring culture

We’re always looking ahead. Not just when it comes to creating better solutions for our clients, but when it comes to our people. Seeing ourselves as a flat organization, this means inspiring every single one of our 2,000+ colleagues to explore their passions and drive forward their ideas for change. Giving them room to grow, and making sure they are heard.

Through external and internal collaboration and teamwork, we can always stay on top of industry trends.

Kultur, die inspiriert

“Die Kultur bei Avaloq ist einzigartig. Es ist eine Kultur geprägt von Neugier, Innovation, Tatendrang und sehr viel Leidenschaft.”

Pascal Foehn

Group COO

Fehler bei der Verarbeitung der Vorlage.
The following has evaluated to null or missing:
==> .vars["Content" + index][mediaType + index]  [in template "20116#20152#TWOBYTWO-MODULE" at line 101, column 25]

----
Tip: It's the final [] step that caused this error, not those before it.
----
Tip: If the failing expression is known to be legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing</#if>. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)??
----

----
FTL stack trace ("~" means nesting-related):
	- Failed at: #assign mediaField = .vars["Content" ...  [in template "20116#20152#TWOBYTWO-MODULE" in macro "header" at line 101, column 3]
	- Reached through: @header icon, headline, mediaType, in...  [in template "20116#20152#TWOBYTWO-MODULE" in macro "contentSectionWithMedia" at line 82, column 7]
	- Reached through: @contentSectionWithMedia "1"  [in template "20116#20152#TWOBYTWO-MODULE" at line 24, column 7]
----
1<#assign articleId = .vars['reserved-article-id'].getData() /> 
2 
3<#--The top-level if condition is a work-around to avoid the need of updating --> 
4<#--all current contents using the Content with Picture Structure.--> 
5<#--Remove this after the old template version is not necessary anymore.--> 
6<#if Content1.Media1??> 
7<#-------------------------------------------------------------------------------------------------> 
8<#--CURRENT TEMPLATE FOR THE NEW STRUCTURE--> 
9<#-------------------------------------------------------------------------------------------------> 
10<#assign isDarkBg = BackgroundColor.data == "bg-dark"> 
11<#assign additionalTextClass = isDarkBg?string(" white", "")> 
12<#assign additionalBtnClass = isDarkBg?string(" btn-hover-white", "")> 
13<#assign dLFileEntryLocalService = serviceLocator.findService("com.liferay.document.library.kernel.service.DLFileEntryLocalService")> 
14 
15<div class="row two-by-two"> 
16  <div class="bg-container-fullwidth ${BackgroundColor.data}"></div> 
17  <div class="col-xs-12 ${PaddingTop.data} ${PaddingBottom.data}"> 
18    <#if Headline.data?has_content> 
19      <h2 id="headline-element-${articleId}" class="two-by-two-headline${additionalTextClass}"> 
20        ${Headline.data} 
21      </h2> 
22    </#if> 
23    <div class="row"> 
24      <@contentSectionWithMedia "1"/> 
25      <@contentSectionWithMedia "2"/> 
26    </div> 
27    <#if Content3.data?has_content || Content3.HeadlineColumn3.data?has_content || Content3.Image3.data?has_content || Content3.Icon3.data?has_content 
28    || Content4.data?has_content || Content4.HeadlineColumn4.data?has_content || Content4.Image4.data?has_content || Content4.Icon4.data?has_content> 
29      <div class="row"> 
30        <@contentSectionWithMedia "3"/> 
31        <@contentSectionWithMedia "4"/> 
32      </div> 
33    </#if> 
34  </div> 
35</div> 
36 
37<#function getFilePath fileField> 
38  <#assign imageURL = "#"> 
39  <#attempt> 
40    <#assign imageData = fileField?eval> 
41    <#assign imageData = processFileData(imageData)> 
42    <#assign image = dLFileEntryLocalService.fetchDLFileEntryByUuidAndGroupId(imageData["uuid"],imageData["groupId"]?eval) > 
43 
44    <#if themeDisplay.getCDNHost()?? && themeDisplay.getCDNHost()?has_content> 
45      <#assign imageURL = themeDisplay.getCDNHost() + "/documents/" + imageData["groupId"] + "/" + image.getFolder().getFolderId() + "/" +  imageData["title"] + "/" + imageData["uuid"] /> 
46    <#else> 
47      <#assign imageURL = "/documents/" + imageData["groupId"] + "/" + image.getFolder().getFolderId() + "/" +  imageData["title"] + "/" + imageData["uuid"] /> 
48    </#if> 
49    <#recover> 
50      <#assign imageURL = fileField> 
51  </#attempt> 
52 
53  <#return imageURL> 
54</#function> 
55 
56<#function processFileData fileData> 
57  <#if fileData["data"]??> 
58    <#return processFileData(fileData["data"]?eval)> 
59  </#if> 
60  <#return fileData> 
61</#function> 
62 
63<#macro contentSectionWithMedia index> 
64  <#assign content = .vars["Content" + index]> 
65  <#assign media = content["Media" + index]> 
66  <#--The following usages of ?remove_* are necessary due to Liferay being bugged--> 
67  <#assign mediaType = media.data?remove_beginning("[\"")?remove_ending("\"]")> 
68  <#assign mediaCaption = content["MediaCaption" + index]> 
69  <#assign icon = content["Icon" + index]> 
70  <#assign headline = content["HeadlineColumn" + index]> 
71  <#assign internalLink = content["InternalLink" + index]> 
72  <#if internalLink.data?has_content> 
73    <#assign internalLinkName = internalLink["InternalLink" + index + "Name"]> 
74  </#if> 
75  <#assign externalLink = content["ExternalLink" + index]> 
76  <#if externalLink.data?has_content> 
77    <#assign externalLinkName = externalLink["ExternalLink" + index + "Name"]> 
78  </#if> 
79 
80  <#if content.data?has_content || headline.data?has_content || icon.data?has_content> 
81    <div id="content-element-${articleId}-${index}" class="col-xs-12 col-md-6 text-${ContentPosition.data} two-by-two-section"> 
82      <@header icon headline mediaType index mediaCaption/> 
83      <#if content.data?has_content> 
84        <div class="two-by-two-section-text${additionalTextClass}">${content.data}</div> 
85      </#if> 
86        <#if internalLink.data?has_content> 
87          <a class="btn btn-link btn-icon-link-internal${additionalBtnClass}" href="${internalLink.friendlyUrl}"> 
88            ${internalLinkName.data!"Go to page"} 
89          </a> 
90        </#if> 
91        <#if externalLink.data?has_content> 
92          <a class="btn btn-link btn-icon-link-external${additionalBtnClass}" href="${externalLink.data}" target="_blank"> 
93            ${externalLinkName.data!"Visit website"} 
94          </a> 
95        </#if> 
96    </div> 
97  </#if> 
98</#macro> 
99 
100<#macro header icon headline mediaType index mediaCaption> 
101  <#assign mediaField = .vars["Content" + index][mediaType + index]> 
102  <#switch mediaType> 
103    <#case "Image"> 
104      <@imageElement mediaField/> 
105      <@iconElement icon/> 
106      <@headlineElement headline/> 
107      <#break> 
108    <#case "Video"> 
109      <#assign imageField = .vars["Content" + index]["Image" + index]/> 
110      <@iconElement icon/> 
111      <@headlineElement headline/> 
112      <@Html5Video mediaField imageField/> 
113      <@mediaCaptionElement mediaCaption/> 
114      <#break> 
115    <#case "YouTubeVideo"> 
116      <@iconElement icon/> 
117      <@headlineElement headline/> 
118      <@iframeVideo mediaField.data/> 
119      <@mediaCaptionElement mediaCaption/> 
120      <#break> 
121    <#case "BrightcoveVideo"> 
122      <@iconElement icon/> 
123      <@headlineElement headline/> 
124      <@iframeVideo mediaField.data/> 
125      <@mediaCaptionElement mediaCaption/> 
126      <#break> 
127  </#switch> 
128</#macro> 
129 
130<#macro iconElement icon> 
131  <#if icon.data?has_content> 
132 
133    <#-- Get media description (which is used as alt text for images) --> 
134    <#assign mediaDescription = "" /> 
135    <#if icon?? && icon.getData()?has_content > 
136      <#attempt> 
137        <#assign mediaParams = icon.getData()?split("/") /> 
138        <#assign mediaGroupId = mediaParams[2] /> 
139        <#assign mediaUuid = mediaParams[5]?split("?")[0] /> 
140        <#assign mediaFileEntry = dLFileEntryLocalService.getFileEntryByUuidAndGroupId(mediaUuid, mediaGroupId?number) /> 
141        <#assign mediaDescription = mediaFileEntry.getDescription() /> 
142        <#recover> 
143      </#attempt> 
144    </#if> 
145 
146    <div class="two-by-two-section-icon"> 
147      <img src="${getFilePath(icon.data)}" alt="${mediaDescription}"/> 
148    </div> 
149  </#if> 
150</#macro> 
151 
152<#macro headlineElement headline> 
153  <#if headline.data?has_content> 
154    <#if HeadlineColumnSize.data=="bigHeadline"> 
155      <h2 class="two-by-two-section-headline${additionalTextClass}">${headline.data}</h2> 
156    <#else> 
157      <h3 class="two-by-two-section-headline${additionalTextClass}">${headline.data}</h3> 
158    </#if> 
159  </#if> 
160</#macro> 
161 
162<#macro imageElement imageField> 
163  <#if imageField.data?has_content> 
164    <#assign imageURL = (themeDisplay.getCDNHost()!) + imageField.data/> 
165 
166    <#-- Get media description (which is used as alt text for images) --> 
167    <#assign mediaDescription = "" /> 
168    <#if imageField?? && imageField.getData()?has_content > 
169      <#attempt> 
170        <#assign mediaParams = imageField.getData()?split("/") /> 
171        <#assign mediaGroupId = mediaParams[2] /> 
172        <#assign mediaUuid = mediaParams[5]?split("?")[0] /> 
173        <#assign mediaFileEntry = dLFileEntryLocalService.getFileEntryByUuidAndGroupId(mediaUuid, mediaGroupId?number) /> 
174        <#assign mediaDescription = mediaFileEntry.getDescription() /> 
175        <#recover> 
176      </#attempt> 
177    </#if> 
178 
179    <div class="two-by-two-section-image"> 
180      <img src="${getFilePath(imageURL)}" alt="${mediaDescription}"/> 
181    </div> 
182  </#if> 
183</#macro> 
184 
185<#macro Html5Video videoField imageField> 
186  <#assign posterURL = (themeDisplay.getCDNHost()!) + imageField.data/> 
187  <video preload="none" controls poster="${posterURL}"> 
188    <source src="${getFilePath(videoField.data)}" type="video/mp4"> 
189  </video> 
190</#macro> 
191 
192<#macro iframeVideo iframeAsString> 
193  <#assign matchWidthOrHeight = "\\s((width=(\"|')\\d*(\"|'))|(height=(\"|')\\d*(\"|')))"/> 
194  <#assign matchAutoplay = "autoplay; "/> 
195  <#assign normalizedIframe = iframeAsString?replace("(" + matchWidthOrHeight + ")|(" + matchAutoplay + ")", "", "rs")/> 
196  ${normalizedIframe} 
197</#macro> 
198 
199<#macro mediaCaptionElement mediaCaption> 
200  <#if mediaCaption.data?has_content> 
201    <div class="avlq-media-caption caption">${mediaCaption.data}</div> 
202  </#if> 
203</#macro> 
204 
205<#else> 
206<#-------------------------------------------------------------------------------------------------> 
207<#--DEPRECATED TEMPLATE FOR DEPRECATED CONTENT TO STILL WORK--> 
208<#-------------------------------------------------------------------------------------------------> 
209  <#assign isDarkBg = BackgroundColor.data == "bg-dark"> 
210  <#assign additionalTextClass = isDarkBg?string(" white", "")> 
211  <#assign additionalBtnClass = isDarkBg?string(" btn-hover-white", "")> 
212  <#assign internalLinkFallbackLabel = languageUtil.get(locale, "avaloq-language.go-to-page")> 
213  <#assign externalLinkFallbackLabel = languageUtil.get(locale, "avaloq-language.visit-website")> 
214  <#assign dLFileEntryLocalService = serviceLocator.findService("com.liferay.document.library.kernel.service.DLFileEntryLocalService")> 
215 
216  <div class="row two-by-two"> 
217    <div class="bg-container-fullwidth ${BackgroundColor.data}"></div> 
218    <div class="col-xs-12 ${PaddingTop.data} ${PaddingBottom.data}"> 
219      <#if Headline.data?has_content> 
220        <h2 class="two-by-two-headline${additionalTextClass}"> 
221        ${Headline.data} 
222        </h2> 
223      </#if> 
224      <div class="row"> 
225        <@contentSection "1"/> 
226        <@contentSection "2"/> 
227      </div> 
228      <#if Content3.data?has_content || Content3.HeadlineColumn3.data?has_content || Content3.Image3.data?has_content || Content3.Icon3.data?has_content 
229      || Content4.data?has_content || Content4.HeadlineColumn4.data?has_content || Content4.Image4.data?has_content || Content4.Icon4.data?has_content> 
230        <div class="row"> 
231          <@contentSection "3"/> 
232          <@contentSection "4"/> 
233        </div> 
234      </#if> 
235    </div> 
236  </div> 
237 
238  <#macro contentSection index> 
239    <#assign content = .vars["Content" + index]> 
240    <#assign image = content["Image" + index]> 
241    <#assign icon = content["Icon" + index]> 
242    <#assign headline = content["HeadlineColumn" + index]> 
243    <#assign internalLink = content["InternalLink" + index]> 
244    <#if internalLink.data?has_content> 
245      <#assign internalLinkName = internalLink["InternalLink" + index + "Name"]> 
246    </#if> 
247    <#assign externalLink = content["ExternalLink" + index]> 
248    <#if externalLink.data?has_content> 
249      <#assign externalLinkName = externalLink["ExternalLink" + index + "Name"]> 
250    </#if> 
251 
252    <#if content.data?has_content || headline.data?has_content || image.data?has_content || icon.data?has_content> 
253    <div class="col-xs-12 col-md-6 text-${ContentPosition.data}"> 
254      <#if image.getData()?? && image.getData() != ""> 
255        <#assign imageURL = image.getData() /> 
256 
257        <#-- Get media description (which is used as alt text for images) --> 
258        <#assign mediaDescription = "" /> 
259        <#if image?? && image.getData()?has_content > 
260          <#attempt> 
261            <#assign mediaParams = image.getData()?split("/") /> 
262            <#assign mediaGroupId = mediaParams[2] /> 
263            <#assign mediaUuid = mediaParams[5]?split("?")[0] /> 
264            <#assign mediaFileEntry = dLFileEntryLocalService.getFileEntryByUuidAndGroupId(mediaUuid, mediaGroupId?number) /> 
265            <#assign mediaDescription = mediaFileEntry.getDescription() /> 
266            <#recover> 
267          </#attempt> 
268        </#if> 
269 
270        <div class="two-by-two-section-image"> 
271          <img src="${getFilePath(imageURL)}" alt="${mediaDescription}"/> 
272        </div> 
273          <#assign imageURL = themeDisplay.getCDNHost() + imageURL/> 
274      </#if> 
275      <#if icon.data?has_content> 
276 
277        <#-- Get media description (which is used as alt text for images) --> 
278        <#assign mediaDescription = "" /> 
279        <#if icon?? && icon.getData()?has_content > 
280          <#attempt> 
281            <#assign mediaParams = icon.getData()?split("/") /> 
282            <#assign mediaGroupId = mediaParams[2] /> 
283            <#assign mediaUuid = mediaParams[5]?split("?")[0] /> 
284            <#assign mediaFileEntry = dLFileEntryLocalService.getFileEntryByUuidAndGroupId(mediaUuid, mediaGroupId?number) /> 
285            <#assign mediaDescription = mediaFileEntry.getDescription() /> 
286            <#recover> 
287          </#attempt> 
288        </#if> 
289 
290        <div class="two-by-two-section-icon"> 
291          <img src="${getFilePath(icon.data)}" alt="${mediaDescription}"/> 
292        </div> 
293      </#if> 
294      <#if headline.data?has_content> 
295        <#if HeadlineColumnSize.data=="bigHeadline"> 
296          <h2 class="two-by-two-section-headline${additionalTextClass}">${headline.data}</h2> 
297        <#else> 
298          <h3 class="two-by-two-section-headline${additionalTextClass}">${headline.data}</h3> 
299        </#if> 
300      </#if> 
301      <#if content.data?has_content> 
302        <div class="two-by-two-section-text${additionalTextClass}">${content.data}</div> 
303      </#if> 
304        <#if internalLink.data?has_content> 
305          <a class="btn btn-link btn-icon-link-internal${additionalBtnClass}" href="${internalLink.friendlyUrl}"> 
306            ${internalLinkName.data?has_content?string(internalLinkName.data, internalLinkFallbackLabel)} 
307          </a> 
308        </#if> 
309        <#if externalLink.data?has_content> 
310          <a class="btn btn-link btn-icon-link-external${additionalBtnClass}" href="${externalLink.data}" target="_blank"> 
311            ${externalLinkName.data?has_content?string(externalLinkName.data, externalLinkFallbackLabel)} 
312          </a> 
313        </#if> 
314    </div> 
315    </#if> 
316  </#macro> 
317</#if> 
318 
319<script> 
320 
321  if ("true" === "${(Animation?? && Animation.getData() == "true")?c}" && !Liferay.Browser.isIe()) { 
322    $(document).ready(function() { 
323      if($('#headline-element-${articleId}').length){ 
324        ($('#headline-element-${articleId}')).css('opacity', '0'); 
325
326      if($('#content-element-${articleId}-1').length){ 
327        ($('#content-element-${articleId}-1')).css('opacity', '0'); 
328
329      if($('#content-element-${articleId}-2').length){ 
330        ($('#content-element-${articleId}-2')).css('opacity', '0'); 
331
332      if($('#content-element-${articleId}-3').length){ 
333        ($('#content-element-${articleId}-3')).css('opacity', '0'); 
334
335      if($('#content-element-${articleId}-4').length){ 
336        ($('#content-element-${articleId}-4')).css('opacity', '0'); 
337
338    }); 
339    // Register animation 
340    Liferay.Loader.require('avaloq-animator', function (avaloqAnimator) { 
341      avaloqAnimator.fadeIn("#headline-element-${articleId}"); 
342      avaloqAnimator.fadeIn("#content-element-${articleId}-1"); 
343      avaloqAnimator.fadeIn("#content-element-${articleId}-2", 0.2); 
344      avaloqAnimator.fadeIn("#content-element-${articleId}-3"); 
345      avaloqAnimator.fadeIn("#content-element-${articleId}-4",0.2); 
346    }); 
347
348</script> 

The story of Avaloq around the world

Being part of Avaloq means working with like-minded professionals in an innovative and dynamic environment. But there’s more to it than that – like how we interact with each other outside of the office, and through social engagement programmes such as Doing Well by Doing Good. Take a look at some of our past events and initiatives below and learn more about what working at Avaloq really means.

Giving children in Helambu, Nepal, access to online education

In 2018, two staff from the Singapore office headed to the earthquake-hit region of Helambu to build computer labs in two schools. As well as providing advice for educators on how to teach basic IT skills to kids and maintain equipment, the duo collaborated with a local non-profit to source monitors, PC's, and much more.

Cleaning up after Switzerland’s largest festival, Züri Fäscht

In July 2019, 20 colleagues from the Zurich office teamed up to clear waste from the annual Züri Fäscht festival. And, with approximately 2 million attendees generating roughly 300 tonnes of waste, the team had their work cut out for them. As well as helping the community, our staff had the opportunity to discover how the city is recycling and re-using such waste.

SOS Kinderdorf – supporting people across the world

Since 2015, we have provided financial support to SOS Kinderdorf, an NGO which aims to improve living conditions for underprivileged families and children in 135 countries. In addition, through our #onamission programme, we collect toys, clothes and educational supplies for an orphanage in Manila.

Doing Well by Doing Good

Doing Well by Doing Good is an annual social engagement programme which sponsors 12 volunteering projects focused on the environment, knowledge sharing, well-being or gender equality.

Making the switch to 100% renewable energy sources

As a software company, our most relevant scope 2 emissions are a result of the electricity consumed at our data centres. That is why we have set our sights high: to ensure 100% of the electricity we consume from the grid is procured from renewable sources.

The green way to travel

With 40 e-bikes at their disposal, our Swiss-based staff have the opportunity to commute to work in a sustainable fashion – as well as use the bikes during their days off.

We also offer discounted railcards to all our Swiss colleagues to help people limit how much they travel by car, with most of our offices located near railway stations.

Starting from the ground up

At the end of 2019, instead of the usual Christmas greetings our clients expected, we delivered something different: planting 20,000 trees in their name – one for each of our clients and staff.

In partnership with the Arbor Day Foundation, we supported a reforestation project in West Papua, Indonesia, focused on replenishing mangroves and tropical forests.

We’ve got our own way of doing things

Life at Avaloq

Our success is deeply rooted in our commitment to our people – without whom we could not deliver world-class solutions to clients. And so, by helping us remain number 1 in the industry, we give back to them by ensuring each and every one has a great working experience – all day, every day.

Gipfeli Meetings – because the best ideas start at the breakfast table

We are proud of our traditions. Once a month everyone at Avaloq, including the leadership team, meets up for breakfast at our famous Friday Gipfeli Meeting. Here, we spend an hour sharing insights and highlighting current events over croissants and coffee. Over the years, it’s been amazing to see how many new ideas have seen the light of day at these informal breakfast meetings.

A modern environment and a great workplace

At Avaloq, we’ll give you the opportunity to use state-of-the-art technology and agile development methodologies so that you can develop a deep understanding of our hardware and software – and improve the services and solutions you provide to clients.

In addition, our modern office facilities are designed to be warm and inviting, creating an atmosphere for our people to inspire and be inspired.

Employee engagement

At Avaloq, your ‘voice’ and perspective matters.

Through our ‘Your voice @ Avaloq’ survey platform, we invite colleagues to share their thoughts, ideas and concerns about Avaloq, giving us insight into what people think of the company culture, their teams and the direction the company is taking. The first survey took place in October 2018, with the engagement rate constantly improving.

Balancing work and life

Our success is deeply rooted in the commitment and passion that shines out from each and every one of us. We know how to work hard and lead our clients to success. At the same time, however, we know the importance of balance, which is why you will see so many of our people engaging in activities outside the office – very often, as a team.

Want to join our global team of dedicated Avaloq professionals?

Learn how Avaloq can boost your career

Find all job openings