Monthly Plans (SEO)
Lập kế hoạch SEO hàng tháng — canonical tại /dashboard/plans.
Monthly Plans (SEO)
Monthly Plans là planner trung tâm cho SEO: mỗi tháng một Plan với periodStart (YYYY-MM-01), bên trong là các Items liên kết tới pages, keywords, snapshots và jobs.
Plans
/dashboard/plans — list, detail
Legacy
/dashboard/seo/plans → redirect về /dashboard/plans
Profile
Planning profile: markets, segments, budgets
Bạn tìm thấy gì ở đâu
| Trang | Đường dẫn | Mô tả |
|---|---|---|
| Plans (canonical) | /dashboard/plans | List plans (limit 20), tạo bằng Dialog |
| Plan Detail | /dashboard/plans/[id] | Items, goals, readiness, narrative |
| Tạo Plan | Dialog trên /dashboard/plans | /dashboard/plans/new sẽ redirect về list |
| Legacy | /dashboard/seo/plans, /seo/plans/[id], /seo/plans/new | Tất cả redirect về /dashboard/plans — giữ bookmark cũ |
Docs cũ ghi canonical là /dashboard/seo/plans là sai. Sidebar và tenantRoutes đều dùng /dashboard/plans. Hãy luôn dùng /dashboard/plans.
Trạng thái & Loại Item (đúng với code)
| Khái niệm | Giá trị thực tế |
|---|---|
planStatus | draft → approved → archived (3 giá trị, không có active/completed) |
planItemType | new_content, refresh_content, ctr_optimization, internal_links, technical_fix, audit, measurement (7 loại) |
evidenceMode | evidence_backed (cần sourceSnapshot) hoặc brief_only (manual, cần briefOnlyAcknowledged: true) |
executionState | unlinked, queued, in_progress, blocked, done, cancelled, published |
verificationState | not_requested, waiting_for_data, passed, failed, inconclusive |
readinessLevel | ready, limited, blocked (dựa trên GSC/audit/recommendations) |
plannedWeek | 1-5 |
Planning Profile — trước khi tạo Plan
Trước khi generate plan, hệ thống cần Planning Profile (seoPlanningProfile):
targetMarkets,customerSegments,customerPersona,painPoints,desiredOutcomes,selectionCriteriapriorityOfferings,differentiators,competitorDomains/KeywordsmonthlyNewContentCapacity,monthlyRefreshCapacity,monthlyTechnicalCapacity,weeklyReviewCapacitytimezone,locale,industry,businessModel,searchChannels,socialChannels,planningBudgetMin/Max/currencyselectedDocumentIds,selectedMediaIds
Xem/sửa qua getPlanningProfile / updatePlanningProfile (admin). Vào /dashboard/plans hệ thống prefetch settings.getContentStrategyProfile để hiện readiness.
Quy trình Monthly Plan
getReadiness → ready mới generate được. Nếu limited/blocked, bổ sung GSC/scan/recommendations.generateDraft({ siteId, periodStart: '2026-03-01', goals: [{metric, target, unit, targetDate}], allowBriefOnly }) → trả plan draft với items, narrative, goals, capacitySnapshot.updateDraft({ planId, version, goals, excludedItemIds, includedItemIds, dueDates, weekByItemId, ownerUserIds, itemEdits }) — version optimistic.reorderItems({ planId, itemIds }).addManualItem({ planId, title, description, itemType: new_content/refresh_content/technical_fix/measurement, plannedWeek, estimatedEffort, evidenceMode: 'brief_only', briefOnlyAcknowledged: true }).approve({ planId, idempotencyKey }) (admin) → approved.executionState + verificationState + blogJobId/seoActionId để link sang Jobs. recordMonthEndObservation khi hết tháng.Items chi tiết
Mỗi MonthlyPlanItem gồm:
title,description,reasonCodes,plannedWeek,sortOrder,expectedImpact,confidence,estimatedEfforttargetPageId/keywordTargetId/sourceSnapshotId(evidence-backed bắt buộc có ít nhất một)ownerUserId,dueAt,seoActionId,blogJobId,generationRunIdbaseline/baselineObservation/postChangeObservationđể verifyexcluded+excludedReason
Các chức năng khác
| Chức năng | Mô tả |
|---|---|
list({ siteId, limit, offset, cursor }) | List plans, sort periodStart desc |
getById({ planId }) | Chi tiết plan + items |
createRevision({ planId, periodStart }) | Tạo revision cho tháng sau |
generateNextMonthDraft({ siteId, periodStart }) | Tự sinh draft tháng tiếp theo |
getMonthEndReview({ planId }) | Tổng kết planned/active/completed/blocked/cancelled/published/waitingForData |
recordMonthEndObservation({ planItemId, baseline, current, observedAt }) | Ghi quan sát cuối tháng |
getPlanningProfile / updatePlanningProfile | Quản lý profile |
Mọi link tới Monthly Plans phải dùng /dashboard/plans (không phải /dashboard/seo/plans). Sau khi updateDraft/addManualItem/reorderItems, hệ thống invalidate seoPlans.list và getById.