<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="https://www.proworks.com/blog/rss/xslt"?>
<rss xmlns:a10="http://www.w3.org/2005/Atom" version="2.0">
  <channel>
    <title>ProWorks Web Design, Development, and Umbraco Blog</title>
    <link>https://www.proworks.com/blog/</link>
    <description>ProWorks</description>
    <generator>Articulate, blogging built on Umbraco</generator>
    <item>
      <guid isPermaLink="false">4717</guid>
      <link>https://www.proworks.com/blog/archive/what-is-umbraco-training-like-what-will-you-learn/</link>
      <category>umbraco</category>
      <title>What is Umbraco Training like? What will you learn?</title>
      <description>&lt;p&gt;When I first signed up for Umbraco training, I wasn’t sure what to expect. Would it just be a run-through of documentation? A series of demos I’d forget a week later?&lt;/p&gt;
&lt;p&gt;What I found instead was hands-on, practical, and directly tied to the kinds of problems developers actually face. From extending the back-office with custom tools, to structuring clean MVC templates, to integrating external systems and locking things down with security best practices. Each step made me not just know Umbraco better, but use it better.&lt;/p&gt;
&lt;p&gt;If you’ve ever wondered what Umbraco training is really like and what you’ll actually learn, here’s a look at the key lessons that stood out to me on the path to Expert Certification.&amp;nbsp;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 data-start="278" data-end="305"&gt;Extending the Backoffice&lt;/h2&gt;
&lt;p data-start="306" data-end="528"&gt;I already had a basic understanding of the back office and what could be done with it, but in this section I was able to expand that knowledge by working with extensions like Lit, Vite, and TypeScript to achieve even more.&lt;/p&gt;
&lt;p data-start="530" data-end="752"&gt;I’ve always appreciated how clean and editor-friendly the interface is, but creating my own property editors, customizing the UI, and integrating the Umbraco UI Library gave me a whole new appreciation for its flexibility.&lt;/p&gt;
&lt;p data-start="754" data-end="1090"&gt;The challenge? Figuring out how to structure larger back-office extensions so they stay maintainable over time. I had to find the balance between “this is cool” and “this will still make sense six months from now.” My lightbulb moment was realizing how much you can streamline content workflows with just a few well-placed custom tools.&lt;/p&gt;
&lt;p data-start="1092" data-end="1272"&gt;&lt;strong data-start="1092" data-end="1110"&gt;Quick example:&lt;/strong&gt; a small Lit-based property editor for an “Alert banner” (toggle + text + theme) that editors can reuse anywhere, instead of hand-coding alerts in multiple views.&lt;/p&gt;
&lt;p data-start="1274" data-end="1297"&gt;&lt;strong data-start="1274" data-end="1297"&gt;When to choose what&lt;/strong&gt;&lt;/p&gt;
&lt;ul data-start="1298" data-end="1641"&gt;
&lt;li data-start="1298" data-end="1409"&gt;
&lt;p data-start="1300" data-end="1409"&gt;&lt;strong data-start="1300" data-end="1327"&gt;Custom property editor:&lt;/strong&gt; when editors repeat the same pattern across pages and need a single, reusable UI.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-start="1410" data-end="1532"&gt;
&lt;p data-start="1412" data-end="1532"&gt;&lt;strong data-start="1412" data-end="1472"&gt;Compose built-ins (e.g., Textbox/Dropdown/Media Picker):&lt;/strong&gt; when requirements are simple and you want zero custom code.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-start="1533" data-end="1641"&gt;
&lt;p data-start="1535" data-end="1641"&gt;&lt;strong data-start="1535" data-end="1565"&gt;Dashboard/panel extension:&lt;/strong&gt; when the tool spans multiple doctypes (e.g., content audits, bulk actions).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-start="1643" data-end="1657"&gt;&lt;strong data-start="1643" data-end="1657"&gt;Trade-offs&lt;/strong&gt;&lt;/p&gt;
&lt;ul data-start="1658" data-end="1801"&gt;
&lt;li data-start="1658" data-end="1723"&gt;
&lt;p data-start="1660" data-end="1723"&gt;More power = more maintenance (bundle size, upgrades, testing).&lt;/p&gt;
&lt;/li&gt;
&lt;li data-start="1724" data-end="1801"&gt;
&lt;p data-start="1726" data-end="1801"&gt;Document your folder structure and naming early; future you will thank you.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-start="1803" data-end="1806"&gt;
&lt;h2 data-start="1808" data-end="1826"&gt;Umbraco and MVC&lt;/h2&gt;
&lt;p data-start="1827" data-end="1998"&gt;I’ve worked with MVC before, so this part felt familiar, but doing it in Umbraco with strongly typed models and clean controllers made me look at consistency in a new way.&lt;/p&gt;
&lt;p data-start="2000" data-end="2289"&gt;What stood out to me was having so much control over rendering while still keeping things easy for editors. The tricky part was keeping templates flexible without overcomplicating them. Once I found that balance, it was really satisfying to see how clean and reusable the setup turned out.&lt;/p&gt;
&lt;p data-start="2291" data-end="2435"&gt;&lt;strong data-start="2291" data-end="2309"&gt;Quick example:&lt;/strong&gt; moving repeatable UI into a View Component and passing a typed model trimmed the Razor views and kept logic out of templates.&lt;/p&gt;
&lt;p data-start="2437" data-end="2460"&gt;&lt;strong data-start="2437" data-end="2460"&gt;When to choose what&lt;/strong&gt;&lt;/p&gt;
&lt;ul data-start="2461" data-end="2710"&gt;
&lt;li data-start="2461" data-end="2550"&gt;
&lt;p data-start="2463" data-end="2550"&gt;&lt;strong data-start="2463" data-end="2508"&gt;RenderController + strongly typed models:&lt;/strong&gt; page rendering with editor-owned content.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-start="2551" data-end="2642"&gt;
&lt;p data-start="2553" data-end="2642"&gt;&lt;strong data-start="2553" data-end="2575"&gt;SurfaceController:&lt;/strong&gt; form posts or actions initiated from views (validation, feedback).&lt;/p&gt;
&lt;/li&gt;
&lt;li data-start="2643" data-end="2710"&gt;
&lt;p data-start="2645" data-end="2710"&gt;&lt;strong data-start="2645" data-end="2664"&gt;API Controller:&lt;/strong&gt; JSON endpoints for front-end apps/components.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-start="2712" data-end="2726"&gt;&lt;strong data-start="2712" data-end="2726"&gt;Trade-offs&lt;/strong&gt;&lt;/p&gt;
&lt;ul data-start="2727" data-end="2894"&gt;
&lt;li data-start="2727" data-end="2824"&gt;
&lt;p data-start="2729" data-end="2824"&gt;Too many partials/components can fragment the mental model; group by feature, not by file type.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-start="2825" data-end="2894"&gt;
&lt;p data-start="2827" data-end="2894"&gt;Keep view models lean; map once in the controller, not in the view.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-start="2896" data-end="2899"&gt;
&lt;h2 data-start="2901" data-end="2927"&gt;Application Integration&lt;/h2&gt;
&lt;p data-start="2928" data-end="3206"&gt;This part was really exciting because it showed how Umbraco can connect with other systems instead of just standing alone. I got hands-on with things like Algolia, HubSpot Forms, and Shopify, and it made me realize how easily Umbraco can become the main hub for almost anything.&lt;/p&gt;
&lt;p data-start="3208" data-end="3438"&gt;The coolest moment was seeing Umbraco data show up in another service in real time. The hardest part was deciding how much data to actually send, it’s not just about connecting everything, it’s about knowing where to draw the line.&lt;/p&gt;
&lt;p data-start="3440" data-end="3458"&gt;&lt;strong data-start="3440" data-end="3458"&gt;Quick examples&lt;/strong&gt;&lt;/p&gt;
&lt;ul data-start="3459" data-end="3763"&gt;
&lt;li data-start="3459" data-end="3563"&gt;
&lt;p data-start="3461" data-end="3563"&gt;&lt;strong data-start="3461" data-end="3473"&gt;Algolia:&lt;/strong&gt; as-you-type results and typo tolerance (e.g., “Hary Poter” still returns &lt;em data-start="3547" data-end="3561"&gt;Harry Potter&lt;/em&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li data-start="3564" data-end="3681"&gt;
&lt;p data-start="3566" data-end="3681"&gt;&lt;strong data-start="3566" data-end="3584"&gt;HubSpot Forms:&lt;/strong&gt; a dropped-in form creates/updates a contact, triggers a welcome email, and assigns a sales task.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-start="3682" data-end="3763"&gt;
&lt;p data-start="3684" data-end="3763"&gt;&lt;strong data-start="3684" data-end="3696"&gt;Shopify:&lt;/strong&gt; pulling product data into content pages without duplicating truth.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-start="3765" data-end="3788"&gt;&lt;strong data-start="3765" data-end="3788"&gt;When to choose what&lt;/strong&gt;&lt;/p&gt;
&lt;ul data-start="3789" data-end="4102"&gt;
&lt;li data-start="3789" data-end="3875"&gt;
&lt;p data-start="3791" data-end="3875"&gt;&lt;strong data-start="3791" data-end="3815"&gt;Stay inside Umbraco:&lt;/strong&gt; simple needs, low traffic, no external automation required.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-start="3876" data-end="4000"&gt;
&lt;p data-start="3878" data-end="4000"&gt;&lt;strong data-start="3878" data-end="3917"&gt;Use SaaS (Algolia/HubSpot/Shopify):&lt;/strong&gt; when you need instant search, marketing automation, analytics, or robust commerce.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-start="4001" data-end="4102"&gt;
&lt;p data-start="4003" data-end="4102"&gt;&lt;strong data-start="4003" data-end="4014"&gt;Hybrid:&lt;/strong&gt; store canonical content in Umbraco, push essentials out via webhooks or scheduled jobs.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-start="4104" data-end="4118"&gt;&lt;strong data-start="4104" data-end="4118"&gt;Trade-offs&lt;/strong&gt;&lt;/p&gt;
&lt;ul data-start="4119" data-end="4291"&gt;
&lt;li data-start="4119" data-end="4173"&gt;
&lt;p data-start="4121" data-end="4173"&gt;External dependencies (uptime, APIs, pricing tiers).&lt;/p&gt;
&lt;/li&gt;
&lt;li data-start="4174" data-end="4224"&gt;
&lt;p data-start="4176" data-end="4224"&gt;Privacy/compliance and field mapping discipline.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-start="4225" data-end="4291"&gt;
&lt;p data-start="4227" data-end="4291"&gt;Extra scripts/assets, watch page weight and defer where possible.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-start="4293" data-end="4296"&gt;
&lt;h2 data-start="4298" data-end="4309"&gt;Security&lt;/h2&gt;
&lt;p data-start="4310" data-end="4655"&gt;Security has always felt a little overwhelming, but breaking it into smaller steps made it much more approachable. I learned how HTTPS, TLS, and certificates build the foundation for secure communication, and how easy it can be for threats like man-in-the-middle attacks or cookie misuse to expose vulnerabilities if protections aren’t in place.&lt;/p&gt;
&lt;p data-start="4657" data-end="5175"&gt;Along the way, I configured HTTPS enforcement, explored security headers like HSTS, and dove deeper into protections against clickjacking, MIME sniffing, and different types of XSS. One of the biggest takeaways was implementing Content Security Policy (CSP) and Subresource Integrity (SRI). While working with multiple headers and CSP rules without breaking the site was challenging, it taught me that security isn’t just about turning on defenses, it’s about testing and adjusting to make sure everything works safely.&lt;/p&gt;
&lt;p data-start="5177" data-end="5454"&gt;I also practiced hiding the Umbraco login page, setting up two-factor authentication, and applying least privilege with custom user groups. Each of these reinforced the idea that security is layered, no single step is enough, but together they make a site much harder to breach.&lt;/p&gt;
&lt;p data-start="5456" data-end="5659"&gt;&lt;strong data-start="5456" data-end="5474"&gt;Quick example:&lt;/strong&gt; starting with a conservative CSP (&lt;code data-start="5509" data-end="5529"&gt;default-src 'self'&lt;/code&gt;) and then explicitly allowing only the domains needed for images, scripts (with nonces), and fonts; adding SRI to any CDN assets.&lt;/p&gt;
&lt;p data-start="5661" data-end="5684"&gt;&lt;strong data-start="5661" data-end="5684"&gt;When to choose what&lt;/strong&gt;&lt;/p&gt;
&lt;ul data-start="5685" data-end="5907"&gt;
&lt;li data-start="5685" data-end="5759"&gt;
&lt;p data-start="5687" data-end="5759"&gt;&lt;strong data-start="5687" data-end="5715"&gt;HSTS + HTTPS Everywhere:&lt;/strong&gt; always; enable preload once you’re certain.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-start="5760" data-end="5844"&gt;
&lt;p data-start="5762" data-end="5844"&gt;&lt;strong data-start="5762" data-end="5811"&gt;&lt;code data-start="5764" data-end="5781"&gt;frame-ancestors&lt;/code&gt; (CSP) vs &lt;code data-start="5791" data-end="5808"&gt;X-Frame-Options&lt;/code&gt;:&lt;/strong&gt; prefer CSP; keep XFO for legacy.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-start="5845" data-end="5907"&gt;
&lt;p data-start="5847" data-end="5907"&gt;&lt;strong data-start="5847" data-end="5873"&gt;Report-Only CSP first:&lt;/strong&gt; collect violations, then enforce.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-start="5909" data-end="5923"&gt;&lt;strong data-start="5909" data-end="5923"&gt;Trade-offs&lt;/strong&gt;&lt;/p&gt;
&lt;ul data-start="5924" data-end="6125"&gt;
&lt;li data-start="5924" data-end="5973"&gt;
&lt;p data-start="5926" data-end="5973"&gt;CSP maintenance grows with third-party scripts.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-start="5974" data-end="6062"&gt;
&lt;p data-start="5976" data-end="6062"&gt;Over-strict rules can break features, iterate in Report-Only and add integration tests.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-start="6063" data-end="6125"&gt;
&lt;p data-start="6065" data-end="6125"&gt;Usability vs. friction (e.g., 2FA) needs stakeholder buy-in.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 data-start="1136" data-end="1455"&gt;Final Thoughts&lt;/h2&gt;
&lt;p data-start="1136" data-end="1455"&gt;By the end of training, I realized it wasn’t about memorizing features; it was about learning how to think with Umbraco. How to balance flexibility with maintainability. How to give editors more power without overwhelming them. How to connect Umbraco with the wider ecosystem while keeping security front and center.&lt;/p&gt;
&lt;p data-start="1457" data-end="1643"&gt;For me, the biggest takeaway was confidence: knowing that I can approach complex projects with a toolkit of patterns, integrations, and safeguards that actually work in the real world.&lt;/p&gt;
&lt;p data-start="1645" data-end="1870"&gt;So if you’re considering Umbraco training, my advice is simple: go for it. You’ll walk away with more than just certification: you’ll gain the experience and mindset to build cleaner, stronger, and more flexible solutions.&lt;/p&gt;</description>
      <pubDate>Mon, 06 Oct 2025 16:43:00 Z</pubDate>
      <a10:updated>2025-10-06T16:43:00Z</a10:updated>
    </item>
  </channel>
</rss>