> ## Documentation Index
> Fetch the complete documentation index at: https://help.hoopai.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Scheduling social media posts

> Connect all your social profiles and schedule posts weeks or months in advance from a single Social Planner interface in the HoopAI Platform.

export const CourseTracker = ({courseId, lessonId, videoId}) => {
  const [progress, setProgress] = useState({});
  const [expanded, setExpanded] = useState(false);
  useEffect(() => {
    setProgress(loadProgress());
    document.body.setAttribute("data-academy", "true");
    return () => document.body.removeAttribute("data-academy");
  }, []);
  const course = COURSES[courseId];
  if (!course) return null;
  const lessons = course.lessons;
  const currentIndex = lessons.findIndex(l => l.id === lessonId);
  const completedCount = lessons.filter(l => !!progress[courseId + "/" + l.id]).length;
  const percent = lessons.length > 0 ? Math.round(completedCount / lessons.length * 100) : 0;
  const isCurrentDone = !!progress[courseId + "/" + lessonId];
  const prev = currentIndex > 0 ? lessons[currentIndex - 1] : null;
  const next = currentIndex < lessons.length - 1 ? lessons[currentIndex + 1] : null;
  const totalDuration = formatTotalDuration(lessons);
  const handleToggle = () => {
    const key = courseId + "/" + lessonId;
    const updated = {
      ...progress
    };
    if (updated[key]) {
      delete updated[key];
    } else {
      updated[key] = Date.now();
    }
    setProgress(updated);
    persistProgress(updated);
  };
  const lessonPath = lesson => "/academy/" + course.dir + "/" + lesson.id;
  const videoEmbed = videoId ? <div style={{
    position: "relative",
    width: "100%",
    paddingBottom: "56.25%",
    borderRadius: "var(--ds-radius-lg)",
    overflow: "hidden",
    marginBottom: "24px",
    background: "#000"
  }}>
      <iframe src={"https://www.youtube-nocookie.com/embed/" + videoId + "?rel=0"} title="Lesson video" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowFullScreen style={{
    position: "absolute",
    top: 0,
    left: 0,
    width: "100%",
    height: "100%",
    border: "none"
  }} />
    </div> : null;
  const lessonList = lessons.map(lesson => {
    const isActive = lesson.id === lessonId;
    const isDone = !!progress[courseId + "/" + lesson.id];
    const itemStyle = {
      display: "flex",
      alignItems: "center",
      gap: "8px",
      padding: "10px 16px",
      borderTop: "1px solid var(--academy-border-subtle, #f3f4f6)",
      background: isActive ? "var(--academy-active-bg, #f9fafb)" : "transparent",
      textDecoration: "none",
      cursor: isActive ? "default" : "pointer",
      color: "inherit",
      transition: "background 0.15s"
    };
    const titleStyle = {
      flex: 1,
      fontSize: "13px",
      fontWeight: isActive ? 600 : 400,
      color: isActive ? "var(--academy-text, #111827)" : "var(--academy-text-secondary, #6b7280)",
      overflow: "hidden",
      textOverflow: "ellipsis",
      whiteSpace: "nowrap",
      lineHeight: "1.4"
    };
    const durationStyle = {
      fontSize: "12px",
      color: "var(--academy-text-muted, #9ca3af)",
      whiteSpace: "nowrap"
    };
    const inner = <>
        {isDone ? <CheckCircle /> : <VideoIcon />}
        <span style={titleStyle}>{lesson.title}</span>
        <span style={durationStyle}>{lesson.duration}</span>
      </>;
    if (isActive) {
      return <div key={lesson.id} style={itemStyle}>
          {inner}
        </div>;
    }
    return <a key={lesson.id} href={lessonPath(lesson)} style={itemStyle}>
        {inner}
      </a>;
  });
  return <div className="not-prose" id="academy-course-tracker">
      {videoEmbed}
      <div className="academy-tracker" style={{
    fontFamily: "Inter, -apple-system, BlinkMacSystemFont, sans-serif",
    borderRadius: "var(--ds-radius-lg)",
    border: "1px solid var(--academy-border, #e5e7eb)",
    background: "var(--academy-bg, #ffffff)",
    overflow: "hidden",
    marginBottom: "24px"
  }}>
        {}
        <div style={{
    padding: "16px 16px 0"
  }}>
          <h3 style={{
    margin: 0,
    fontSize: "16px",
    fontWeight: 600,
    lineHeight: "1.4",
    color: "var(--academy-text, #111827)"
  }}>
            {course.title}
          </h3>
          <div style={{
    display: "flex",
    gap: "12px",
    marginTop: "8px"
  }}>
            <span style={{
    display: "flex",
    alignItems: "center",
    gap: "5px",
    fontSize: "12px",
    color: "var(--academy-text-secondary, #6b7280)",
    padding: "3px 8px 3px 6px",
    borderRadius: "var(--ds-radius-sm)",
    border: "1px solid var(--academy-border, #e5e7eb)"
  }}>
              <BookIcon /> {lessons.length} lessons
            </span>
            <span style={{
    display: "flex",
    alignItems: "center",
    gap: "5px",
    fontSize: "12px",
    color: "var(--academy-text-secondary, #6b7280)",
    padding: "3px 8px 3px 6px",
    borderRadius: "var(--ds-radius-sm)",
    border: "1px solid var(--academy-border, #e5e7eb)"
  }}>
              <ClockIcon /> Approx. {totalDuration}
            </span>
          </div>
        </div>

        {}
        <div style={{
    padding: "14px 16px 16px"
  }}>
          <div style={{
    display: "flex",
    justifyContent: "space-between",
    fontSize: "12px",
    color: "var(--academy-text-secondary, #6b7280)"
  }}>
            <span>Your progress</span>
            <span style={{
    fontWeight: 500,
    color: "var(--academy-text, #111827)"
  }}>
              {percent}%
            </span>
          </div>
          <div style={{
    height: "6px",
    borderRadius: "var(--ds-radius-full)",
    background: "var(--academy-track, #f3f4f6)",
    marginTop: "8px",
    overflow: "hidden"
  }}>
            <div style={{
    height: "100%",
    borderRadius: "var(--ds-radius-full)",
    background: "var(--academy-progress, #3b82f6)",
    transition: "width 0.5s cubic-bezier(0.4, 0, 0.2, 1)",
    width: percent + "%"
  }} />
          </div>
        </div>

        {}
        <div className="academy-lessons-desktop">{lessonList}</div>

        {}
        <div className="academy-lessons-mobile">
          <button onClick={() => setExpanded(!expanded)} aria-expanded={expanded} style={{
    display: "flex",
    alignItems: "center",
    justifyContent: "space-between",
    padding: "12px 16px",
    cursor: "pointer",
    borderTop: "1px solid var(--academy-border-subtle, #f3f4f6)",
    background: "transparent",
    border: "none",
    borderTopStyle: "solid",
    borderTopWidth: "1px",
    borderTopColor: "var(--academy-border-subtle, #f3f4f6)",
    width: "100%",
    textAlign: "left",
    color: "var(--academy-text-secondary, #6b7280)",
    fontSize: "13px",
    fontWeight: 500,
    fontFamily: "inherit"
  }}>
            <span>
              {expanded ? "Hide lessons" : "Show all " + lessons.length + " lessons"}
            </span>
            <ChevronDown open={expanded} />
          </button>
          {expanded && lessonList}
        </div>

        {}
        <div style={{
    display: "flex",
    alignItems: "center",
    justifyContent: "space-between",
    borderTop: "1px solid var(--academy-border, #e5e7eb)",
    padding: "10px 16px"
  }}>
          {prev ? <a href={lessonPath(prev)} style={{
    fontSize: "13px",
    color: "var(--academy-text-secondary, #6b7280)",
    textDecoration: "none",
    display: "flex",
    alignItems: "center",
    gap: "4px"
  }}>
              ‹ Previous
            </a> : <div />}
          <button onClick={handleToggle} style={{
    fontSize: "13px",
    fontWeight: 500,
    cursor: "pointer",
    padding: "6px 14px",
    borderRadius: "var(--ds-radius-md)",
    border: isCurrentDone ? "1px solid var(--academy-border, #e5e7eb)" : "none",
    background: isCurrentDone ? "var(--academy-bg, #ffffff)" : "var(--academy-btn-bg, #111827)",
    color: isCurrentDone ? "var(--academy-complete, #10b981)" : "var(--academy-btn-text, #ffffff)",
    display: "flex",
    alignItems: "center",
    gap: "6px",
    transition: "all 0.2s",
    lineHeight: "1.4",
    fontFamily: "inherit"
  }}>
            {isCurrentDone ? <>
                <CheckCircle /> Completed
              </> : "Mark as completed"}
          </button>
          {next ? <a href={lessonPath(next)} style={{
    fontSize: "13px",
    color: "var(--academy-text-secondary, #6b7280)",
    textDecoration: "none",
    display: "flex",
    alignItems: "center",
    gap: "4px"
  }}>
              Next ›
            </a> : <div />}
        </div>
      </div>
    </div>;
};

