diff --git a/app/styles/courses/purchase-courses-view.sass b/app/styles/courses/purchase-courses-view.sass
index 5cbb7308a..1eda341af 100644
--- a/app/styles/courses/purchase-courses-view.sass
+++ b/app/styles/courses/purchase-courses-view.sass
@@ -3,3 +3,9 @@
   .enrollment-count
     font-size: 30px
     width: 120px
+
+  .not-enrolled
+    line-height: 16px
+
+  .uppercase
+    text-transform: uppercase
diff --git a/app/templates/courses/purchase-courses-view.jade b/app/templates/courses/purchase-courses-view.jade
index 096fd9487..1bb41f789 100644
--- a/app/templates/courses/purchase-courses-view.jade
+++ b/app/templates/courses/purchase-courses-view.jade
@@ -24,13 +24,46 @@ block content
     if view.state === 'error'
       .alert.alert-danger= view.stateMessage
 
+    - var usedEnrollments = view.prepaids.totalRedeemers();
+    - var totalEnrollments = view.prepaids.totalMaxRedeemers();
+    - var remainingEnrollments = totalEnrollments - usedEnrollments;
+    .row
+      .col-md-4
+      .col-md-3
+        strong.uppercase unused paid enrollments
+      .col-md-1
+        strong= remainingEnrollments
+    br
+    .row
+      .col-md-4
+      .col-md-3
+        strong.uppercase students not enrolled
+    .row
+      .col-md-4
+      .col-md-3
+        each classroom in view.classrooms.models
+          if classroom.get('members').length > 0
+            .not-enrolled= classroom.get('name')
+        .not-enrolled Total Across All Classes
+      .col-md-1
+        - var totalNotEnrolled = 0
+        each classroom in view.classrooms.models
+          if classroom.get('members').length > 0 && view.classroomNotEnrolledMap
+            .not-enrolled
+              strong= view.classroomNotEnrolledMap[classroom.id]
+        .not-enrolled
+          strong= view.totalNotEnrolled
+
+    br
+    br
+
     p.text-center
       strong How many additional paid enrollments do you need?
     br
 
     p.text-center
       input#students-input.text-center.enrollment-count(
-        value=view.numberOfStudents
+        value= view.numberOfStudents
         type='number'
       )
     br
diff --git a/app/views/courses/PurchaseCoursesView.coffee b/app/views/courses/PurchaseCoursesView.coffee
index cf22d56e1..3101a553d 100644
--- a/app/views/courses/PurchaseCoursesView.coffee
+++ b/app/views/courses/PurchaseCoursesView.coffee
@@ -1,10 +1,13 @@
 app = require 'core/application'
 AuthModal = require 'views/core/AuthModal'
+Classroom = require 'models/Classroom'
 CocoCollection = require 'collections/CocoCollection'
 Course = require 'models/Course'
+Prepaids = require 'collections/Prepaids'
 RootView = require 'views/core/RootView'
 stripeHandler = require 'core/services/stripe'
 template = require 'templates/courses/purchase-courses-view'
+User = require 'models/User'
 utils = require 'core/utils'
 
 module.exports = class PurchaseCoursesView extends RootView
@@ -12,12 +15,22 @@ module.exports = class PurchaseCoursesView extends RootView
   template: template
   numberOfStudents: 30
   pricePerStudent: 4
-  
+
   initialize: (options) ->
     @listenTo stripeHandler, 'received-token', @onStripeReceivedToken
     @fromClassroom = utils.getQueryVariable('from-classroom')
+    @members = new CocoCollection([], { model: User })
+    @listenTo @members, 'sync', @membersSync
+    @classrooms = new CocoCollection([], { url: "/db/classroom", model: Classroom })
+    @classrooms.comparator = '_id'
+    @listenToOnce @classrooms, 'sync', @onceClassroomsSync
+    @supermodel.loadCollection(@classrooms, 'classrooms', {data: {ownerID: me.id}})
+    @prepaids = new Prepaids()
+    @prepaids.comparator = '_id'
+    @prepaids.fetchByCreator(me.id)
+    @supermodel.loadCollection(@prepaids, 'prepaids')
     super(options)
-  
+
   events:
     'input #students-input': 'onInputStudentsInput'
     'click #purchase-btn': 'onClickPurchaseButton'
@@ -25,6 +38,27 @@ module.exports = class PurchaseCoursesView extends RootView
   getPriceString: -> '$' + (@getPrice()).toFixed(2)
   getPrice: -> @pricePerStudent * @numberOfStudents
 
+  onceClassroomsSync: ->
+    for classroom in @classrooms.models
+      @members.fetch({
+        remove: false
+        url: "/db/classroom/#{classroom.id}/members"
+      })
+
+  membersSync: ->
+    @memberEnrolledMap = {}
+    for user in @members.models
+      @memberEnrolledMap[user.id] = user.get('coursePrepaidID')?
+    @classroomNotEnrolledMap = {}
+    @totalNotEnrolled = 0
+    for classroom in @classrooms.models
+      @classroomNotEnrolledMap[classroom.id] = 0
+      for memberID in classroom.get('members')
+        @classroomNotEnrolledMap[classroom.id]++ unless @memberEnrolledMap[memberID]
+      @totalNotEnrolled += @classroomNotEnrolledMap[classroom.id]
+    @numberOfStudents = @totalNotEnrolled
+    @render?()
+
   onInputStudentsInput: ->
     @numberOfStudents = Math.max(parseInt(@$('#students-input').val()) or 0, 0)
     @updatePrice()
@@ -54,14 +88,14 @@ module.exports = class PurchaseCoursesView extends RootView
   onStripeReceivedToken: (e) ->
     @state = 'purchasing'
     @render?()
-    
+
     data =
       maxRedeemers: @numberOfStudents
       type: 'course'
       stripe:
         token: e.token.id
         timestamp: new Date().getTime()
-      
+
     $.ajax({
       url: '/db/prepaid/-/purchase',
       data: data,
@@ -71,7 +105,7 @@ module.exports = class PurchaseCoursesView extends RootView
         application.tracker?.trackEvent 'Finished course prepaid purchase', {price: @pricePerStudent, seats: @numberOfStudents}
         @state = 'purchased'
         @render?()
-        
+
       error: (jqxhr, textStatus, errorThrown) ->
         application.tracker?.trackEvent 'Failed course prepaid purchase', status: textStatus
         if jqxhr.status is 402
@@ -82,4 +116,3 @@ module.exports = class PurchaseCoursesView extends RootView
           @stateMessage = "#{jqxhr.status}: #{jqxhr.responseText}"
         @render?()
     })
-