Privacy policy

When you use Dynamicweb Swift, you trust us with your information. This Privacy Policy is meant to help you understand what data we collect, why we collect it and what we do with it.

This is important, not only to ensure the safety of your personal data, but also to ensure you that Dynamicweb is compliant with the General Data Protection Regulation (GDPR) that will be enforced starting May 25th, 2018.

This Privacy Policy applies to the following domains:

1. Personal Information - What we collect and why

We offer certain site features, services, applications, and tools that are available only through the use of the following tracking technologies. You are always free to block, delete, or disable these technologies if your browser, installed application, or device so permits. However, if you decline cookies or other similar technologies, you may not be able to take advantage of certain site features, services, applications, or tools. 

Generally, these technologies allow our sites, services, applications, and tools to store relevant information in your browser or device and later read that information in order to identify you to our servers or internal systems. Where applicable, we protect our cookies and other similar technologies to help ensure that only we and/or our authorized service providers can interpret them by assigning them a unique identifier that is designed for interpretation only by us.

This website collects and uses personal information for the following reasons:

1.1. Google Analytics
Like most websites, this site uses Google Analytics (GA) to track user interaction. We use this data to determine the number of people using our site, to better understand how they find and use our web pages and to see their journey through the website.

Although GA records data such as your geographical location, device, internet browser and operating system, none of this information personally identifies you to us. GA also records your computer’s IP address which could be used to personally identify you but Google do not grant us access to this. We consider Google to be a third party data processor (see section 2 below).

GA makes use of cookies, details of which can be found on Google's developer guides. FYI our website uses the analytics.js implementation of GA.

Disabling cookies on your internet browser will stop GA from tracking any part of your visit to pages within this website.

Learn more about Google Analytics.

1.2. Google Tag Manager
We are constantly trying to improve the customer experience on our website by providing visitors with more personalized and targeted campaigns and offerings. To do so, we use Google Tag Manager (GTM). 

GTM is a little snippet of code that helps us track user behavior across our sites and then pushes the data to our Google Analytics account. Then, all the data is perfectly organized and ready for us to assess and review for potential site improvements and remarketing campaigns. 

We consider Google to be a third party data processor (see section 2 below).

Learn more about Google Tag Manager.

