# Schedule a week of posts

> Turn finished generations into a scheduled week across connected accounts, with per-platform overrides and comment-to-DM armed before publish.

Source: https://advibly.com/docs/use-cases/schedule-a-campaign



Publishing is where an agent quietly does damage: a post going out now instead
of Tuesday, or landing on the wrong account. Two habits prevent both. Resolve
the targets explicitly, and schedule rather than publish while the user is
still reviewing.

## Resolve the targets [#resolve-the-targets]

```
advibly_social_list_accounts {
  brand_id,
  context: "Listing the brand's connected social accounts before scheduling the approved campaign posts to the right profiles."
}
  → accounts[]: profile_id, platform, handle, status, placements
```

Target `profile_ids` explicitly. Omitting both `profile_ids` and
`target_platforms` publishes to **every** connected account on the brand,
which is rarely what a week's plan means.

<Callout type="warn">
  If the brand holds several accounts per network, they are grouped into
  **account sets**, and one post cannot span two sets. Send a separate post per
  set. Naming a platform instead of `profile_ids` targets the primary set only.
</Callout>

## Attach media by generation id [#attach-media-by-generation-id]

```
advibly_social_create_post {
  brand_id,
  caption: "Three weeks, no pilling. Our serum, now in the 50ml size.",
  generation_ids: [imageGenerationId],
  profile_ids: [instagramProfileId, tiktokProfileId],
  scheduled_at: "2026-10-01T09:00:00Z",
  context: "Scheduling the approved campaign image and caption on the selected profiles at the user's requested publishing time."
}
  → post_id, status, postproxy_post_id
```

`generation_ids` resolves the Advibly media automatically, which is more
reliable than pasting URLs. `media_urls` exists for anything that did not come
from Advibly.

Scheduling mode is decided by which arguments you send:

| Arguments                          | What happens                                   |
| ---------------------------------- | ---------------------------------------------- |
| Neither `scheduled_at` nor `queue` | Publishes **now**.                             |
| `scheduled_at` (ISO 8601)          | Scheduled for that instant.                    |
| `queue: true`                      | Dropped into the brand's queue, slot assigned. |
| `draft: true`                      | Saved, not published.                          |

While the user is still approving copy, `draft: true` or a `scheduled_at`
well in the future are both safe. Publishing now is not reversible by
deleting the post.

## Per-platform overrides [#per-platform-overrides]

One call covers the week's cross-posting; `platform_configurations` handles
where the networks disagree.

```
platform_configurations: {
  youtube:   { title: "Three weeks, no pilling", privacy_status: "public" },
  instagram: { caption: "...", format: "reel" },
  linkedin:  { organization_id: "<id>" },
  facebook:  { page_id: "<id>" }
}
```

| Network  | The rule that bites                                                                                                                                                       |
| -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Facebook | **Always** needs `page_id`. It cannot post to a personal profile.                                                                                                         |
| LinkedIn | A company page needs `organization_id`. Without it the post goes to the personal profile.                                                                                 |
| YouTube  | A custom `cover_url` is invalid on Shorts and is dropped automatically for vertical clips of three minutes or less. Long-form keeps it, and the channel must be verified. |

Both ids come from the `placements` on `advibly_social_list_accounts`.

## Arm comment-to-DM in the same call [#arm-comment-to-dm-in-the-same-call]

A trigger is keyed by the post id, which exists from the moment of scheduling.
So arming a scheduled post makes the automation live the minute it publishes,
and there is no window where the caption asks for a comment nothing answers.

```
advibly_social_create_post {
  brand_id,
  caption: "Comment GUIDE and I'll DM you the full routine 👇",
  generation_ids: [...],
  scheduled_at: "2026-10-01T09:00:00Z",
  dm_automation: {
    keyword: "GUIDE",
    thing: "morning routine guide",
    link: "https://example.com/guide",
    link_title: "Get the guide",
    flow: "guide-drop"
  },
  context: "Scheduling the campaign post and arming its comment-to-DM automation so the caption's call to action works from publish."
}
```

* `guide-drop` (the default) sends a DM with a button, checks whether the
  person follows the posting account, then delivers the link card.
  `link-drop` puts the link in the first DM with no follow gate.
* `once_per_user` is `per_post` by default; `ever` and `never` are the other
  two.
* Instagram only, and the caption has to tell people to comment the keyword.
  The automation is what delivers the link; the caption is what triggers it.

On a post that already exists, `advibly_social_arm_dm_automation` takes the
same fields plus `post_id`. Drafts have no post id, so `dm_automation` and
`draft: true` together are refused.

## Amend before it goes out [#amend-before-it-goes-out]

```
advibly_social_update_post {
  post_id,
  caption: "...",
  scheduled_at: "2026-10-02T09:00:00Z",
  context: "Applying the user's requested caption and timing change to the scheduled campaign post before it publishes."
}
```

Edits are rejected within roughly five minutes of publish time. Past that
line, delete and recreate.

## Confirm and measure [#confirm-and-measure]

```
advibly_social_get_post {
  post_id,
  context: "Checking the per-platform publishing result of the scheduled campaign post to report status back to the user."
}
```

Publishing is per network, so one post can succeed on Instagram and fail on
TikTok. A failed post can be retried without recreating it.

For the week's results, `advibly_social_list_posts` returns posts with
performance, and `advibly_social_get_profile_stats` returns account-level
numbers.

<Callout>
  A missing or disconnected profile in `advibly_social_list_accounts` means the
  network authorisation lapsed. It has to be reconnected in [Settings →
  Integrations](https://advibly.com/settings?tab=integrations); no MCP call can
  renew it.
</Callout>

## Next [#next]

* Make the week's creative first:
  [Launch campaign image set](/use-cases/launch-campaign-image-set).
* Feed it from long footage:
  [Cut a long video into clips](/use-cases/clip-a-long-video).
