Documentation

How to use ContentWorkflow.

The reference for people who already have an account: where each screen is, what it does, and the order to do things in. If you're still deciding whether the product fits, the feature overview is the better page.

Getting started

Four steps from a cold browser to a workspace you can put a video into.

  1. 1Sign in with Google. Use the sign-in button in the header. There is no password to choose and no invite code — Google is the only sign-in method.
  2. 2Your workspace is created for you. On first sign-in the app creates your account and a workspace in the same step. It is named after you automatically, so there is nothing to configure before you can start — rename it later under Settings → General.
  3. 3Subscribe. Until the workspace has an active subscription, every page inside the app sends you to /billing. Choose monthly or annual and pay through Stripe Checkout. The workspace unlocks as soon as Stripe confirms the payment — no waiting on a manual approval.
  4. 4Land on the dashboard. This is the work queue and it is where you will spend most of your time. Press New post to create your first content item.

Install it as an app

ContentWorkflow is an installable web app. On desktop use your browser's install button; on Android, “Add to home screen”. Installing on Android also registers ContentWorkflow as a share target, which is what makes saving ideas from Instagram or TikTok a two-tap action.

One person per workspace

A workspace is a single login. There are no extra seats, no approval chains and no client-facing portal — clients in this app are records you organise work under, not people who sign in. Everything in these docs assumes you are the one doing the work.

Clients, projects and content

Four levels, and only one of them is where you do daily work.

The hierarchy

Workspace → Client → Project → Content. A client is who the work is for. A project is a channel, a series or a campaign inside that client. A content item is one video, carousel or image post.

Working on your own brand rather than for clients? Create one client for yourself and a project per channel or series. The structure costs you two records and keeps filtering useful later.

Where to manage them

Clients and projects are organisational records, so they live under Settings → Clients & Projects. Create, rename and delete them there — that page is deliberately not where you work.

Day-to-day work happens on the dashboard, which queues content across every client and project at once. Narrow it with the client and project filters in the toolbar; the filters persist between visits.

Content types and fields

Pick one of four types: Shortform (one vertical video, wherever it ends up posted), Long-form, Carousel and Image post. The type decides which publish targets are available, not which platform you are on.

Each content item carries a title, description (markdown, with a live preview), a hook, caption, hashtags, notes, tags, a deadline, a recording date, and its files. The hook field is the opening line — analytics aggregate on it, so filling it in is what makes the “best hooks” leaderboard mean anything.

Moving a video through the pipeline

The dashboard is the pipeline. Every content item in the workspace sits in exactly one of nine stages.

Stage 1

Ideas

It exists as a thought. Nothing has been written.

Stage 2

Scripting

The script or outline is being written.

Stage 3

Filming

Waiting to be recorded, or being recorded.

Stage 4

Editing

Footage exists and is being cut.

Stage 5

Review

A cut is uploaded and waiting on notes.

Stage 6

Approved

Notes are resolved. It is ready to go out.

Stage 7

Scheduled

A publish date is set on at least one platform.

Stage 8

Published

Live on every platform you ticked.

Stage 9

Archive

Done. Reached automatically 30 days after publish.

Three views over one queue

Board groups content into columns by stage. List shows the same grouping as collapsible rows. Calendar plots deadlines, recording dates, review dates and scheduled publish dates on a month, week or day grid.

The view you pick is remembered. Add ?view=calendar to the dashboard URL to link straight to one.

Changing a stage

Drag a card between columns in board view, or a row between groups in list view. With a mouse you have to move about six pixels before it lifts, so a click still opens the item. On touch, press and hold to lift it.

Order inside a column is saved, so a manually prioritised Editing column stays in that order. On the calendar, dragging an event moves the underlying date.

Working on several at once

Every row and group has a checkbox. Selecting anything opens a floating bar with delete and duplicate — duplicate is the fastest way to set up a batch of videos that share a client, project and deadline.

What happens at the end

Content that has been live for 30 days moves itself to Archive overnight. That is one of four background jobs — scheduled publishing, analytics sync, retrying failed uploads and auto-archive — which you can watch, run on demand or pause under Settings → Automations.

Stages with nothing in them are hidden on the board — turn them back on with “Show empty stages” under Settings → Appearance. In list view, Published and Archive start collapsed.

