• More than 20 years experience
  • Complete assessments
  • No agency fees
Schedule an appointment
Schedule an appointment

Versnippering remt adoptie en vergroot exposure

Als AI groeit zonder kader, groeit het risico mee

In veel organisaties ontstaat AI-gebruik via losse tools en initiatieven. Medewerkers experimenteren, teams lossen lokaal iets op en IT krijgt het pas laat in beeld. Dat is begrijpelijk, maar het is niet schaalbaar.

Zonder overzicht op use cases, datastromen, eigenaarschap en security ontstaan risico’s rond AVG, IP en compliance. En zolang de basis ontbreekt, blijft AI hangen in pilots in plaats van structurele verbetering van processen.

Wat we zien bij onze klanten

De grootste knelpunten waar je tegenaan loopt

  • Geen totaalbeeld van AI-tools, use cases en datagebruik
  • Onduidelijk eigenaarschap, governance en beheer
  • Initiatieven zonder duidelijke businesscase of vervolg
  • Integratie met M365, CRM, ERP en SharePoint kost te veel tijd
  • Onzekerheid over security, compliance en datakwaliteit
  • Beperkte uitlegbaarheid, waardoor vertrouwen en adoptie achterblijven

Je kunt pas verantwoord versnellen als je dit scherp hebt.

Veel organisaties willen verder met AI, maar missen een feitelijk vertrekpunt. Wat gebeurt er nu echt? Waar zitten risico’s, waar zit waarde en wat is logisch om als eerste op te pakken? Onze AI Scan brengt dit gestructureerd in kaart en voorkomt dat je bouwt op aannames.

Overzicht, doelarchitectuur en roadmap in één aanpak

AI Scan: van nulmeting naar richting en prioriteit

Wij starten met een AI Scan. Daarmee realiseren wij een feitelijk vertrekpunt: hoe AI nu wordt gebruikt, waar de grootste risico’s zitten en welke kansen het meest kansrijk zijn.

We brengen het AI- en IT-landschap in kaart, inclusief datastromen, integraties en randvoorwaarden. Daarna ontwerpen we een beheersbare AI-doelarchitectuur en vertalen we dit naar een geprioriteerde roadmap met concrete projecten, scope, effort en verwachte impact.

Binnen jouw omgeving, met governance en logging vanaf dag één

Daarna realiseren wij AI-agents die echt landen

Op basis van de AI Scan ontwerpen en realiseren wij gerichte AI-agents voor processen in onder meer sales, HR, operations en IT-support. Elke agent heeft één duidelijke taak en levert voorspelbare output die direct bruikbaar is in de praktijk.

Wij borgen security, privacy, rollen, rechten en logging in het ontwerp en de implementatie. Waar beslissingen impact hebben, richten wij mens-in-the-loop expliciet in. Zo blijft AI uitlegbaar, controleerbaar en auditeerbaar.

Praktisch, modulair en uitbreidbaar

Oplossingen en processen waar wij op realiseren

  • Sales- en accountvoorbereiding
  • HR- en recruitmentondersteuning
  • Operationele en IT-support
  • Managementinformatie en besluitvorming
  • Marketing en content
  • Operations, inkoop en logistiek

Kleine stappen, directe waarde

Concrete toepassingen uit de praktijk

  • Sales start elk klantgesprek met een automatische klantbriefing en actielijst
  • HR-teams structureren screening, interviews en opvolging binnen duidelijke kaders
  • IT-support classificeert en prioriteert tickets met consistente oplossingsvoorstellen
  • Managers stellen vragen in gewone taal op basis van ERP-, CRM- en BI-data
  • Operations signaleert afwijkingen in voorraad, levertijden en orders met actievoorstellen

AI Scan

Inventarisatie van AI-gebruik binnen de organisatie, risico’s en kansen.

Verantwoord 'AI Framework'

Afspraken en beleid, data afbakening en menselijke controle.

Tooling & Agents

Afgestemd op de verschillende rollen binnen de organisatie.

Training en Adoptie

Praktisch, schaalbaar en meetbaar maken van AI binnen de organisatie. 

