diff --git a/app/controllers/admin/education/programs_controller.rb b/app/controllers/admin/education/programs_controller.rb
index 87a98de74d1aaaf6b5d392c1a208477dadd22c09..ef52df18a37196afe44f7bd304cf782911f3ec1c 100644
--- a/app/controllers/admin/education/programs_controller.rb
+++ b/app/controllers/admin/education/programs_controller.rb
@@ -79,7 +79,7 @@ class Admin::Education::ProgramsController < Admin::Education::ApplicationContro
 
   def program_params
     params.require(:education_program).permit(
-      :name, :slug, :level, :capacity, :ects, :continuing, :description,
+      :name, :slug, :level, :capacity, :ects, :continuing, :description, :published,
       :prerequisites, :objectives, :duration, :registration, :pedagogy,
       :evaluation, :accessibility, :pricing, :contacts, :opportunities, :other,
       :parent_id, school_ids: [], teacher_ids: []
diff --git a/app/models/education/program.rb b/app/models/education/program.rb
index 9aaf187e9eee0e54220c5064bc55bbe285601959..1a504550165153dafa8d97b8b2fac27e951b85bf 100644
--- a/app/models/education/program.rb
+++ b/app/models/education/program.rb
@@ -11,6 +11,7 @@
 #  name          :string
 #  path          :string
 #  position      :integer          default(0)
+#  published     :boolean          default(FALSE)
 #  slug          :string
 #  created_at    :datetime         not null
 #  updated_at    :datetime         not null
@@ -81,6 +82,7 @@ class Education::Program < ApplicationRecord
   after_save :update_children_paths, if: :saved_change_to_path?
   after_save_commit :set_websites_categories, unless: :skip_websites_categories_callback
 
+  scope :published, -> { where(published: true) }
   scope :ordered, -> { order(:position) }
 
   def to_s
diff --git a/app/views/admin/education/programs/_form.html.erb b/app/views/admin/education/programs/_form.html.erb
index 710b7caab2828dfc31c3002fb74d16d32b32b9d3..cad98a94ce61050b304b8bf7d70bdab4518a431c 100644
--- a/app/views/admin/education/programs/_form.html.erb
+++ b/app/views/admin/education/programs/_form.html.erb
@@ -13,6 +13,7 @@
                         class: 'js-slug-input',
                         data: { source: '#education_program_name' }
                       } %>
+          <%= f.input :published %>
           <%= f.input :level, include_blank: false, label_method: -> (p) { I18n.t(p[1], scope: 'enums.education/program.level') } %>
           <%= f.input :capacity %>
           <%= f.input :ects %>
diff --git a/config/locales/communication/en.yml b/config/locales/communication/en.yml
index efc691bcfc697e2f377290414198243b047e56d2..0fc87e398ae24d3789f61051f8d67f72f1c71f21 100644
--- a/config/locales/communication/en.yml
+++ b/config/locales/communication/en.yml
@@ -83,7 +83,7 @@ en:
         description: Description (SEO)
         featured_image: Featured image
         parent: Parent page
-        published: Published ?
+        published: Published?
         slug: Slug
         text: Text
         title: Title
@@ -95,7 +95,7 @@ en:
         description: Description (SEO)
         featured_image: Featured image
         pinned: Pinned?
-        published: Published ?
+        published: Published?
         published_at: Publication date
         slug: Slug
         text: Text
diff --git a/config/locales/education/en.yml b/config/locales/education/en.yml
index 1d8bf68c39cc8a243cf0c75d35f03e3d224bfbbf..eb3f1b12477f09823eedbca297bcf3d10623a27c 100644
--- a/config/locales/education/en.yml
+++ b/config/locales/education/en.yml
@@ -28,6 +28,7 @@ en:
         pedagogy: Méthodes mobilisées
         prerequisites: Prérequis
         pricing: Tarifs
+        published: Published?
         registration: Modalités et délais d’accès
         schools: Schools with this formation
         teachers: Teachers
diff --git a/config/locales/education/fr.yml b/config/locales/education/fr.yml
index 4e29fb32802cdc56a21ce6a5d5a5f9edced1641e..cda0dc8fe472e488414f37b7f90e479a2266e48e 100644
--- a/config/locales/education/fr.yml
+++ b/config/locales/education/fr.yml
@@ -28,6 +28,7 @@ fr:
         pedagogy: Méthodes mobilisées
         prerequisites: Prérequis
         pricing: Tarifs
+        published: Publiée ?
         registration: Modalités et délais d’accès
         schools: Écoles proposant cette formation
         teachers: Enseignants·es
diff --git a/db/migrate/20211217115802_add_published_to_education_programs.rb b/db/migrate/20211217115802_add_published_to_education_programs.rb
new file mode 100644
index 0000000000000000000000000000000000000000..740f1b29b9229f23bb775330a5af368865100d53
--- /dev/null
+++ b/db/migrate/20211217115802_add_published_to_education_programs.rb
@@ -0,0 +1,5 @@
+class AddPublishedToEducationPrograms < ActiveRecord::Migration[6.1]
+  def change
+    add_column :education_programs, :published, :boolean, default: false
+  end
+end
diff --git a/db/schema.rb b/db/schema.rb
index 69304184bb6f69a644bf5513f4b8f59360379f3f..dd5a22ca69755af8f20b262fd5a8f757b22eb6a1 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -10,7 +10,7 @@
 #
 # It's strongly recommended that you check this file into your version control system.
 
-ActiveRecord::Schema.define(version: 2021_12_17_115125) do
+ActiveRecord::Schema.define(version: 2021_12_17_115802) do
 
   # These are extensions that must be enabled in order to support this database
   enable_extension "pgcrypto"
@@ -374,6 +374,7 @@ ActiveRecord::Schema.define(version: 2021_12_17_115125) do
     t.string "slug"
     t.string "path"
     t.text "description"
+    t.boolean "published", default: false
     t.index ["parent_id"], name: "index_education_programs_on_parent_id"
     t.index ["university_id"], name: "index_education_programs_on_university_id"
   end