Reviewing a cut

On the content page, the Review tab. This is where versions and notes live.

  1. 1Upload a version. Press Upload version, pick the file (up to 512 MB), and optionally give it a label and a note on what changed. It becomes v1. A video you upload from the Overview tab lands here as a version too, rather than sitting as a loose attachment.
  2. 2Leave timestamped comments. Start typing in the comment box and the video pauses so the timecode stops moving; the note is pinned to that second. Each comment appears as a marker on the timeline — amber for unresolved, grey once handled — and clicking a comment's timecode seeks the player back to it. Comments belong to the version they were left on, so v2's notes never mix with v1's.
  3. 3Resolve as you fix them. Tick a comment to resolve it, untick to reopen it, and switch the panel from All to Unresolved when you want the remaining work only.
  4. 4Upload the next cut. The new file becomes v2 and every earlier version stays available in the version picker, so you can jump back and check what a note was actually about.
  5. 5Move it to Approved. Then go to the Publishing tab — the newest version is the file that gets published.

Reviewing happens inside your workspace. There is no client login and no shareable review link, so notes come to you through whatever channel you already use with the client, and you record them here.

Connecting social accounts

Settings → Social accounts. Connect once per account; publishing and analytics both run off these connections.

Connecting

Each platform connects over its own official OAuth flow — you approve the permissions on TikTok, Instagram or Google, and come back to the app. Instagram requires a Professional account (Business or Creator); a personal account cannot be connected because Instagram's API does not expose one.

Access and refresh tokens are stored encrypted and are only decrypted inside a publish or sync job. Disconnect an account at any time from the same page.

More than one account per platform

You can connect several TikTok, Instagram or YouTube accounts. Reconnecting an account you already have updates it rather than adding a duplicate — accounts are matched on the platform's own id.

Each connection shows its status, its follower count and when it last synced, plus a reconnect button for when a token expires or a platform starts requiring a new permission.

Linking an account to a client

This is set from the client, not the accounts page. Open Settings → Clients & Projects, pick the client, and tick the accounts it owns in the Social accounts card. Publishing then selects those accounts automatically for that client's content — this is what stops wrong-account posts when you run several brands from one workspace.

An account belongs to one client at a time; ticking it under a different client moves it. If several accounts of the same platform are connected and nothing says which one applies, publishing stops and asks instead of guessing.

Importing what is already there

A connected account has an Import videos button. It pulls the account's existing posts in as published content — thumbnails included — into a client and project you choose. Anything already imported is skipped, so re-running it is safe.

Reconnect an account when it shows an error, or after a release that asks for a new permission. TikTok analytics need the video list permission, so an account connected before that was requested will publish fine but return no metrics until you reconnect it.

Scheduling and publishing

On the content page, the Publishing tab. Each platform is a row you tick.

  1. 1Tick the targets. There are five: TikTok, Instagram Reels, Instagram Post, YouTube Shorts and YouTube long-form. Video-only targets grey out when the content is an image post.
  2. 2Override only what differs. Every row can have its own caption, hashtags, thumbnail and publish time. Leave a field blank and it falls back to the content-level value at publish time, so changing one caption does not mean writing five.
  3. 3Fill in TikTok's required settings. See below — a direct TikTok post will not run until they are set.
  4. 4Publish now, or schedule. Scheduled rows are claimed by a background job when they come due and uploaded then. Each target can have a different time, so the Reel can go out at 8am and the long-form on Sunday from the same form.
  5. 5Watch the log. Every publish writes to the content's history: scheduled, started, upload finished, published, failed, retried. Failures retry automatically up to three times and then stop with a FAILED status and a retry action, and you get a notification either way.

TikTok's required per-post settings

TikTok requires the person posting to make these choices actively rather than inherit a default, which is why a direct post refuses to run until they are filled in.

Who can view the post

The privacy options offered are read live from that TikTok account, so you can only choose something the account is actually allowed to post.

Comment, duet, stitch

Interaction toggles travel with the post. Where the creator has switched one off inside TikTok, it stays off here.

Commercial content

Declare your own brand promotion, a paid partnership, or both. Branded content cannot be posted privately, and the form refuses that combination the same way TikTok does.