Error executing template "/Designs/ClientBase_generated/Grid/AdvancedGrid/RowTemplates/AdvancedGridConfiguration.cshtml"
System.InvalidOperationException: Collection was modified; enumeration operation may not execute.
   at System.ThrowHelper.ThrowInvalidOperationException(ExceptionResource resource)
   at System.Collections.Generic.List`1.Enumerator.MoveNextRare()
   at CompiledRazorTemplates.Dynamic.RazorEngine_bc5aed1407d94052bda0e6b9c076a082.Execute() in D:\dynamicweb.net\Solutions\Bluedesk\worldemp.cloud.dynamicweb-cms.com\files\Templates\Designs\ClientBase_generated\Grid\AdvancedGrid\RowTemplates\AdvancedGridConfiguration.cshtml:line 131
   at RazorEngine.Templating.TemplateBase.RazorEngine.Templating.ITemplate.Run(ExecuteContext context, TextWriter reader)
   at RazorEngine.Templating.RazorEngineService.RunCompile(ITemplateKey key, TextWriter writer, Type modelType, Object model, DynamicViewBag viewBag)
   at RazorEngine.Templating.RazorEngineServiceExtensions.<>c__DisplayClass16_0.<RunCompile>b__0(TextWriter writer)
   at RazorEngine.Templating.RazorEngineServiceExtensions.WithWriter(Action`1 withWriter)
   at Dynamicweb.Rendering.RazorTemplateRenderingProvider.Render(Template template)
   at Dynamicweb.Rendering.TemplateRenderingService.Render(Template template)
   at Dynamicweb.Rendering.Template.RenderRazorTemplate()

