{"id":76570,"date":"2026-10-29T14:57:58","date_gmt":"2026-10-29T13:57:58","guid":{"rendered":"https:\/\/lumi-systems.io\/?p=76570"},"modified":"2026-10-29T15:48:44","modified_gmt":"2026-10-29T14:48:44","slug":"gitlab-ce-vs-premium-self-managed","status":"publish","type":"post","link":"https:\/\/lumi-systems.io\/en\/gitlab-ce-vs-premium-self-managed\/","title":{"rendered":"GitLab CE vs. Premium: What a Self-Managed Team Actually Gains"},"content":{"rendered":"<style id=\"lumi-article-css\">.lumi-article{--ink:#0f172a;--muted:#64748b;--line:rgba(15,23,42,0.1);--blue:#1a56db;--cyan:#06b6d4;--soft:#f8fafc;}.lumi-article p,.lumi-article ul,.lumi-article ol{font-size:17.5px;line-height:1.65;}.lumi-article p{margin:0 0 1.15em;text-wrap:pretty;}.lumi-article h2{margin:2.2em 0 0.8em;letter-spacing:-0.015em;}.lumi-article h3{margin:1.6em 0 0.5em;letter-spacing:-0.01em;}.lumi-article li{margin:0.35em 0;}.lumi-article li::marker{color:var(--blue);}.lumi-article a{text-underline-offset:2px;}.lumi-article .lumi-takeaways{background:linear-gradient(135deg,#eff6ff 0%,#f8fafc 65%);border:1px solid #bfdbfe;border-radius:18px;padding:22px 26px;margin:0 0 2.2em;max-width:100%;}.lumi-article .lumi-takeaways ul{margin:0;padding:0;list-style:none;display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:6px 28px;}.lumi-article .lumi-takeaways li{position:relative;padding-left:28px;margin:0.35em 0;font-size:16.5px;line-height:1.5;}.lumi-article .lumi-takeaways li::before{content:\"\u2713\";position:absolute;left:0;top:0.02em;color:#15803d;font-weight:800;}.lumi-article .lumi-stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:14px;margin:1.7em 0 2.1em;}.lumi-article .lumi-stat{background:var(--soft);border:1px solid var(--line);border-radius:16px;padding:18px 20px;}.lumi-article .lumi-stat-label{display:block;font-size:11px;font-weight:700;letter-spacing:0.14em;text-transform:uppercase;color:var(--blue);margin-bottom:8px;}.lumi-article .lumi-stat strong{display:block;font-size:32px;line-height:1.05;letter-spacing:-0.025em;color:var(--ink);}.lumi-article .lumi-stat span:last-child{display:block;margin-top:6px;font-size:14px;line-height:1.45;color:var(--muted);}.lumi-article .lumi-callout{border-radius:16px;padding:20px 24px;margin:1.8em 0;border:1px solid transparent;}.lumi-article .lumi-callout p:last-child{margin-bottom:0;}.lumi-article .lumi-callout-title{font-size:12px;font-weight:800;letter-spacing:0.13em;text-transform:uppercase;margin-bottom:0.55em;}.lumi-article .is-info{background:#eff6ff;border-color:#bfdbfe;}.lumi-article .is-info .lumi-callout-title{color:#1d4ed8;}.lumi-article .is-warning{background:#fff7ed;border-color:#fed7aa;}.lumi-article .is-warning .lumi-callout-title{color:#b45309;}.lumi-article .is-success{background:#f0fdf4;border-color:#bbf7d0;}.lumi-article .is-success .lumi-callout-title{color:#15803d;}.lumi-article .is-muted{background:var(--soft);border-color:var(--line);}.lumi-article .is-muted .lumi-callout-title{color:var(--muted);}.lumi-article .lumi-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(320px,1fr));gap:14px;margin:1.7em 0 2em;}.lumi-article .lumi-grid-2{grid-template-columns:repeat(2,minmax(0,1fr));}.lumi-article .lumi-grid-3{grid-template-columns:repeat(3,minmax(0,1fr));}.lumi-article .lumi-card{background:#ffffff;border:1px solid var(--line);border-radius:16px;padding:20px 22px;box-shadow:0 1px 2px rgba(15,23,42,0.04);}.lumi-article .lumi-card h3{margin:0.1em 0 0.45em;font-size:19px;line-height:1.25;}.lumi-article .lumi-card p{margin-bottom:0.55em;font-size:16px;line-height:1.55;}.lumi-article .lumi-card p:last-child{margin-bottom:0;}.lumi-article .lumi-card-num{display:inline-flex;align-items:center;justify-content:center;width:30px;height:30px;border-radius:50%;background:var(--blue);color:#fff;font-size:14px;font-weight:700;margin-bottom:10px;}.lumi-article .lumi-kicker{display:block;font-size:11px;font-weight:700;letter-spacing:0.14em;text-transform:uppercase;color:var(--muted);margin-bottom:4px;}.lumi-article .lumi-panel{border-radius:16px;padding:20px 24px;margin:1.7em 0;background:var(--soft);border:1px solid var(--line);}.lumi-article .lumi-panel h3{margin-top:0;font-size:18px;}.lumi-article .lumi-panel ul{margin-bottom:0;}.lumi-article .lumi-steps{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:12px;margin:1.7em 0 2em;}.lumi-article .lumi-step{background:var(--soft);border:1px solid var(--line);border-top:3px solid var(--blue);border-radius:12px;padding:15px 17px;}.lumi-article .lumi-step .lumi-step-num{display:block;font-size:11px;font-weight:700;letter-spacing:0.12em;text-transform:uppercase;color:var(--blue);margin-bottom:6px;}.lumi-article .lumi-step strong{display:block;font-size:16px;line-height:1.3;margin-bottom:4px;}.lumi-article .lumi-step p{margin:0;font-size:14.5px;line-height:1.5;color:var(--muted);}.lumi-article .lumi-table-scroll{max-width:100%;margin:1.6em 0 2em;}.lumi-article table{width:100%;border-collapse:collapse;font-size:15.5px;line-height:1.5;}.lumi-article thead th{text-align:left;vertical-align:bottom;padding:0 20px 10px 0;font-size:12px;font-weight:700;letter-spacing:0.07em;text-transform:uppercase;color:var(--muted);border-bottom:2px solid var(--ink);white-space:nowrap;}.lumi-article tbody td{text-align:left;vertical-align:top;padding:12px 20px 12px 0;border-bottom:1px solid var(--line);}.lumi-article tbody td:first-child{width:24%;font-weight:600;color:var(--ink);}.lumi-article tbody tr:nth-child(even) td{background:rgba(15,23,42,0.025);}.lumi-article tbody tr:hover td{background:rgba(26,86,219,0.05);}.lumi-article figcaption{text-align:left;font-size:14px;color:var(--muted);}@media (max-width:900px){.lumi-article .lumi-takeaways ul,.lumi-article .lumi-grid-2,.lumi-article .lumi-steps{grid-template-columns:1fr;}.lumi-article .lumi-grid{grid-template-columns:1fr;}.lumi-article table{font-size:14px;}.lumi-article thead th,.lumi-article tbody td{padding-right:14px;}.lumi-article tbody td:first-child{width:auto;}}.lumi-article h2[id],.lumi-article h3[id]{scroll-margin-top:100px;}.lumi-article .lumi-toc{background:#ffffff;border:1px solid var(--line);border-radius:16px;padding:18px 24px;margin:0 0 2.2em;}.lumi-article .lumi-toc-title{margin:0 0 0.7em;font-size:12px;font-weight:800;letter-spacing:0.13em;text-transform:uppercase;color:var(--muted);}.lumi-article .lumi-toc-title span{color:#94a3b8;font-weight:600;}.lumi-article .lumi-toc ol{margin:0;padding-left:1.2em;columns:2;column-gap:40px;font-size:15.5px;line-height:1.45;}.lumi-article .lumi-toc li{margin:0.28em 0;break-inside:avoid;}.lumi-article .lumi-toc a{color:var(--ink);text-decoration:none;}.lumi-article .lumi-toc a:hover{color:var(--blue);text-decoration:underline;}.lumi-article figure a{display:block;cursor:zoom-in;}.lumi-article figure a img{display:block;width:100%;height:auto;}@media (max-width:900px){.lumi-article .lumi-toc ol{columns:1;}}.lumi-article .lumi-cta{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:18px;background:linear-gradient(135deg,#0f172a 0%,#1e3a8a 100%);color:#f8fafc;border-radius:18px;padding:26px 30px;margin:2.4em 0 0;}.lumi-article .lumi-cta h2{color:#ffffff;margin:0 0 0.35em;font-size:24px;letter-spacing:-0.01em;}.lumi-article .lumi-cta p{color:#cbd5e1;margin:0;font-size:16px;line-height:1.5;max-width:760px;}.lumi-article .lumi-cta .lumi-cta-eyebrow{font-size:11px;font-weight:700;letter-spacing:0.14em;text-transform:uppercase;color:#93c5fd;margin-bottom:6px;}.lumi-article .lumi-cta .lumi-cta-link{display:inline-block;background:#ffffff;color:#0f172a;font-weight:700;font-size:16px;padding:12px 22px;border-radius:10px;text-decoration:none;white-space:nowrap;}.lumi-article .lumi-cta .lumi-cta-link:hover{background:#e2e8f0;color:#0f172a;}@media (max-width:900px){.lumi-article .lumi-cta{flex-direction:column;align-items:flex-start;padding:22px 22px;}.lumi-article .lumi-cta h2{font-size:21px;}}.lumi-article details.lumi-toc>summary{cursor:pointer;list-style:none;margin:0;}.lumi-article details.lumi-toc>summary::-webkit-details-marker{display:none;}.lumi-article details.lumi-toc>summary::after{content:\"\u25be\";float:right;color:#94a3b8;font-size:14px;}.lumi-article details.lumi-toc[open]>summary{margin-bottom:0.7em;}.lumi-article details.lumi-toc:not([open]){padding-bottom:18px;}.lumi-article .lumi-cta .lumi-cta-title{color:#ffffff;margin:0 0 0.35em;font-size:24px;line-height:1.25;letter-spacing:-0.01em;}@media (max-width:900px){.lumi-article .lumi-cta .lumi-cta-title{font-size:21px;}}<\/style>\n<div class=\"lumi-article\">\n<details class=\"lumi-toc\" aria-label=\"In this article\">\n<summary class=\"lumi-toc-title\">In this article <span>&middot; 8 min read<\/span><\/summary>\n<ol>\n<li><a href=\"#what-we-run-and-what-ce-really-covers\">What we run, and what CE really covers<\/a><\/li>\n<li><a href=\"#ce-vs-premium-both-self-managed\">CE vs. Premium, both self-managed<\/a><\/li>\n<li><a href=\"#roles-and-permissions-guest-is-the-one-that-matters\">Roles and permissions: Guest is the one that matters<\/a><\/li>\n<li><a href=\"#the-five-premium-features-we-would-switch-on-first\">The five Premium features we would switch on first<\/a><\/li>\n<li><a href=\"#the-upgrade-path-same-server-same-data\">The upgrade path: same server, same data<\/a><\/li>\n<li><a href=\"#license-cost-versus-building-it-yourself\">License cost versus building it yourself<\/a><\/li>\n<li><a href=\"#sources\">Sources<\/a><\/li>\n<\/ol>\n<\/details>\n<h2 id=\"key-takeaways\">Key takeaways<\/h2>\n<div class=\"lumi-takeaways\">\n<ul>\n<li>GitLab CE is not a trial version. Self-managed, it covers issues, boards, milestones, CI\/CD with your own runners, and wikis, for as long as you want.<\/li>\n<li>Premium is not an &quot;update&quot; of CE. It is the same server, the same projects and the same issues with an EE package and a license; the additions are planning across projects, review control and traceability.<\/li>\n<li>The 400 compute minutes and 10 GiB storage in GitLab&#39;s &quot;Free plan&quot; column are GitLab.com namespace quotas. On our own instance they do not exist.<\/li>\n<li>Guest is the role that pays off for stakeholders: plans and issues visible, code not. It still uses a seat.<\/li>\n<li>We would buy Premium for what is expensive to rebuild: approval gates and an audit trail. Views that encode our own process we build ourselves.<\/li>\n<\/ul>\n<\/div>\n<h2 id=\"what-we-run-and-what-ce-really-covers\">What we run, and what CE really covers<\/h2>\n<p>We run GitLab Community Edition 19.5.x on our own server at SPL Tele, without a paid license. The IT team plans its work in it: issues, labels, milestones for sprints, boards for the current state. Code, pipelines, wikis and the container registry sit in the same instance. We are evaluating whether Premium earns a place on that server.<\/p>\n<div class=\"lumi-stats\">\n<div class=\"lumi-stat\"><span class=\"lumi-stat-label\">Running today<\/span><strong>19.5.x<\/strong><span>Community Edition, self-managed on our own server<\/span><\/div>\n<div class=\"lumi-stat\"><span class=\"lumi-stat-label\">License spend<\/span><strong>0<\/strong><span>no paid GitLab license on the instance<\/span><\/div>\n<div class=\"lumi-stat\"><span class=\"lumi-stat-label\">Upgrade<\/span><strong>same server<\/strong><span>EE package plus activation code, no data migration<\/span><\/div>\n<\/div>\n<p>That is not a compromise setup. According to the current documentation, the base sits in the Free tier:<\/p>\n<ul>\n<li><strong>Issues, labels and milestones<\/strong>, including group milestones, are Free.<\/li>\n<li><strong>Issue boards<\/strong> are Free as well: multiple boards per project and a single group board.<\/li>\n<li><strong>Merge request approvals<\/strong> exist in Free, but they are optional and do not stop a merge.<\/li>\n<li><strong>CI\/CD and runners<\/strong> are self-managed from the start. Compute quotas on instance runners are a setting an administrator can enable, not a vendor limit.<\/li>\n<\/ul>\n<p>What CE does not have: epics, iterations, roadmaps, burndown and burnup charts, required approval rules, merge trains, push rules, protected environments, group and project audit event reports, and GitLab Duo. On our instance those API endpoints answer 404, and the documentation places the features in Premium or Ultimate. Two signals, one result.<\/p>\n<h3>The 400-minute limit does not apply to a self-managed team<\/h3>\n<aside class=\"lumi-callout is-warning\">\n<p class=\"lumi-callout-title\">The most common mix-up<\/p>\n<p>GitLab&#8217;s own one-pager sets &ldquo;400 pipeline minutes and 10 GiB storage&rdquo; against &ldquo;10,000 minutes and 500 GiB&rdquo;. Those numbers are <strong>GitLab.com<\/strong> quotas of a SaaS namespace &mdash; not limits of a self-managed installation.<\/p>\n<p>A self-managed installation has no vendor-side compute or storage limit, because the CPU time and the disk belong to the operator. GitLab&#8217;s storage documentation says it directly: a self-managed installation &ldquo;does not have storage limits&rdquo;.<\/p>\n<\/aside>\n<h2 id=\"ce-vs-premium-both-self-managed\">CE vs. Premium, both self-managed<\/h2>\n<div class=\"lumi-table-scroll\" style=\"overflow-x:auto;-webkit-overflow-scrolling:touch;\">\n<table>\n<thead>\n<tr>\n<th>Capability<\/th>\n<th>CE (self-managed)<\/th>\n<th>Premium (self-managed)<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Issues, labels, milestones<\/td>\n<td>Yes, group milestones included<\/td>\n<td>Same<\/td>\n<\/tr>\n<tr>\n<td>Issue boards<\/td>\n<td>Multiple project boards, one group board, no configurable boards or assignee lists<\/td>\n<td>Multiple group boards, configurable boards, assignee, milestone, iteration and status lists, WIP limits, epic swimlanes<\/td>\n<\/tr>\n<tr>\n<td>Planning across projects<\/td>\n<td>Milestones only; no epics, no roadmap, no iterations<\/td>\n<td>Epics at group level, roadmap timeline, iterations with cadence and rollover<\/td>\n<\/tr>\n<tr>\n<td>Reviews and governance<\/td>\n<td>Optional approvals from Developer up; protected branches<\/td>\n<td>Required approval rules, CODEOWNERS rules, group and instance approval settings, merge trains, push rules, protected environments<\/td>\n<\/tr>\n<tr>\n<td>CI\/CD<\/td>\n<td>Pipelines and your own runners, no vendor minute quota by default<\/td>\n<td>Same pipelines, plus merge trains; minute quotas still do not apply to self-managed<\/td>\n<\/tr>\n<tr>\n<td>Security and compliance<\/td>\n<td>Audit events exist, but only successful sign-in events; no group or project event reports<\/td>\n<td>Group and project audit event reports<\/td>\n<\/tr>\n<tr>\n<td>GitLab Duo<\/td>\n<td>Not available<\/td>\n<td>Add-on on top of Premium or Ultimate, consumed through GitLab Credits<\/td>\n<\/tr>\n<tr>\n<td>Support<\/td>\n<td>Community, documentation, forum<\/td>\n<td>Priority support (vendor material, not product documentation)<\/td>\n<\/tr>\n<tr>\n<td>Operations and upgrade<\/td>\n<td>Linux package on your server<\/td>\n<td>Same package, same upgrade path, license added; on expiry some features are locked<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<h2 id=\"roles-and-permissions-guest-is-the-one-that-matters\">Roles and permissions: Guest is the one that matters<\/h2>\n<p>GitLab ships the default roles Guest, Planner, Reporter, Developer, Maintainer and Owner. From Guest to Owner the ladder is cumulative: each role includes most of what the one below allows. Planner is specialized for planning work and does not inherit everything. Minimal Access, a role for limited group visibility, is Premium and Ultimate only.<\/p>\n<p>Guest is the interesting one for a company that runs projects for other departments. The documented scope splits cleanly in two:<\/p>\n<div class=\"lumi-grid lumi-grid-2\">\n<div class=\"lumi-callout is-success\">\n<p class=\"lumi-callout-title\">Guest can<\/p>\n<ul>\n<li>view and comment on issues and epics<\/li>\n<li>view plans, blockers and progress indicators<\/li>\n<li>create and link new work items<\/li>\n<li>see high-level project information such as analytics and incident reports<\/li>\n<\/ul>\n<\/div>\n<div class=\"lumi-callout is-muted\">\n<p class=\"lumi-callout-title\">Guest cannot<\/p>\n<ul>\n<li>view code or access the repository<\/li>\n<li>modify data they did not create<\/li>\n<li>create projects, groups or personal snippets<\/li>\n<\/ul>\n<\/div>\n<\/div>\n<p>The role applies to private and internal projects.<\/p>\n<p>For us that maps to a real gap: PMO and management want to follow a plan and leave a comment, not read the repository. Guest does exactly that, and it keeps the code out of the conversation.<\/p>\n<p>One caveat for budget questions: in Free and Premium a Guest consumes a license seat; only Ultimate exempts it. Guest is therefore cheaper than a Developer seat, but it is not free.<\/p>\n<h2 id=\"the-five-premium-features-we-would-switch-on-first\">The five Premium features we would switch on first<\/h2>\n<div class=\"lumi-grid\">\n<article class=\"lumi-card\"><span class=\"lumi-card-num\">1<\/span><\/p>\n<h3>Epics<\/h3>\n<p>Today our planning stops at project and milestone level. As soon as one initiative touches several projects, we have no parent object and no shared progress. Epics at group level fix that; nested epics are Ultimate-only and we do not need them.<\/p>\n<\/article>\n<article class=\"lumi-card\"><span class=\"lumi-card-num\">2<\/span><\/p>\n<h3>Roadmap<\/h3>\n<p>A timeline over epics and milestones is what management asks for first. Today we assemble that view outside GitLab and then maintain it twice.<\/p>\n<\/article>\n<article class=\"lumi-card\"><span class=\"lumi-card-num\">3<\/span><\/p>\n<h3>Iterations<\/h3>\n<p>Our sprints are milestones. Iterations add a cadence with automatic scheduling and rollover for unfinished issues, plus an iteration report with burndown and burnup per timebox. Cadence and rollover turn sprint bookkeeping into a setting instead of a manual routine.<\/p>\n<\/article>\n<article class=\"lumi-card\"><span class=\"lumi-card-num\">4<\/span><\/p>\n<h3>Required approvals, later merge trains<\/h3>\n<p>Optional approvals are not a gate. Premium adds required approval rules, CODEOWNERS rules, and group or instance-wide settings. Merge trains then protect a busy default branch from two green pipelines that break each other.<\/p>\n<\/article>\n<article class=\"lumi-card\"><span class=\"lumi-card-num\">5<\/span><\/p>\n<h3>Audit events<\/h3>\n<p>In Free, audit events cover successful sign-ins only. Group and project event reports answer what auditors actually ask: who changed a membership or a permission level, and when.<\/p>\n<\/article>\n<\/div>\n<p>What we would not buy first: push rules, protected environments and GitLab Duo. Push rules and protected environments start to pay off once external contributors push regularly and production deploys need an approval gate. Duo is a separate add-on billed through GitLab Credits; we would evaluate it after the planning and governance features prove themselves.<\/p>\n<h2 id=\"the-upgrade-path-same-server-same-data\">The upgrade path: same server, same data<\/h2>\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/lumi-systems.io\/wp-content\/uploads\/2026\/10\/gitlab-upgrade-path.png\" target=\"_blank\" rel=\"noopener\"><img decoding=\"async\" src=\"https:\/\/lumi-systems.io\/wp-content\/uploads\/2026\/10\/gitlab-upgrade-path.png\" alt=\"Diagram: GitLab CE self-managed becomes EE by package, then Premium by license; projects, issues and data stay\" class=\"wp-image-76556\" width=\"2400\" height=\"1200\" loading=\"lazy\" srcset=\"https:\/\/lumi-systems.io\/wp-content\/uploads\/2026\/10\/gitlab-upgrade-path.png 2400w, https:\/\/lumi-systems.io\/wp-content\/uploads\/2026\/10\/gitlab-upgrade-path-300x150.png 300w, https:\/\/lumi-systems.io\/wp-content\/uploads\/2026\/10\/gitlab-upgrade-path-1024x512.png 1024w, https:\/\/lumi-systems.io\/wp-content\/uploads\/2026\/10\/gitlab-upgrade-path-768x384.png 768w, https:\/\/lumi-systems.io\/wp-content\/uploads\/2026\/10\/gitlab-upgrade-path-1536x768.png 1536w, https:\/\/lumi-systems.io\/wp-content\/uploads\/2026\/10\/gitlab-upgrade-path-2048x1024.png 2048w, https:\/\/lumi-systems.io\/wp-content\/uploads\/2026\/10\/gitlab-upgrade-path-18x9.png 18w, https:\/\/lumi-systems.io\/wp-content\/uploads\/2026\/10\/gitlab-upgrade-path-730x365.png 730w\" sizes=\"auto, (max-width: 2400px) 100vw, 2400px\" \/><\/a><figcaption class=\"wp-element-caption\">The upgrade runs on the same server: CE package, EE package, Premium license, unchanged projects and issues<\/figcaption><\/figure>\n<p>The important part first: this is a package change plus a license, not a migration. No new server, no export and import, no project re-creation.<\/p>\n<p>The documented path for a Linux package installation:<\/p>\n<div class=\"lumi-steps\">\n<div class=\"lumi-step\"><span class=\"lumi-step-num\">Step 1<\/span><strong>Back up<\/strong><\/p>\n<p>Snapshot the instance before touching packages.<\/p>\n<\/div>\n<div class=\"lumi-step\"><span class=\"lumi-step-num\">Step 2<\/span><strong>Install gitlab-ee<\/strong><\/p>\n<p>Add the EE repository and install the package. It removes gitlab-ce automatically; same version recommended.<\/p>\n<\/div>\n<div class=\"lumi-step\"><span class=\"lumi-step-num\">Step 3<\/span><strong>Reconfigure<\/strong><\/p>\n<p>Run <code>gitlab-ctl reconfigure<\/code>. Projects, users and pipelines stay in place.<\/p>\n<\/div>\n<div class=\"lumi-step\"><span class=\"lumi-step-num\">Step 4<\/span><strong>Activate the license<\/strong><\/p>\n<p>Paste the 24-character activation code under Admin &rsaquo; Subscription.<\/p>\n<\/div>\n<\/div>\n<p>Projects, issues, merge requests, pipelines and users stay where they are, because the database and the repositories are untouched by the package swap. Until a license is activated, an EE installation runs with Free features only, so the conversion alone changes nothing for users.<\/p>\n<p>Three notes from the documentation. Reverting from EE to CE is possible, but GitLab warns it can cause database problems, so plan the move in one direction. The license is stored in the database and replicated, so one activation covers a scaled setup. When a license expires, some functionality is locked, so renewal belongs in the calendar before the expiry date.<\/p>\n<h2 id=\"license-cost-versus-building-it-yourself\">License cost versus building it yourself<\/h2>\n<p>A Premium license buys primitives that are genuinely expensive to rebuild: a compliance-grade audit log, enforced approval gates, and a planning data model for epics and roadmaps. Rebuilding those on top of CE would mean writing a parallel source of truth and then defending it to an auditor. That is the wrong trade.<\/p>\n<p>But a license does not answer every question our management asks. Premium gives epics and a roadmap; it does not give a capacity plan per person that knows about working time models, holidays and absences, and it does not give a portfolio cockpit that reads our labels and estimates and turns them into a delivery view. Those views encode how SPL Tele works, so we built them ourselves, read-only on top of the CE API.<\/p>\n<p>That is the decision rule we use: buy the primitives that carry governance value and are hard to replicate, build the views that encode your own process.<\/p>\n<aside class=\"lumi-callout is-info\">\n<p class=\"lumi-callout-title\">Our decision rule<\/p>\n<p>Buy the primitives that carry governance value and are hard to replicate &mdash; approval gates, an audit trail, a planning data model. Build the views that encode your own process &mdash; capacity across working-time models, a portfolio cockpit on our labels and estimates.<\/p>\n<\/aside>\n<p>Both builds follow the <a href=\"https:\/\/lumi-systems.io\/alem-application-lifecycle-engineering-model\/\">Application Lifecycle and Engineering Model<\/a> we work by, and we wrote them up separately, including what they do not solve: <a href=\"https:\/\/lumi-systems.io\/sprint-planning-tool-for-gitlab-ce\/\">our sprint planning view for GitLab CE<\/a> and <a href=\"https:\/\/lumi-systems.io\/pm-suite-management-cockpit-gitlab-ce\/\">our PM suite as a management cockpit<\/a>.<\/p>\n<p>We stay on CE until cross-project planning and audit questions cost more than the seats. When they do, the package swap above is a maintenance window, not a project.<\/p>\n<h2 id=\"sources\">Sources<\/h2>\n<p>GitLab features and tiers checked against the current product documentation, retrieved 29 Oct 2026.<\/p>\n<div class=\"lumi-table-scroll\" style=\"overflow-x:auto;-webkit-overflow-scrolling:touch;\">\n<table>\n<thead>\n<tr>\n<th>Topic<\/th>\n<th>Source<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Roles, permissions, Guest and Minimal Access<\/td>\n<td><a href=\"https:\/\/docs.gitlab.com\/user\/permissions\/\" target=\"_blank\" rel=\"noopener\">https:\/\/docs.gitlab.com\/user\/permissions\/<\/a><\/td>\n<\/tr>\n<tr>\n<td>Guest role specifics<\/td>\n<td><a href=\"https:\/\/docs.gitlab.com\/administration\/guest_users\/\" target=\"_blank\" rel=\"noopener\">https:\/\/docs.gitlab.com\/administration\/guest_users\/<\/a><\/td>\n<\/tr>\n<tr>\n<td>Issue boards by tier<\/td>\n<td><a href=\"https:\/\/docs.gitlab.com\/user\/project\/issue_board\/\" target=\"_blank\" rel=\"noopener\">https:\/\/docs.gitlab.com\/user\/project\/issue_board\/<\/a><\/td>\n<\/tr>\n<tr>\n<td>Milestones (Free)<\/td>\n<td><a href=\"https:\/\/docs.gitlab.com\/user\/project\/milestones\/\" target=\"_blank\" rel=\"noopener\">https:\/\/docs.gitlab.com\/user\/project\/milestones\/<\/a><\/td>\n<\/tr>\n<tr>\n<td>Burndown and burnup charts (Premium, Ultimate)<\/td>\n<td><a href=\"https:\/\/docs.gitlab.com\/user\/project\/milestones\/burndown_and_burnup_charts\/\" target=\"_blank\" rel=\"noopener\">https:\/\/docs.gitlab.com\/user\/project\/milestones\/burndown_and_burnup_charts\/<\/a><\/td>\n<\/tr>\n<tr>\n<td>Epics, roadmap, iterations<\/td>\n<td><a href=\"https:\/\/docs.gitlab.com\/user\/group\/epics\/\" target=\"_blank\" rel=\"noopener\">https:\/\/docs.gitlab.com\/user\/group\/epics\/<\/a>, <a href=\"https:\/\/docs.gitlab.com\/user\/group\/roadmap\/\" target=\"_blank\" rel=\"noopener\">https:\/\/docs.gitlab.com\/user\/group\/roadmap\/<\/a>, <a href=\"https:\/\/docs.gitlab.com\/user\/group\/iterations\/\" target=\"_blank\" rel=\"noopener\">https:\/\/docs.gitlab.com\/user\/group\/iterations\/<\/a><\/td>\n<\/tr>\n<tr>\n<td>Merge request approvals and approval rules<\/td>\n<td><a href=\"https:\/\/docs.gitlab.com\/user\/project\/merge_requests\/approvals\/\" target=\"_blank\" rel=\"noopener\">https:\/\/docs.gitlab.com\/user\/project\/merge_requests\/approvals\/<\/a> and <a href=\"https:\/\/docs.gitlab.com\/user\/project\/merge_requests\/approvals\/rules\/\" target=\"_blank\" rel=\"noopener\">https:\/\/docs.gitlab.com\/user\/project\/merge_requests\/approvals\/rules\/<\/a><\/td>\n<\/tr>\n<tr>\n<td>Merge trains<\/td>\n<td><a href=\"https:\/\/docs.gitlab.com\/ci\/pipelines\/merge_trains\/\" target=\"_blank\" rel=\"noopener\">https:\/\/docs.gitlab.com\/ci\/pipelines\/merge_trains\/<\/a><\/td>\n<\/tr>\n<tr>\n<td>Protected environments<\/td>\n<td><a href=\"https:\/\/docs.gitlab.com\/ci\/environments\/protected_environments\/\" target=\"_blank\" rel=\"noopener\">https:\/\/docs.gitlab.com\/ci\/environments\/protected_environments\/<\/a><\/td>\n<\/tr>\n<tr>\n<td>Push rules<\/td>\n<td><a href=\"https:\/\/docs.gitlab.com\/user\/project\/repository\/push_rules\/\" target=\"_blank\" rel=\"noopener\">https:\/\/docs.gitlab.com\/user\/project\/repository\/push_rules\/<\/a><\/td>\n<\/tr>\n<tr>\n<td>Audit events<\/td>\n<td><a href=\"https:\/\/docs.gitlab.com\/user\/compliance\/audit_events\/\" target=\"_blank\" rel=\"noopener\">https:\/\/docs.gitlab.com\/user\/compliance\/audit_events\/<\/a><\/td>\n<\/tr>\n<tr>\n<td>GitLab Duo add-ons<\/td>\n<td><a href=\"https:\/\/docs.gitlab.com\/subscriptions\/subscription-add-ons\/\" target=\"_blank\" rel=\"noopener\">https:\/\/docs.gitlab.com\/subscriptions\/subscription-add-ons\/<\/a><\/td>\n<\/tr>\n<tr>\n<td>CE to EE conversion<\/td>\n<td><a href=\"https:\/\/docs.gitlab.com\/update\/convert_to_ee\/package\/\" target=\"_blank\" rel=\"noopener\">https:\/\/docs.gitlab.com\/update\/convert_to_ee\/package\/<\/a><\/td>\n<\/tr>\n<tr>\n<td>License activation and expiry<\/td>\n<td><a href=\"https:\/\/docs.gitlab.com\/administration\/license\/\" target=\"_blank\" rel=\"noopener\">https:\/\/docs.gitlab.com\/administration\/license\/<\/a><\/td>\n<\/tr>\n<tr>\n<td>Compute minutes and quotas<\/td>\n<td><a href=\"https:\/\/docs.gitlab.com\/ci\/pipelines\/compute_minutes\/\" target=\"_blank\" rel=\"noopener\">https:\/\/docs.gitlab.com\/ci\/pipelines\/compute_minutes\/<\/a><\/td>\n<\/tr>\n<tr>\n<td>Storage quotas (GitLab.com)<\/td>\n<td><a href=\"https:\/\/docs.gitlab.com\/user\/storage_usage_quotas\/\" target=\"_blank\" rel=\"noopener\">https:\/\/docs.gitlab.com\/user\/storage_usage_quotas\/<\/a><\/td>\n<\/tr>\n<tr>\n<td>Priority support (vendor material, not product docs)<\/td>\n<td>GitLab Premium overview, PDF, October 2025<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>Our own setup: SPL Tele runs GitLab CE self-managed for issues and sprint planning in the IT team. Where documentation and observed API behavior differ, we follow the documentation and note the observation.<\/p>\n<aside class=\"lumi-cta\">\n<div>\n<p class=\"lumi-cta-eyebrow\">Lumi-Systems.io<\/p>\n<h2 class=\"lumi-cta-title\">Evaluating GitLab Premium for your own instance?<\/h2>\n<p>We run CE and build the views a license does not cover: capacity planning, portfolio reporting, delivery metrics. If you want a second opinion on the CE-to-Premium decision, talk to us.<\/p>\n<\/div>\n<p><a class=\"lumi-cta-link\" href=\"https:\/\/contact.lumi-systems.io\/\">Talk to us<\/a><br \/>\n<\/aside>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>GitLab CE vs. Premium for self-managed teams: what CE covers, what Premium adds, how the upgrade runs and why SaaS free-plan limits do not apply to your server.<\/p>","protected":false},"author":2,"featured_media":76588,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_kad_post_classname":"","footnotes":""},"categories":[407,343],"tags":[411,408,409,412,410],"class_list":["post-76570","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-gitlab","category-lumi-systems-io","tag-devsecops","tag-gitlab-ce","tag-gitlab-premium","tag-project-management","tag-self-managed"],"_links":{"self":[{"href":"https:\/\/lumi-systems.io\/en\/wp-json\/wp\/v2\/posts\/76570","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/lumi-systems.io\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/lumi-systems.io\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/lumi-systems.io\/en\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/lumi-systems.io\/en\/wp-json\/wp\/v2\/comments?post=76570"}],"version-history":[{"count":13,"href":"https:\/\/lumi-systems.io\/en\/wp-json\/wp\/v2\/posts\/76570\/revisions"}],"predecessor-version":[{"id":76613,"href":"https:\/\/lumi-systems.io\/en\/wp-json\/wp\/v2\/posts\/76570\/revisions\/76613"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/lumi-systems.io\/en\/wp-json\/wp\/v2\/media\/76588"}],"wp:attachment":[{"href":"https:\/\/lumi-systems.io\/en\/wp-json\/wp\/v2\/media?parent=76570"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/lumi-systems.io\/en\/wp-json\/wp\/v2\/categories?post=76570"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/lumi-systems.io\/en\/wp-json\/wp\/v2\/tags?post=76570"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}