# Content Publishing Workflow Guide **Last Updated**: January 20, 2026 **Version**: 1.8.4 **Status**: Production **Audience**: Content Editors, Publishers, Site Administrators --- ## Overview This guide covers the complete content publishing workflow, from content creation through multi-platform publishing (WordPress, Shopify, Custom Sites). The system supports both immediate publishing and scheduled publishing with progress tracking and error recovery. --- ## Publishing Workflow States ### Content Status Flow ``` Draft → Review → Approved → Published ``` - **Draft**: Content is being written/edited - **Review**: Content submitted for review by editors - **Approved**: Content approved and ready for publishing - **Published**: Content successfully published to site ### Site Publishing Status - **not_published**: Content has never been published - **scheduled**: Content scheduled for future publishing - **publishing**: Currently being published (in-progress) - **published**: Successfully published to site - **failed**: Publishing attempt failed (needs retry/reschedule) --- ## 1. Publishing from Approved Page ### Single Content Publishing **Steps:** 1. Navigate to **Writer → Approved** 2. Find the content you want to publish 3. Click the **3-dot menu** on the content row 4. Select **"Publish Now"** 5. Publishing progress modal appears with real-time status: - 📄 Preparing content (0-25%) - 🚀 Uploading to site (25-50%) - ⚙️ Processing response (50-75%) - ✓ Finalizing (75-100%) 6. On success: - Green checkmark displayed - "View on [Site Name]" button available - Content marked as published 7. On failure: - Error message displayed - **Retry** button available - **Close** button to exit **Features:** - Real-time progress tracking - Platform-agnostic (works with WordPress, Shopify, Custom sites) - Automatic error recovery - Direct link to published content - No limit on single item publishing ### Bulk Publishing (Max 5 Items) **Steps:** 1. Navigate to **Writer → Approved** 2. Select 2-5 content items using checkboxes 3. Click **"Publish to Site"** button at top 4. Bulk publishing modal shows queue with individual progress bars 5. Items process sequentially (one at a time) 6. Each item shows: - Progress bar (0-100%) - Current status (Preparing/Uploading/Processing/Finalizing) - Success: Green checkmark + published URL - Failure: Red X + error message + Retry button 7. Summary at bottom: "X completed, Y failed, Z pending" 8. Cannot close modal until all items complete **Publishing Limit:** - **Direct bulk publish**: Maximum 5 items at once - **Reason**: Prevents server overload and API rate limiting - **For more items**: Use "Schedule Selected" instead (no limit) **If you select 6+ items:** ``` ⚠️ Publishing Limit Exceeded Modal appears: - Shows you selected X items (over 5 limit) - Options: 1. Deselect items to publish ≤5 2. Use "Schedule Selected" instead (no limit) - Tip: Scheduling is better for large batches ``` --- ## 2. Scheduling Content ### Manual Scheduling (Single Item) **Steps:** 1. Navigate to **Writer → Approved** 2. Click **3-dot menu** on content row 3. Select **"Schedule"** 4. Schedule Content Modal appears: - **Schedule Date**: Pick date from calendar - **Schedule Time**: Set time (HH:MM AM/PM) - **Preview**: Shows "January 15, 2025 at 9:00 AM" 5. Click **"Schedule"** to confirm 6. Content appears in **Publisher → Content Calendar** 7. Celery task will auto-publish at scheduled time (runs every 5 minutes) **Default Time**: 9:00 AM on selected date ### Bulk Scheduling (Unlimited Items) **Steps:** 1. Navigate to **Writer → Approved** 2. Select any number of items (no limit!) 3. Click **"Schedule Selected"** button 4. Bulk Schedule Preview Modal shows: - Your site's default schedule settings - Start time (e.g., 9:00 AM) - Stagger interval (e.g., 15 minutes between each) - First and last publish times - List of all items with scheduled times 5. Options: - **"Change Settings"**: Opens Site Settings → Publishing tab in new tab - **"Confirm Schedule"**: Applies schedule to all items 6. All items scheduled and appear in calendar **Site Settings Integration:** - Go to **Sites → [Your Site] → Settings → Publishing** tab - Configure: - **Auto-publish Schedule**: Time of day (e.g., 9:00 AM) - **Stagger Interval**: Minutes between each (e.g., 15 min) - **Timezone**: Your site's timezone - **Max Daily Publishes**: Optional limit per day - These defaults apply to bulk scheduling automatically **Example Schedule** (10 items, 9 AM start, 15 min stagger): ``` 1. First Article → Jan 17, 9:00 AM 2. Second Article → Jan 17, 9:15 AM 3. Third Article → Jan 17, 9:30 AM 4. Fourth Article → Jan 17, 9:45 AM 5. Fifth Article → Jan 17, 10:00 AM ... 10. Tenth Article → Jan 17, 11:15 AM ``` ### Scheduling from Content Calendar **Drag-and-Drop Method:** 1. Navigate to **Publisher → Content Calendar** 2. Approved content appears in left sidebar 3. Drag content item to desired date on calendar 4. Item scheduled for 9:00 AM on that date automatically 5. Edit time if needed (see "Editing Schedules" below) --- ## 3. Managing Scheduled Content ### Viewing Scheduled Content **Content Calendar View:** - Navigate to **Publisher → Content Calendar** - Calendar shows all scheduled items by date - Each item displays: - Title (truncated) - Site name - Scheduled time - Status badge (Scheduled/Publishing/Published/Failed) **List View Filter:** - Navigate to **Writer → Approved** - Filter by `site_status = 'scheduled'` - Shows all scheduled items in table format ### Editing Schedules (Rescheduling) **From Calendar View:** 1. Find scheduled item on calendar 2. Click **Pencil icon** (Edit Schedule) on item 3. Schedule Content Modal opens with current date/time pre-filled 4. Change date and/or time 5. Click **"Reschedule"** 6. Item moves to new date/time on calendar **From Approved Page:** 1. Navigate to **Writer → Approved** 2. Click **3-dot menu** on scheduled content 3. Select **"Reschedule"** 4. Change date/time in modal 5. Click **"Reschedule"** **From 3-Dot Menu:** - **Reschedule**: Change to new date/time - **Unschedule**: Cancel schedule, keep as approved - **Publish Now**: Skip schedule, publish immediately ### Unscheduling Content **Steps:** 1. Click **3-dot menu** on scheduled content 2. Select **"Unschedule"** 3. Confirmation modal appears: ``` ⚠️ Unschedule Content? Current schedule: Jan 15, 2025 9:00 AM [Cancel] [Unschedule] ``` 4. Click **"Unschedule"** to confirm 5. Content returns to `not_published` status 6. Stays in Approved page, can be rescheduled or published directly --- ## 4. Handling Failed Publications ### Identifying Failed Content **Visual Indicators:** - ❌ Red "Failed" badge - 🕐 Shows original scheduled time - 📄 Error message (truncated) - 🔄 Retry options available **Where to Find Failed Items:** 1. **Content Calendar**: Separate "Failed Scheduled Publications" section at top 2. **Approved Page**: Filter by `site_status = 'failed'` 3. **Dashboard**: "Failed Publications" widget (if configured) ### Failed Item Display (Calendar) ``` ┌──────────────────────────────────────────────────────┐ │ ❌ Failed Scheduled Publications (2) │ ├──────────────────────────────────────────────────────┤ │ ⚠️ Article Title 1 │ │ Site: My WordPress Blog │ │ Scheduled: Jan 13, 2025 9:00 AM │ │ Error: Publishing API error: Invalid credentials │ │ [Reschedule] [Publish Now] │ └──────────────────────────────────────────────────────┘ ``` ### Viewing Error Details **Steps:** 1. Click **3-dot menu** on failed content 2. Select **"View Error Details"** 3. Error Details Modal shows: - Content title and site name - Original scheduled time - Failure timestamp - Full error message - Actions: Fix Site Settings / Publish Now / Reschedule ### Recovering from Failed Publishing **Option 1: Publish Now** - Click **"Publish Now"** button - Opens Publishing Progress Modal - Attempts immediate republish - On success: Content marked as published, error cleared - On failure: Error message updated, stays as failed **Option 2: Reschedule** - Click **"Reschedule"** button - Opens Schedule Content Modal - Pick new date/time - Content re-queued with status = 'scheduled' - Celery will retry at new scheduled time **Option 3: Fix Site Settings** - Click **"Fix Site Settings"** button - Opens Site Settings → Publishing tab - Check API credentials, domain, platform settings - Return to content and retry ### Common Error Types | Error | Cause | Solution | |-------|-------|----------| | Invalid credentials | API key wrong/expired | Update API key in Site Settings | | 403 Forbidden | Permissions issue | Check user role in site admin | | Network timeout | Site unreachable | Check domain, retry later | | Missing required field | Content incomplete | Edit content, fill required fields | | Rate limit exceeded | Too many requests | Reschedule with longer intervals | | Platform-specific error | WordPress/Shopify API issue | Check error details, consult platform docs | --- ## 5. Publishing to Multiple Platform Types ### Supported Platforms 1. **WordPress Sites** - Uses WordPress REST API - Requires Application Password - Supports posts, pages, custom post types - Categories and tags automatically synced 2. **Shopify Sites** - Uses Shopify Admin API - Requires API key and password - Supports products, blog posts, pages - Collections automatically assigned 3. **Custom Sites** - Uses custom REST API endpoint - Flexible authentication - Configurable field mapping - Platform-agnostic error handling ### Platform Configuration **Go to**: Sites → [Your Site] → Settings **Required Fields:** - **Platform Type**: Select WordPress / Shopify / Custom - **Domain**: Your site URL (e.g., https://mysite.com) - **API Key**: Platform-specific authentication key - **Additional Settings**: Varies by platform **WordPress Example:** ``` Platform Type: WordPress Domain: https://myblog.com API Key: xxxx xxxx xxxx xxxx xxxx xxxx Username: admin ``` **Shopify Example:** ``` Platform Type: Shopify Domain: https://mystore.myshopify.com API Key: shpat_xxxxxxxxxxxx Password: shppa_xxxxxxxxxxxx ``` ### Publishing Behavior by Platform All platforms use the same unified publishing interface: - Same progress modal - Same error handling - Same scheduling system - Platform differences handled automatically in backend --- ## 6. Review Page Workflow (Approval Only) ### Important: No Publishing from Review **Review Page Purpose**: Content approval workflow only **Available Actions:** - ✅ Approve (single or bulk) - ✅ View content - ✅ Edit content - ✅ Delete content - ❌ ~~Publish to Site~~ (removed) **Why?** - Ensures content goes through proper approval workflow - Prevents accidental publishing of unreviewed content - Clear separation: Review → Approve → Publish **Workflow:** ``` 1. Writer creates content (Draft) 2. Writer submits for review (Review) 3. Editor reviews and approves (Approved) 4. Publisher publishes from Approved page (Published) ``` --- ## 7. Best Practices ### When to Publish Immediately - ✅ Time-sensitive content (news, announcements) - ✅ Small batches (1-5 items) - ✅ Testing new content types - ✅ Urgent fixes or updates ### When to Use Scheduling - ✅ Large batches (6+ items) - ✅ Content with planned publish dates - ✅ Avoiding rate limits - ✅ Publishing during optimal times - ✅ Automated publishing workflows - ✅ Content calendar planning ### Scheduling Tips 1. **Use Site Defaults**: Let system handle timing automatically 2. **Stagger Publications**: 15-30 minute intervals reduce load 3. **Check Timezone**: Ensure site timezone matches your expectations 4. **Plan Ahead**: Schedule content days/weeks in advance 5. **Monitor Failures**: Check failed items daily, fix issues promptly 6. **Test First**: Publish 1-2 items manually before bulk scheduling ### Error Prevention 1. **Verify Credentials**: Test site connection before bulk operations 2. **Check Content Quality**: Ensure all required fields filled 3. **Validate Images**: Confirm images uploaded and accessible 4. **Review Platform Requirements**: WordPress categories, Shopify collections, etc. 5. **Monitor Rate Limits**: Don't schedule too many items at once 6. **Backup Content**: Export content before large publishing operations --- ## 8. Troubleshooting ### Problem: Publishing is slow **Solution:** - Check network connection - Verify site is responsive - Use scheduling instead of bulk publish - Check site server performance ### Problem: All items failing with same error **Solution:** - Check Site Settings → API credentials - Verify domain is correct and accessible - Test site connection manually - Check platform API status (WordPress.org, Shopify status page) ### Problem: Items stuck in "publishing" status **Solution:** - Backend may be processing - Wait 5-10 minutes (Celery runs every 5 min) - Check backend logs for errors - Contact system administrator if persists ### Problem: Schedule times are wrong timezone **Solution:** - Go to Site Settings → Publishing - Set correct timezone for your site - Reschedule affected items - Future schedules will use correct timezone ### Problem: Site selector not updating calendar content **Solution:** - Refresh your browser (Ctrl+F5 or Cmd+Shift+R) - This issue was fixed in latest update (Jan 2026) - Calendar now automatically reloads when you change sites - Check browser console for site change logs - If problem persists, clear browser cache **What was fixed:** - Frontend: Fixed useEffect dependency in ContentCalendar.tsx - Backend: Added site_id and site_status to ContentFilter - All API queries now properly filter by selected site ### Problem: Cannot see published content on site **Solution:** - Click "View on [Site Name]" link to verify URL - Check site visibility settings (not private/draft) - Clear site cache if using caching plugin - Verify content published to correct site - Check platform-specific visibility settings ### Problem: Bulk publish limit blocking my workflow **Solution:** - Use "Schedule Selected" instead (no limit) - Set up site default schedule for automation - Or select ≤5 items at a time for immediate publishing --- ## 9. Keyboard Shortcuts | Shortcut | Action | |----------|--------| | `Space` | Select/deselect item in table | | `Shift + Click` | Select range of items | | `Ctrl/Cmd + Click` | Select multiple non-contiguous items | | `Esc` | Close modal (when not publishing) | | `Enter` | Confirm action in modal | --- ## 10. Support and Resources ### Getting Help - **Documentation**: `docs/40-WORKFLOWS/` (this guide) - **API Reference**: `docs/20-API/PUBLISHER.md` - **Developer Docs**: `docs/30-FRONTEND/PUBLISHING-MODALS.md` - **System Status**: Check backend logs at `/admin/system/logs/` ### Contact - **Technical Issues**: Contact system administrator - **Content Questions**: Contact editorial team - **Platform Setup**: Contact site owner/administrator --- **Document Version**: 1.0 **Last Updated**: January 2026 **Status**: Production Ready