1.3. Albacross & Leadfeeder
We obtain your consent to the processing of personal data on the behalf of Albacross Nordic AB (“Albacross”) and Liidio Oy / Leadfeeder ("Leadfeeder).

Information collected from cookies set in your device that qualify as personal data will be processed by Albacross and Leadfeeder, companies offering lead identification and ad targeting services. Please see below for full contact details. 

The purpose for the processing of the personal data is that it enables Albacross and Leadfeeder to improve a service rendered to us and our website (e.g “Lead Generation” service), by adding data to their database about companies. 

The data that is collected and used by Albacross and Leadfeeder to achieve this purpose is information about the IP-address from which you visited our website, and technical information that enables Albacross and Leadfeeder to tell apart different visitors from the same IP-address. Albacross and Leadfeeder stores the domain from form input in order to correlate the IP-address with your employer. 

For the full information about our processing of personal information, please see the full Privacy Policies: Albacross Privacy Policy and Leadfeeder Privacy Policy

You may at any time withdraw your consent to this processing. Such withdrawal may be made either by contacting us, or by contacting Albacross or Leadfeeder directly. 

Contact information:

Albacross Nordic AB
Companyreg. no 556942-7338
Kungsgatan 26 
111 35 Stockholm, Sweden 
www.albacross.com - contact@albacross.com 

Liidio Oy / Leadfeeder
Company ID 2457101-9
Mikonkatu 17 C
00100 Helsinki, Finland
www.leadfeeder.com - team@leadfeeder.com

1.4. Contact and download forms
Should you choose to use the contact formdownload gated content or sign up for events, then your information will be stored in our Dynamicweb backend and collated into an email and sent to us over the Simple Mail Transfer Protocol (SMTP).

The information contained in the email will automatically be transfered onwards to our Dynamics 365 CRM system. From there, the data will be attached to any existing account with a similar email or else be created as a new contact. 

All data obtained from any website form will be subject to minimum one yearly review where inactive data – or data belonging to inactive contacts may be deleted from our Dynamicweb backend database. 

1.5. Email newsletter
If you choose to join our email newsletter, the email address that you submit to us will be forwarded to SendGrid who provide us with email marketing services. We consider SendGrid to be a third party data processor. In addition to SendGrid, your email will also be stored in our Dynamicweb backend database and in our Dynamics 365 CRM system.

You can always opt-out by using the unsubscribe link contained in any email newsletters that we send you or by requesting removal via email. When requesting removal via email, please send your email to us using the email account that is subscribed to the mailing list.

Your email address and email click history will remain within our own - and in SendGrid's database for as long as we continue to use SendGrids’s services for email marketing.

While your email address remains within our own - and in the SendGrid database, you will receive periodic (approximately three times a month) newsletter-style emails from us. Our newsletters will keep you posted on Dynamicweb's latest product announcements, software updates, and upcoming events.

If you want your personal data 'erased' from our databases, then download and fill out the data removal form step-by-step and send it to us by mail. 

We will respond without undue delay (and in any event within one month from receiving your request, although this can be extended in difficult cases). 

Be aware that all the email logs in SendGrid are kept in their database for 30 days before being fully deleted. 

Privacy questions

If you have any questions or concerns about the Privacy Policy or data processing or if you would like to make a complaint about a possible breach of local privacy laws, please contact us.

+451234567

Error executing template "CookieWarning/Cookies.cshtml"
System.UnauthorizedAccessException: Access to the path 'F:\Domains\Sites\marine-demo.mydwsite4.com\Files\Templates\Designs\Swift-v2\Translations.xml' is denied.
   at Microsoft.Win32.SafeHandles.SafeFileHandle.CreateFile(String fullPath, FileMode mode, FileAccess access, FileShare share, FileOptions options)
   at Microsoft.Win32.SafeHandles.SafeFileHandle.Open(String fullPath, FileMode mode, FileAccess access, FileShare share, FileOptions options, Int64 preallocationSize, Nullable`1 unixCreateMode)
   at System.IO.Strategies.OSFileStreamStrategy..ctor(String path, FileMode mode, FileAccess access, FileShare share, FileOptions options, Int64 preallocationSize, Nullable`1 unixCreateMode)
   at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share)
   at System.Xml.XmlTextWriter..ctor(String filename, Encoding encoding)
   at Dynamicweb.Rendering.Translation.Source.WriteDocument(XmlDocument document)
   at Dynamicweb.Rendering.Translation.Source.Save()
   at Dynamicweb.Rendering.Translation.Source.UpdateTranslationSource(Source source, IEnumerable`1 newKeys, String designName, IEnumerable`1 cultures)
   at Dynamicweb.Rendering.Template.TranslateText(String text, String defaultValue, String cultureName)
   at CompiledRazorTemplates.Dynamic.RazorEngine_ceaead14570a4279ad7ee670907aa514.ExecuteAsync()
   at RazorEngine.Templating.TemplateBase.Run(ExecuteContext context, TextWriter reader)
   at RazorEngine.Templating.RazorEngineCore.RunTemplate(ICompiledTemplate template, TextWriter writer, Object model, DynamicViewBag viewBag)
   at RazorEngine.Templating.RazorEngineService.Run(ITemplateKey key, TextWriter writer, Type modelType, Object model, DynamicViewBag viewBag)
   at RazorEngine.Templating.DynamicWrapperService.Run(ITemplateKey key, TextWriter writer, Type modelType, Object model, DynamicViewBag viewBag)
   at RazorEngine.Templating.RazorEngineServiceExtensions.Run(IRazorEngineService service, String name, TextWriter writer, Type modelType, Object model, DynamicViewBag viewBag)
   at RazorEngine.Templating.RazorEngineServiceExtensions.<>c__DisplayClass23_0.<Run>b__0(TextWriter writer)
   at RazorEngine.Templating.RazorEngineServiceExtensions.WithWriter(Action`1 withWriter)
   at RazorEngine.Templating.RazorEngineServiceExtensions.Run(IRazorEngineService service, String name, Type modelType, Object model, DynamicViewBag viewBag)
   at Dynamicweb.Rendering.RazorTemplateRenderingProvider.Render(Template template)
   at Dynamicweb.Rendering.TemplateRenderingService.Render(Template template)
   at Dynamicweb.Rendering.Template.RenderRazorTemplate()

1 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 2 @using Dynamicweb.Environment; 3 4 @{ 5 var categories = CookieManager.GetCategories(); 6 7 string cookieNoticeLink = Pageview.AreaSettings.GetLink("CookiePolicyLink") != null ? Pageview.AreaSettings.GetLink("CookiePolicyLink").Url : ""; 8 string privacyPolicyLink = Pageview.AreaSettings.GetLink("PrivacyPolicyLink") != null ? Pageview.AreaSettings.GetLink("PrivacyPolicyLink").Url : ""; 9 int cookieNoticePageID = Pageview.AreaSettings.GetLink("CookiePolicyLink") != null ? Pageview.AreaSettings.GetLink("CookiePolicyLink").PageId : 0; 10 int privacyPolicyPageID = Pageview.AreaSettings.GetLink("PrivacyPolicyLink") != null ? Pageview.AreaSettings.GetLink("PrivacyPolicyLink").PageId : 0; 11 string googleTagManagerID = Pageview.AreaSettings.GetString("GoogleTagManagerID"); 12 13 string layout = Pageview.AreaSettings.GetRawValueString("CookieLayout", "modal"); 14 15 layout = Pageview.Page.ID == cookieNoticePageID || Pageview.Page.ID == privacyPolicyPageID ? "both" : layout; 16 } 17 18 @if (!Pageview.IsVisualEditorMode) { 19 if (layout == "banner" || layout == "both") 20 { 21 <div class="position-fixed bottom-0 w-100 shadow bg-body" id="dwCookieBanner"> 22 <div class="align-items-center grid p-3"> 23 @if (layout == "banner") 24 { 25 <div class="g-col-12 g-col-md-6 g-col-lg-8"> 26 <span>@Translate("By clicking 'Accept All' you consent that we may collect information about you for various purposes, including: Statistics and Marketing")</span> 27 </div> 28 <div class="g-col-12 g-col-md-6 g-col-lg-4"> 29 <div class="grid grid-1 grid-sm-2"> 30 <button type="button" onclick="setOptInCookie(2)" class="btn btn-primary" data-dw-button="primary" id="CookiesAcceptAll"> 31 @Translate("Accept all") 32 </button> 33 <button type="button" onclick="setOptInCookie(1)" class="btn btn-secondary" data-dw-button="secondary" id="CookiesDeclineAll"> 34 @Translate("Decline") 35 </button> 36 </div> 37 </div> 38 } 39 @if (layout == "both") 40 { 41 <div class="g-col-12 g-col-lg-6 g-col-xxl-8"> 42 <span>@Translate("By clicking 'Accept All' you consent that we may collect information about you for various purposes, including: Statistics and Marketing")</span> 43 </div> 44 <div class="g-col-12 g-col-lg-6 g-col-xxl-4"> 45 <div class="grid grid-1 grid-sm-3"> 46 <button type="button" class="btn btn-link" data-bs-toggle="modal" data-bs-target="#dwCookieModal"> 47 @Translate("Customize settings") 48 </button> 49 <button type="button" onclick="setOptInCookie(2)" class="btn btn-secondary" data-dw-button="secondary" id="CookiesAcceptAll"> 50 @Translate("Accept all") 51 </button> 52 <button type="button" onclick="setOptInCookie(1)" class="btn btn-secondary" data-dw-button="secondary" id="CookiesDeclineAll"> 53 @Translate("Decline") 54 </button> 55 </div> 56 </div> 57 } 58 </div> 59 </div> 60 } 61 62 if (layout == "modal" || layout == "both") 63 { 64 <div class="modal fade" id="dwCookieModal"> 65 <div class="modal-dialog modal-dialog-centered modal-dialog-scrollable" style="max-width:560px;"> 66 <div class="modal-content bg-body"> 67 <div style="overflow-y:auto;overflow-x:hidden"> 68 <div class="p-3 p-md-4 overflow-auto" style="max-height:50vh;"> 69 <div class="h3 mb-3">@Translate("You control your data")</div> 70 <p>@Translate("We and our partners use technologies, including cookies, to collect information about you for various purposes, including"):</p> 71 <ol> 72 <li>@Translate("Functionality")</li> 73 <li>@Translate("Statistics")</li> 74 <li>@Translate("Marketing")</li> 75 </ol> 76 <p>@Translate("By clicking 'Accept All' you consent to all these purposes. You can also choose to indicate what purposes you will consent to using the custom selections and then click 'Accept selected'").</p> 77 78 @if (!string.IsNullOrEmpty(cookieNoticeLink) || !string.IsNullOrEmpty(privacyPolicyLink)) 79 { 80 <p>@Translate("You can read more about our use of cookies and other technologies, as well as our collection and processing of personal data by clicking here"):</p> 81 } 82 83 @if (!string.IsNullOrEmpty(cookieNoticeLink)) 84 { 85 <a href="@cookieNoticeLink" class="d-block mb-3" id="CookiesReadModeAbout">@Translate("Read more about Cookies")</a> 86 } 87 @if (!string.IsNullOrEmpty(privacyPolicyLink)) 88 { 89 <a href="@privacyPolicyLink" class="d-block" id="CookiesPrivacyPolicy">@Translate("Our privacy policy")</a> 90 } 91 </div> 92 93 <div class="p-3 px-md-4 border-top"> 94 <div class="grid grid-1 grid-sm-2 gap-3"> 95 <button type="button" onclick="setOptInCookie(1)" class="btn btn-secondary" data-bs-dismiss="modal" id="dwCookieDeclineAll">@Translate("Decline")</button> 96 @if (categories.Any()) 97 { 98 <button type="button" onclick="acceptCustomSetup()" class="btn btn-secondary d-none" data-bs-dismiss="modal" id="dwCookieAcceptSelected">@Translate("Accept selected")</button> 99 } 100 <button type="button" onclick="setOptInCookie(2)" class="btn btn-secondary" data-bs-dismiss="modal" id="dwCookieAcceptAll">@Translate("Accept All")</button> 101 </div> 102 </div> 103 104 @if (categories.Any()) 105 { 106 int categoriesCount = 0; 107 int totalCategories = categories.Count(); 108 109 <form id="dwCookieModalCustomForm" method="post" action="/Admin/Public/CookieOptInLevelConfig.aspx"> 110 <input type="hidden" name="cmd" value="SetCookieOptInLevel"> 111 <input type="hidden" name="OptInLevel" id="OptInLevel" value="1"> 112 <div class="grid grid-2 grid-sm-4 gap-0 px-md-3 border-top border-1"> 113 <div class="p-3"> 114 <label class="form-check-label" for="dwCookieNecessary"><span>@Translate("Necessary")</span></label> 115 <div class="form-check form-switch form-control-lg py-0"> 116 <input class="form-check-input opacity-100" type="checkbox" id="dwCookieNecessary" checked disabled style="background-color: rgba(0,0,0,0.1);"> 117 </div> 118 </div> 119 @foreach (var category in categories) 120 { 121 string border = categoriesCount < (totalCategories - 1) ? "" : ""; 122 123 <div class="p-3 @(border)"> 124 <label class="form-check-label" for="CookieCategory_@category"><span>@Translate(category)</span></label> 125 <div class="form-check form-switch form-control-lg py-0"> 126 <input class="form-check-input js-checkbox" type="checkbox" name="OptInCategory" value="@category" id="CookieCategory_@category" onchange="toggleAcceptSelected()" style="background-color: rgba(0,0,0,0.1);"> 127 </div> 128 </div> 129 categoriesCount++; 130 } 131 </div> 132 </form> 133 } 134 </div> 135 </div> 136 </div> 137 </div> 138 } 139 140 141 <script> 142 async function setOptInCookie(optInLevel) { 143 let response = await fetch("/admin/public/CookieOptInLevelConfig.aspx?cmd=SetCookieOptInLevel&OptInLevel=" + optInLevel); 144 @if (!string.IsNullOrWhiteSpace(googleTagManagerID)){ 145 <text> 146 if (optInLevel == '2') { 147 consentGrantedAll(); 148 } 149 </text> 150 } 151 152 if (response.ok) { 153 if (document.querySelector("#dwCookieBanner")) { 154 document.querySelector("#dwCookieBanner").classList.add("d-none"); 155 } 156 document.location.reload(); 157 return false; 158 } else { 159 return false; 160 } 161 } 162 163 async function acceptCustomSetup() { 164 var form = document.querySelector("#dwCookieModalCustomForm"); 165 166 let formData = new FormData(form); 167 var fetchOptions = { 168 method: 'POST', 169 body: formData 170 }; 171 172 for (const value of formData.values()) { 173 console.log(value); 174 if (value == 'Marketing') { 175 console.log('Granting marketing cookies') 176 consentGrantedMarketing(); 177 } 178 if (value == 'Statistical') { 179 console.log('Granting statistical cookies') 180 consentGrantedAnalyticsStorage(); 181 } 182 } 183 184 185 let response = await fetch(form.action, fetchOptions); 186 187 if (response.ok) { 188 if (document.querySelector("#dwCookieBanner")) { 189 document.querySelector("#dwCookieBanner").classList.add("d-none"); 190 } 191 document.location.reload(); 192 return false; 193 } else { 194 return false; 195 } 196 } 197 198 199 function consentGrantedAll() { 200 consentGrantedMarketing(); 201 consentGrantedAnalyticsStorage(); 202 } 203 204 function consentGrantedMarketing() { 205 consentGrantedAdStorage(); 206 consentGrantedAdUserData(); 207 consentGrantedAdPersonalization(); 208 } 209 210 function consentGrantedAdStorage() { 211 if (!window.dataLayer) return; 212 gtag('consent', 'update', { 213 'ad_storage': 'granted' 214 }); 215 } 216 217 function consentGrantedAdUserData() { 218 if (!window.dataLayer) return; 219 gtag('consent', 'update', { 220 'ad_user_data': 'granted' 221 }); 222 } 223 224 function consentGrantedAdPersonalization() { 225 if (!window.dataLayer) return; 226 gtag('consent', 'update', { 227 'ad_personalization': 'granted' 228 }); 229 } 230 231 function consentGrantedAnalyticsStorage() { 232 if (!window.dataLayer) return; 233 gtag('consent', 'update', { 234 'analytics_storage': 'granted' 235 }); 236 } 237 238 function toggleAcceptSelected() { 239 var cookieCalegoriesElement = document.querySelector("#dwCookieModalCustomForm"); 240 var enableAcceptSelected = false; 241 242 cookieCalegoriesElement.querySelectorAll(".js-checkbox").forEach(function (field) { 243 if (field.checked == true) { 244 enableAcceptSelected = true; 245 } 246 }); 247 248 if (enableAcceptSelected) { 249 document.querySelector("#dwCookieDeclineAll").classList.add("d-none"); 250 document.querySelector("#dwCookieAcceptSelected").classList.remove("d-none"); 251 } else { 252 document.querySelector("#dwCookieDeclineAll").classList.remove("d-none"); 253 document.querySelector("#dwCookieAcceptSelected").classList.add("d-none"); 254 } 255 } 256 257 function showCookieModal() { 258 var cookieModal = new bootstrap.Modal(document.querySelector('#dwCookieModal'), { 259 backdrop: 'static' 260 }); 261 cookieModal.show(); 262 } 263 </script> 264 265 if (layout == "modal") 266 { 267 <script type="module"> 268 showCookieModal(); 269 </script> 270 } 271 } 272