<CourseTracker courseId="media-social-posting" lessonId="scheduling-social-media-posts" />

The average person spends over two hours a day on social media — which means your audience is there every single day, waiting to see content from you. The Social Planner lets you plan, schedule, and publish posts to all your connected profiles from one place. No more logging in and out of multiple platforms or scrambling to post in the moment.

<Frame caption="The Scheduling Social Media Posts lesson in the HoopAI Academy">
  <img src="https://mintcdn.com/hoopai-84ec0cdc/gyU98wGhFXcTdqFf/images/academy-social-planner.png?fit=max&auto=format&n=gyU98wGhFXcTdqFf&q=85&s=4381831686ab5bc0082108f7f83c6dea" alt="Scheduling social media posts article" width="1536" height="826" data-path="images/academy-social-planner.png" />
</Frame>

## Why this matters

Consistency is the most important factor in social media growth. Businesses that post consistently — even if infrequently — outperform those that post sporadically at full volume. The Social Planner lets you batch a month of content in a single session, then set it and forget it. Your presence stays active even on your busiest days.

## How to schedule a social media post

<Steps>
  <Step title="Access the Social Planner">
    Navigate to **Marketing** > **Social Planner**. You will see a calendar view of all your scheduled and published posts.

    <Frame caption="The Social Planner calendar view in the HoopAI Platform Marketing section">
      <img src="https://mintcdn.com/hoopai-84ec0cdc/gyU98wGhFXcTdqFf/images/academy-social-planner.png?fit=max&auto=format&n=gyU98wGhFXcTdqFf&q=85&s=4381831686ab5bc0082108f7f83c6dea" alt="Social Planner calendar view" width="1536" height="826" data-path="images/academy-social-planner.png" />
    </Frame>
  </Step>

  <Step title="Connect your social profiles">
    If you have not yet connected your accounts, go to **Settings** > **Integrations** and connect Facebook, Instagram, Google My Business, LinkedIn, TikTok, or other supported profiles. All connected accounts will be available when composing posts.

    <Frame caption="Connecting social media profiles in the HoopAI Platform Integrations settings">
      <img src="https://mintcdn.com/hoopai-84ec0cdc/gyU98wGhFXcTdqFf/images/academy-onboarding-connect-integrations.png?fit=max&auto=format&n=gyU98wGhFXcTdqFf&q=85&s=438d94999ada2e8819af2eb0ee159b50" alt="Social media integrations settings" width="1536" height="826" data-path="images/academy-onboarding-connect-integrations.png" />
    </Frame>
  </Step>

  <Step title="Create a new post">
    Click the **New Post** button (or click any date on the calendar). The post composer will open.
  </Step>

  <Step title="Select your accounts">
    Choose which social profiles to publish to. You can select a single account or multiple accounts at once. Posting to multiple platforms simultaneously saves significant time for shared content.
  </Step>

  <Step title="Write your content">
    Type your post copy in the text area. You can:

    * Use the **Content AI** button to generate copy automatically
    * Add images or videos from your media library
    * Include hashtags, emojis, and links

    <Tip>
      Use the Content AI button to generate 3-5 variations of your caption, then choose the one that sounds most like your brand. This eliminates writer's block and cuts content creation time dramatically.
    </Tip>
  </Step>

  <Step title="Choose a publishing option">
    Select how to publish:

    * **Post Now:** Publish immediately to all selected accounts
    * **Schedule:** Choose a specific date and time for the post to go live
    * **Save as Draft:** Save for editing and publishing later
    * **Upload via CSV:** Bulk-import multiple scheduled posts from a spreadsheet

    <Frame caption="Social post publishing options — immediate, scheduled, draft, or CSV upload">
      <img src="https://mintcdn.com/hoopai-84ec0cdc/gyU98wGhFXcTdqFf/images/academy-social-planner.png?fit=max&auto=format&n=gyU98wGhFXcTdqFf&q=85&s=4381831686ab5bc0082108f7f83c6dea" alt="Social post publishing options" width="1536" height="826" data-path="images/academy-social-planner.png" />
    </Frame>
  </Step>

  <Step title="Review and confirm">
    Review your post content, selected accounts, and scheduled time. Click **Schedule** (or **Post**) to confirm. The post will appear on your Social Planner calendar.
  </Step>

  <Step title="Track performance">
    After posts go live, return to the Social Planner to view analytics — including reach, engagement, and click data — to understand what content resonates with your audience.
  </Step>