1 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.GridRowViewModel> 2 @using Dynamicweb; 3 @using Dynamicweb.Content 4 @using Dynamicweb.Content.Items; 5 6 @using Dynamicweb.Frontend 7 @using Bluedesk.DynamicWeb.ItemTypes; 8 9 @using Bluedesk.DynamicWeb.ItemTypes.Configuration; 10 @using Bluedesk.DynamicWeb.ItemTypes.Settings.Configuration; 11 @using Bluedesk.DynamicWeb.ItemTypes.BaseSolution; 12 @using Bluedesk.DynamicWeb.ItemTypes.Extensions; 13 14 @using System.Runtime.Caching; 15 16 @{ 17 var rowID = Model.Item.Id; 18 // var paragraphID = Pageview.CurrentParagraph.ID; 19 AdvancedGridConfiguration _data = new AdvancedGridConfiguration(); 20 21 int CacheTime = 5; 22 MemoryCache memCache = MemoryCache.Default; 23 string cacheKey = $"AdvancedGridConfiguration_{rowID}-{Pageview.AreaID}"; 24 25 if (Pageview.IsVisualEditorMode) 26 { 27 var cache = MemoryCache.Default; 28 memCache.Remove($"AdvancedGridConfiguration_{rowID}-{Pageview.AreaID}"); 29 } 30 31 if (memCache.Contains(cacheKey)) 32 { 33 _data = memCache.Get(cacheKey) as AdvancedGridConfiguration; 34 35 if (_data == null) 36 { 37 _data = Dynamicweb.Content.Services.Items.GetItem("AdvancedGridConfiguration", rowID.ToString()).ToCodeFirstItem<AdvancedGridConfiguration>() ?? new AdvancedGridConfiguration(); 38 memCache.Set(cacheKey, _data, DateTimeOffset.UtcNow.AddMinutes(CacheTime)); 39 40 } 41 42 } 43 else 44 { 45 _data = Dynamicweb.Content.Services.Items.GetItem("AdvancedGridConfiguration", rowID.ToString()).ToCodeFirstItem<AdvancedGridConfiguration>() ?? new AdvancedGridConfiguration(); 46 memCache.Set(cacheKey, _data, DateTimeOffset.UtcNow.AddMinutes(CacheTime)); 47 } 48 49 string GridTemplate = _data.GetGridTemplate(); 50 string height = !string.IsNullOrWhiteSpace(_data.Height.ToString()) ? _data.Height.ToString() + "px" : "none"; 51 52 string ContentAlignment = _data.ContentAlignment; 53 54 string VerticalAlign = "center"; 55 string HorizontalAlign = "center"; 56 57 } 58 59 60 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.GridRowViewModel> 61 @using Dynamicweb; 62 @using Dynamicweb.Frontend 63 @using Bluedesk.DynamicWeb.ItemTypes.BaseSolution; 64 65 @helper RenderButton(AdvancedGridButton button, PageView Pageview) 66 { 67 string Template = button.GetAdvancedButtonTemplate().Replace("{{ ButtonLink }}", button.GetLink(Pageview)); 68 69 if (!string.IsNullOrWhiteSpace(button.GetLink(Pageview))) 70 { 71 @Template; 72 } 73 } 74 75 76 @{ 77 Dictionary<string, string> GridAlignment = _data.GetContentAlignMent(ContentAlignment); 78 } 79 80 @{ 81 82 var template = new System.Text.StringBuilder(); 83 var stylesheet = new System.Text.StringBuilder(); 84 85 if (!int.TryParse(Dynamicweb.Context.Current?.Request?.Params?["AreaId"], out int areaid)) 86 { 87 int.TryParse(Dynamicweb.Context.Current?.Request?.Params?["PageID"], out int pageid); 88 if (pageid == 0) 89 { 90 int.TryParse(Dynamicweb.Context.Current?.Request?.Params?["ID"], out pageid); 91 } 92 if (pageid == 0) 93 { 94 pageid = Dynamicweb.Frontend.PageView.Current()?.ID ?? 1; 95 } 96 97 areaid = Dynamicweb.Services.Pages.GetPage(pageid == 0 ? 1 : pageid)?.AreaId ?? 0; 98 } 99 100 //int areaid = 1; 101 102 string BackgroundColor = _data.BackgroundColor?.GetColorCode(areaid) ?? ""; 103 string BackgroundImage = !string.IsNullOrWhiteSpace(_data.BackgroundImage) ? _data.BackgroundImage : ""; 104 string Header = _data.Header().HeaderFormatted("AdvancedGrid__header"); 105 string SubHeader = _data.SubHeader().HeaderFormatted("AdvancedGrid__subheader"); 106 //string BackgroundColor = !string.IsNullOrWhiteSpace(_data.BackgroundColor) ? _data.BackgroundColor : ""; 107 108 int RowCounter = 0; 109 110 stylesheet.AppendLine(".AdvancedGrid__container--" + _data.Id + "{"); 111 stylesheet.AppendLine("--BackgroundColor: " + BackgroundColor + ";"); 112 if (!string.IsNullOrWhiteSpace(BackgroundImage)) 113 { 114 stylesheet.AppendLine("--BackgroundImage: url('" + BackgroundImage + "');"); 115 } 116 stylesheet.AppendLine("}"); 117 118 if (!string.IsNullOrWhiteSpace(Header) || !string.IsNullOrWhiteSpace(SubHeader)) 119 { 120 121 template.AppendLine("<header class='AdvancedGrid__header-container'>"); 122 123 if (!string.IsNullOrWhiteSpace(Header)) { template.AppendLine(Header); } 124 if (!string.IsNullOrWhiteSpace(SubHeader)) { template.AppendLine(SubHeader); } 125 126 template.AppendLine("</header>"); 127 } 128 129 template.AppendLine("<article class='AdvancedGrid__container AdvancedGrid__container--" + _data.Id + "'>"); 130 131 foreach (ColumnConfigurationItem ColumnConfiguration in _data.ColumnConfiguration()) 132 { 133 134 string columnBackgroundColor = ColumnConfiguration.ColumnBackgroundColor?.GetColorCode(Pageview.AreaID) ?? "transparent"; 135 string columnFlexGrow = ColumnConfiguration.ColumnFlexGrow.ToString(); 136 string columnFlexBasis = ColumnConfiguration.ColumnFlexBasis.ToString(); 137 string columnFlexSchrink = ColumnConfiguration.ColumnFlexSchrink.ToString(); 138 string columnClass = ColumnConfiguration.CssClass?.ToString() ?? ""; 139 140 string columnPadding = ColumnConfiguration.ColumnPadding?.ToString() ?? ""; 141 142 string columnWidth = ColumnConfiguration.ColumnWidth == 0 ? "none" : ColumnConfiguration.ColumnWidth + "px;"; 143 string columnWidthClass = ColumnConfiguration.ColumnWidth != 0 ? ColumnConfiguration.ColumnWidthMinMax + "-width : " + ColumnConfiguration.ColumnWidth + "px;" : ""; 144 145 template.AppendLine("<section class='AdvancedGrid__column AdvancedGrid__column--" + ColumnConfiguration.Id + " " + columnClass + "' style='padding: var(--Padding);'>"); 146 147 stylesheet.AppendLine(".AdvancedGrid__column--" + ColumnConfiguration.Id + "{"); 148 stylesheet.AppendLine("--BackgroundColor: " + columnBackgroundColor + ";"); 149 stylesheet.AppendLine("--FlexGrow: " + columnFlexGrow + ";"); 150 stylesheet.AppendLine("--FlexBasis: " + columnFlexBasis + ";"); 151 stylesheet.AppendLine("--FlexSchrink: " + columnFlexSchrink + ";"); 152 stylesheet.AppendLine("--Width: " + columnWidth + ";"); 153 stylesheet.AppendLine("--Padding: " + columnPadding + ";"); 154 stylesheet.AppendLine(columnWidthClass); 155 stylesheet.AppendLine("}"); 156 157 foreach (RowConfigurationItem RowConfiguration in ColumnConfiguration.RowConfiguration()) 158 { 159 string rowBackgroundColor = RowConfiguration.BackgroundColor?.GetColorCode(areaid) ?? "transparent"; 160 string rowHeightClass = RowConfiguration.Height != 0 ? RowConfiguration.HeightMinMax + "-height : " + RowConfiguration.Height + "px;" : ""; 161 string rowClass = RowConfiguration.CssClass?.ToString() ?? ""; 162 // Dictionary<string, string> RowElementAlignment = GetContentAlignMent(RowConfiguration.ContentAlignment); 163 164 RowCounter++; 165 166 template.AppendLine($"<div class='AdvancedGrid__row AdvancedGrid__row--{RowConfiguration.Id} {rowClass}'>{Model.Column(RowCounter).Output()}</div>"); 167 168 stylesheet.AppendLine(".AdvancedGrid__row--" + RowConfiguration.Id + "{"); 169 stylesheet.AppendLine("--BackgroundColor: " + rowBackgroundColor + ";"); 170 // stylesheet.AppendLine("--VerticalAlign: " + RowElementAlignment["VerticalAlign"] + ";"); 171 // stylesheet.AppendLine("--HorinzontalAlign: " + RowElementAlignment["HorizontalAlign"] + ";"); 172 stylesheet.AppendLine(rowHeightClass); 173 stylesheet.AppendLine("}"); 174 } 175 176 template.AppendLine("</section>"); 177 178 } 179 180 template.AppendLine("</article>"); 181 182 } 183 184 <section class="AdvancedGrid AdvancedGrid--@rowID @_data.CssClass" style="--Height: @height;"> 185 186 @template.ToString() 187 <!--// Generate Buttons //--> 188 189 @if (!string.IsNullOrWhiteSpace(_data.Button().GetLink(Pageview)) && !string.IsNullOrWhiteSpace(_data.Button().ButtonText)) 190 { 191 <section class="AdvancedGrid__navigation"> 192 <nav class="cta-paragraph__btn-navigation"> 193 @RenderButton(_data.Button(), Pageview) 194 @RenderButton(_data.ExtraButton(), Pageview) 195 </nav> 196 </section> 197 } 198 199 <style> 200 @stylesheet.ToString() 201 </style> 202 203 <style> 204 .AdvancedGrid--@rowID .AdvancedGrid__row { 205 206 --VerticalAlign: @GridAlignment["VerticalAlign"]; 207 --HorinzontalAlign: @GridAlignment["HorizontalAlign"]; 208 209 align-items: var(--VerticalAlign); 210 justify-content: var(--HorinzontalAlign); 211 212 } 213 214 .AdvancedGrid__container--@rowID{ 215 --BackgroundImage: url('@_data.BackgroundImage'); 216 --BackgroundColor: @_data.BackgroundColor?.GetColorCode(Pageview.AreaID); 217 } 218 219 .AdvancedGrid__column { 220 background-color: var(--BackgroundColor); 221 222 flex-grow: var(--FlexGrow); 223 flex-basis: var(--FlexBasis); 224 flex-shrink: var(--FlexSchrink); 225 226 width: var(--Width); 227 padding: var(--Padding); 228 } 229 230 .AdvancedGrid__container--{ 231 background-color: transparent; 232 background-image: none; 233 } 234 235 </style> 236 237 </section> 238
To Top