Send to drafts instead

TikTok has a second mode: upload the video into the account's TikTok inbox as a draft instead of posting it. Nothing goes public, and none of the settings above are asked for — you finish the post inside TikTok's own editor, which is where trending sounds and text overlays actually live.

Use this when the post needs something only the TikTok app can add, and direct post for everything else.

Linking posts you published elsewhere

Content already live outside the app can be attached platform-by-platform — pick it from the connected account's recent uploads. From then on it counts as published and syncs analytics like anything else, so your history does not start on the day you signed up.

If the same video went out on more than one of your accounts, the “Other account?” toggle lets you point that row at the right one.

More detail on every target, its caption limits and how failures are handled is on the publishing page.

Analytics

Every published upload stores periodic snapshots per platform. The analytics page reads those snapshots — it never asks a platform for numbers while you wait.

What syncs

Views, reach, impressions, likes, comments, shares, saves, followers gained, watch time, average watch percentage, completion rate and click-through rate where the platform exposes it — alongside publish date, platform and duration.

A sync also flags posts that were deleted on the platform side, so a video that disappeared stops quietly inflating your totals.

When it syncs

Automatically every six hours, as a background job. You do not have to leave a tab open and there is nothing to trigger daily.

For an immediate refresh, use Sync now on the analytics page or under Settings → Automations, where you can also pause the schedule. The page shows when it last ran.

Filtering

Pick a date range — all time, the last 7, 30 or 90 days, or a custom from/to — then narrow by client, project, platform, status, content type and tag. Filters combine, and the whole page (headline numbers, charts, leaderboards and the table) respects them.

Advanced search

For anything the dropdowns cannot express, type a query: Views > 10k AND Platform = TikTok AND Duration < 30s. It is parsed as you type into removable chips, so you can drop one condition without retyping the rest.

Above the table sit the headline numbers — total views, followers gained, uploads, engagement rate, average watch percentage and time, best platform, best performing video and best hook — then charts for views over time, follower growth, watch time, upload frequency, platform comparison and best posting days and hours, then leaderboards for most viewed, highest retention, highest engagement, most followers gained, fastest growth and top hooks.

Instagram automation

Settings → IG Automation. Keyword rules that reply to comments and DMs on an Instagram account you have connected.

This works on Instagram accounts you connect yourself. Running it on an account belonging to someone else is not available yet — that needs Meta App Review, which is still pending. Everything below assumes your own connected account.

The three triggers

Comment

Fires when someone comments on one of your posts and the comment matches a keyword. The rule can reply publicly in the thread, send that person a private DM, or do both.

DM

Fires when an incoming direct message matches a keyword, and sends your reply. This is the “send me the link” pattern.

On publish

Fires when this app publishes an Instagram post, and drops your comment on it seconds later — so it lands first. No keywords involved; it applies to the post being published.

Building a rule

Keyword matching

Add up to 20 keywords per rule. Matching is case-insensitive and is either Contains — the word appears anywhere in the message — or Exact, where the whole message has to be that word.

Comment rules can be scoped to one specific post instead of the whole account. A post-scoped rule wins over an account-wide one, so you can run a broad catch-all and override it for a launch video.

Once per user, and followers only

Once per user is on by default, so the same person never gets the same reply twice no matter how many times they comment.

Followers only makes a comment or DM rule check that the person follows the account first. On a comment rule it holds back the public reply too, so the thread never promises a DM that will not arrive. Instagram only reveals follow status for people who have already messaged the account, so a commenter who has never DM'd you resolves as unknown and is skipped — the run history says exactly that when it happens.

The inbox, and Instagram's windows

Reading and replying

The inbox holds every DM the connected account receives, arriving live. New messages raise a bell notification and a short chime in any open tab; turn that off under Settings → Notifications. Recent conversation history is pulled in when an account connects and whenever you open the inbox.

Limits worth knowing

Instagram closes the reply window 24 hours after someone's last message — the reply box disables itself past that. A private reply to a comment works for seven days, once per comment. DM text caps at 1,000 characters and comment replies at 2,200.

Pinning a comment is not possible through Instagram's API, so an auto-comment lands first but still has to be pinned by hand in the Instagram app.