</Steps>

## Key points

<AccordionGroup>
  <Accordion title="Which platforms are supported?">
    The Social Planner supports Facebook (Pages and Groups), Instagram Business, Google My Business, LinkedIn (Profiles and Pages), TikTok, and Twitter/X. Connect any combination of profiles in Settings > Integrations.
  </Accordion>

  <Accordion title="Posting options explained">
    Post Now publishes immediately for time-sensitive announcements. Schedule sets a future date and time for planned campaigns. Draft saves the post for review before going live. CSV Upload lets you import a bulk schedule from a spreadsheet — ideal for businesses or teams with high-volume content calendars.
  </Accordion>

  <Accordion title="Managing and editing scheduled posts">
    Click any scheduled post on the calendar to edit the content, change the timing, or delete it. You can make changes right up until the scheduled publish time.
  </Accordion>

  <Accordion title="Commenting and engagement">
    You can monitor and respond to comments on your posts directly within the Conversations area of the platform — no need to log into each social account separately.
  </Accordion>
</AccordionGroup>

## Key benefits

<AccordionGroup>
  <Accordion title="Centralized scheduling">
    Manage all your social profiles and posts from a single calendar view.
  </Accordion>

  <Accordion title="Plan ahead">
    Schedule weeks or months of content in advance so your feed stays consistent without daily effort.
  </Accordion>

  <Accordion title="Multi-platform posting">
    Publish the same post across all your connected accounts simultaneously.
  </Accordion>

  <Accordion title="Flexible publishing">
    Post immediately, schedule ahead, save drafts, or bulk-import from a CSV.
  </Accordion>

  <Accordion title="Performance insights">
    Track engagement analytics to understand what content drives the most results.
  </Accordion>
</AccordionGroup>
