Content & editorial
Content Scheduling
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 price | free (core) |
| Rival anchor | Shopify: $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.