One-time setup: after enabling automation, reconnect the Instagram account under Settings → Social accounts so the messaging and comment permissions are granted, and in Instagram itself go to Settings → Messages and story replies → Connected tools and allow access to messages. Without that last switch Instagram never delivers the messages at all. There is more background on the Instagram automation page.

Media library and ideas

Two places that feed the pipeline from opposite ends — everything you have uploaded, and everything you have not made yet.

Media library

Every file across every client, project and content item, in a grid or a list. Search by name, filter by file type, client or project, and sort by newest, oldest, name or size. The toolbar shows how much storage you are using, broken down by kind.

Select several files and delete them in one action — that removes the bytes from storage, not just the record. Uploads go from your browser straight to object storage, so a large export never has to pass through the app.

Inspiration

Save a link with New idea and the title, source and thumbnail are scraped for you, or upload photos and clips from your gallery. Each card takes an inline title and a note, and that note becomes the post's description later.

On Android, sharing a link or a video from any app into the installed ContentWorkflow saves it here without opening the app. When an idea is ready, press → Post to turn it into an Ideas-stage content item in a project you choose — the media comes with it.

Notifications, search and keyboard shortcuts

The app is built to be driven from the keyboard, and to tell you when a background job finished without you checking.

Notifications

The bell carries an unread badge and there is a full notifications page behind it. You are notified when publishing completes or fails, when a review comment is added, when an analytics sync finishes, when an upload finishes and when a new Instagram DM arrives.

Each type has its own switch under Settings → Notifications. Notifications arrive live, and so does everything else — a change made on your phone shows up on the desktop tab without a refresh.

The ⌘K palette

Press ⌘K anywhere to search the whole workspace at once: clients, projects, content titles, tags, captions, review comments and file names. Results are grouped, and pressing Enter jumps straight to the record.

Shortcuts are ignored while you are typing in a field or when a dialog is open, so they never fire by accident.

Global and review keys

  • Search and command palette⌘ K
  • Toggle the sidebar⌘ B
  • Show the shortcuts overlay?
  • Close a dialog or the paletteEsc
  • Play / pause (review timeline focused)Space
  • Scrub ±5 seconds (review timeline focused)← →
  • Submit a review comment⌘ ↵

Jump to a page

Press G, release it, then the letter.

  • DashboardG then D
  • ClientsG then C
  • Calendar viewG then L
  • AnalyticsG then A
  • Media libraryG then M
  • Social accountsG then O
  • AutomationsG then U
  • NotificationsG then N
  • SettingsG then S

Press ? anywhere for this list as an overlay, or read it under Settings → Keyboard shortcuts.

Billing and your subscription

One plan, managed from the billing page inside the app.

What you are paying for

$29 per month or $290 per year, in USD. Both buy exactly the same thing — annual is two months cheaper, and nothing in the app is gated behind a higher tier because there is no higher tier.

There is no free plan and no trial. You subscribe, the workspace unlocks, and you can cancel whenever you want.

Managing it

Open /billing from the app — it sits outside the paywall, so an expired subscription can never lock you out of the page that fixes it.

Manage billing opens the Stripe customer portal, where you update the card, download past invoices and receipts, switch between monthly and annual, and cancel. Card details are handled entirely by Stripe and never reach ContentWorkflow's servers. The page itself shows your current status and the date the subscription renews.

Cancelling

Cancel in the portal and you keep full access until the end of the period you have already paid for — nothing is cut off mid-month. Videos already published to TikTok, Instagram and YouTube live on those platforms and are never touched.

You can disconnect your social accounts at any time, independently of the subscription.

If something looks wrong

Subscription status is read back from Stripe rather than assumed from the checkout screen, so it updates a moment after payment rather than instantly. Reload the billing page if the workspace has not unlocked yet.

If a renewal payment fails, the page says so and the workspace stays open while Stripe retries the card — you get time to fix it rather than losing access the same day. Plan details are on the pricing page.

Not signed up yet?

Everything in these docs is on the one plan. See what the app does in full on the features page, or check the changelog for what shipped most recently.

$29/month or $290/year, USD. No free tier and no trial — cancel any time and keep access to the end of the period.

Docs: Setup, Publishing and Analytics · ContentWorkflow