       return callback(err) if err
       # Merge fullscreen title with main article title
       article.title = article.hero_section.title if article.hero_section?.type is 'fullscreen'
-      if publishing
-        onPublish article, author, accessToken, sanitizeAndSave(callback)
-      else if not publishing and not article.slugs?.length > 0
-        generateSlugs article, author, sanitizeAndSave(callback)
-      else
-        sanitizeAndSave(callback)(null, article)
+      generateKeywords article, accessToken, input, (err, article) ->
+        if publishing
+          onPublish article, author, accessToken, sanitizeAndSave(callback)
+        else if not publishing and not article.slugs?.length > 0
+          generateSlugs article, author, sanitizeAndSave(callback)
+        else
+          sanitizeAndSave(callback)(null, article)
 
 validate = (input, callback) ->
   whitelisted = _.pick input, _.keys inputSchema

    article.slugs = (article.slugs or []).concat slug
    cb(null, article)

generateKeywords = (article, accessToken, cb) ->
  keywords = []
  callbacks = []
  if article.primary_featured_artist_ids
    for artistId in article.primary_featured_artist_ids
      do (artistId) ->

    full: url: crop(imageSrc, { width: 1200, height: 706 } )
    thumb: url: crop(imageSrc, { width: 900, height: 530 } )
  html = if article.send_body then getTextSections(article) else ''
  sailthru.apiPost 'content',
    url: "#{FORCE_URL}/article/#{_.last(article.slugs)}"
    date: article.published_at
