Skip to Content
Activity Typesblog_post — SEO Blog Post

blog_post — SEO Blog Post

FieldValue
Type keyblog_post
LabelSEO Blog Post
Agent queueblog-writer
Plan tierFree+ (starter, growth, professional)
Credits/unit2
Monthly range2–8

What it produces

A full SEO-optimised long-form blog post (typically 800–2,000 words). The agent writes to a BlogPost record with title, slug, full body, target keyword, meta title, and meta description.


Pipeline sequence

content_brief (prerequisite) ──→ blog-writer ──→ BlogPost: dm_review [Gate 1: DM Portal] dm-approve ─┼─ dm-reject → re-queued with feedback BlogPost: client_review [Gate 2: Dashboard] approve ───────┼───── reject → re-queued with feedback BlogPost: client_approved [auto-ingest to CMS] BlogPost: published

Status machine

StatusSet byNext
dm_reviewblog-writer worker on completionclient_review or → rejected
client_reviewDM approves (POST /dm/v1/blog/:id/dm-approve)client_approved or → rejected
client_approvedClient approves (POST /client/v1/blog/:id/approve)published (auto)
rejectedDM rejects or client rejectsRe-queues blog-writer with rejection note
publishedAuto-ingest triggered on client_approvedTerminal

Fields: dmRejectionNote, dmApprovedBy, dmApprovedAt, clientRejectionNote, clientApprovedBy, clientApprovedAt, publishedAt, version.


HITL gates

GateLocationWhoAction
Gate 1DM Portal → ApprovalsReviewerApprove (→ client_review) or Reject with note (→ rejected, re-queue)
Gate 2Dashboard → DeliverablesClientApprove (→ client_approved) or Reject (→ rejected, re-queue)

Deliverable status progression

Deliverable statusTrigger
generatingWorker picks up the activity
in_reviewBlogPost created with dm_review
needs_approvalDM approves → client_review
approvedClient approves → client_approved
publishedAuto-ingest completes

Dependencies

  • Requires: content_brief — the planner always schedules 1 content brief per blog post. The brief’s outputPayload is injected into the blog-writer’s input.
  • Optional: keyword_cluster — primary keyword data used by the brief writer and surfaced in the blog writer’s context.
  • Activity.dependsOn is set so the blog-writer job does not start until the linked content_brief activity reaches done.

DB records created

RecordCreated byNotes
DeliverableTemplatedeliverable-plannerMonthly quota (e.g., “4 blog posts”)
Activityactivity-plannerOne per blog post; type = blog_post
Deliverableblog-writer workerClient-facing status record
BlogPostblog-writer workerFull content record with status machine

Auto-ingest

On client_approved, a CMS ingestion job is triggered automatically. The BlogPost moves to published and a PublishedContent record is created linking the post to the tenant’s content history.


Key rules

  • The planner must include 1 content_brief per blog_post. Creating a blog post without a brief is invalid.
  • On rejection (either gate), the blog-writer is re-queued with the rejection note injected as additional context so the next run addresses the feedback.
  • version increments on each re-run after rejection.

© 2026 Leadmetrics — Internal use only