AstroBaaS

Content & editorial

Content Scheduling

Free — GPL coresize Mplanned, not built

Generated from docs/plan/core/content-scheduling/PLAN.md in the AstroBaaS repository. Nothing described below is implemented — it is the written plan for it.

Content Scheduling allows merchants to set a publish date and time for products, blog posts, and collections, and the system automatically publishes them at the scheduled time. Merchants schedule seasonal content, promotional products, or blog series in advance without manual intervention. This is core GPL functionality: infrastructure, no per-country obligation, honest cron-based implementation.

The problem

Merchants want to publish seasonal content at specific times but must manually remember to hit ‘publish’ or ask developers to do it for them. Without scheduling, they miss publication windows or have to run the shop 24/7 monitoring publish times.

What it does

  • Schedule picker: date + time input in content edit form
  • Status: ‘Draft’, ‘Scheduled’, ‘Published’, ‘Archived’
  • Scheduled list view: show all scheduled content with publish time, countdown timer
  • Publish job: run every minute, find ‘Scheduled’ items with publishedAt <= now, change status to ‘Published’
  • Audit log: scheduled publish event with timestamp and final status (success or error)
  • Email notification: notify staff 1 hour before scheduled publish (optional)
  • Manual publish override: staff can force-publish early or delay scheduled publish
  • Timezone handling: schedule in merchant’s timezone (e.g., 9 AM EST), publish at correct UTC time
  • Batch schedule: select 20 blog posts, set schedule ‘every Monday 8 AM for 20 weeks’, auto-stagger publish times

What it deliberately does NOT do

Each boundary carries its reason. A boundary without a reason gets crossed by the next person who reads this.

  • Recurring publish (every Monday at 8 AM) — scope is one-time schedule only; recurring is separate feature
  • Scheduled unpublish (auto-hide after date) — scope is publish only; archival/unpublish is separate
  • Scheduling across time zones (publish in US, EU, APAC all at 8 AM local time) — scope is single timezone; multi-timezone is storefront responsibility

Data model

Extend core content schema: add publishedAt field (nullable DateTime) and status enum (draft, scheduled, published, archived). No breaking migration if adding optional fields.

API

  • PATCH /api/products/:id — set publishedAt to future date (status auto-set to ‘Scheduled’)
  • GET /api/scheduled-content — list all scheduled items with countdown timers
  • POST /api/scheduled-content/:id/publish-early — force-publish before schedule
  • POST /api/scheduled-content/:id/reschedule — delay or advance publish time

Every route added here must also appear in src/pages/openapi.json.ts — a test fails the build if it does not.

Admin

Content edit form: Publish section shows radio button ‘Publish now’ or ‘Schedule for’ with date+time picker. Timezone selector defaults to merchant’s configured timezone. Scheduled content list view shows items grouped by date (Today, Tomorrow, Next Week), with countdown timer (‘Publishes in 2 hours 15 minutes’). Publish early button per item. Email notification checkbox ‘Notify staff 1 hour before publish’.

The seam — why this is core

Core owns: schedule storage, publish job scheduler, timezone handling, audit log. No paid pack owns this; it’s infrastructure.

Core owns the interface + hand-modelled scheduler; no credential or per-country obligation; scheduling is infrastructure, not a support commitment.

Dependencies

  • core-scheduler (job queue for publish job)
  • core-audit-log (schedule and publish events logged)

Acceptance checks

Each of these must be able to fail. Before claiming this is done, break the code deliberately and watch each one go red.

  • Blog post scheduled for 2025-09-15 08:00 EST shows status ‘Scheduled’, countdown ‘Publishes in 5 days 3 hours’
  • Publish job runs at 13:00 UTC (08:00 EST); scheduled post status changes to ‘Published’ automatically
  • Scheduled unpublish attempts fail with ‘Out of scope: use separate archival feature’
  • Staff clicks ‘Publish early’ on scheduled post; status changes to ‘Published’ immediately without changing schedule
  • Email sent to staff 1 hour before scheduled publish time (12:00 UTC) with post title and link

Risks

Scheduler lag: if server down at publish time, scheduled posts miss window and publish late. Timezone confusion: merchant schedules 8 AM local time, but system interprets as UTC. UTC offset changes due to daylight saving breaks scheduled times. Email notification sent but merchant never reads it; notification feature gives false sense of safety. Audit log missing publish events makes troubleshooting hard.

Commercial context

Suggested pricefree (core)
Rival anchorShopify: $0 (basic scheduling included); Magento: $0 (included)

The anchor is what the nearest equivalent charges on Shopify or Magento today. It is context for a pricing decision, not the decision.


Generated from the commerce plan. See docs/COMMERCE-PLAN.md for the full catalogue and ../../AI-GUIDE.md for how to work on this repository.