How to Require Human Approval Before a Sponsored Post Goes to a Brand

Draft a sponsored caption grounded in your brand voice, pause for a teammate or manager to sign off, and only then email the approved copy to the brand contact, all in one Spojit workflow.

What This Integration Does

When you have a brand deal, the caption you send for sign-off has to sound like you and hit every contractual beat (handle, hashtags, disclosure, links). This workflow drafts that sponsored caption with an Agent-mode Connector node that reads from a Knowledge collection of your brand-voice and media-kit documents, then holds the draft at a Human approval node so a teammate, your manager, or your agency lead reviews it before anything leaves your hands. Only after approval does the copy go out to the brand contact. Nothing is sent on a guess, and the wording a human signed off on is exactly what the brand receives.

You start the run yourself from the Run button using a Manual trigger, passing the brief (campaign name, brand contact email, talking points, required hashtags, the target platform). A Knowledge node in Query mode pulls the relevant brand-voice guidance, an Agent-mode Connector node drafts a structured caption, and the Human node pauses the workflow until every approval slot is satisfied. If a reviewer approves, the workflow continues and a Send Email node delivers the final copy. If a reviewer rejects, or the approval times out, the run halts and nothing is sent, so re-running starts a fresh draft from your latest brief.

Prerequisites

  • A persistent Knowledge collection that holds your brand-voice notes, tone guidelines, disclosure rules, and any media-kit copy. Create it under the Knowledge section of the sidebar with New Collection, then Upload Document and Upload & Embed your files.
  • Approvers set up in your workspace: the User, Role, or Team you want to sign off on sponsored copy.
  • The brand contact's email address allowlisted under Settings > General > Email recipients if you plan to email them from Spojit's built-in mail service with a Send Email node.
  • Optional: a Front connection (API key) if you want to look up the brand contact's details from your shared inbox, and a Resend connection with a verified domain if you would rather send the final copy from your own creator address.

Step 1: Start with a Manual trigger and capture the brief

Add a Trigger node and set its type to Manual. A Manual trigger runs from the Run button and its output is the request body you pass in, available downstream as {{ input }}. Define the fields your draft needs so every run is self-contained:

{
  "campaign": "Spring Hydration Launch",
  "brandContactEmail": "marketing@brand.example",
  "platform": "Instagram",
  "talkingPoints": "30-day glow challenge, ships in recyclable packaging",
  "requiredHashtags": "#ad #BrandPartner #SpringGlow",
  "deadline": "2026-07-01"
}

Reference these later as {{ input.campaign }}, {{ input.brandContactEmail }}, and so on. Keeping the brand contact email on the trigger payload means the same workflow serves every brand deal without edits.

Step 2: Pull brand-voice guidance with a Knowledge node (Query mode)

Add a Knowledge node and set its mode to Query. In Collection, pick the persistent brand-voice collection from your prerequisites. In Prompt, ask for the guidance that matters for this caption, templating in the brief:

Summarize my brand voice, required FTC-style sponsorship disclosure wording,
and any do-not-say phrases relevant to a {{ input.platform }} sponsored post
about: {{ input.talkingPoints }}

Set Result Count to pull the top matching chunks (default 5 is a good start), choose the Model for synthesis, and name the Output Variable, for example brandVoice. The synthesized guidance is then available as {{ brandVoice }}. Querying a collection grounds the draft in your real, documented voice instead of a generic guess.

Step 3: Draft the caption with an Agent-mode Connector node

Add a Connector node and switch it to Agent mode. This is the AI that runs inside the workflow: the agent reasons over your brief and the retrieved brand voice and writes the caption. In the agent prompt, give it everything it needs:

You are drafting a sponsored {{ input.platform }} caption for the campaign
"{{ input.campaign }}".

Brand voice and rules to follow:
{{ brandVoice }}

Talking points to cover: {{ input.talkingPoints }}
Hashtags that MUST appear: {{ input.requiredHashtags }}

Write one ready-to-post caption that includes a clear sponsorship disclosure.

Turn on the Response Schema so the agent returns predictable JSON you can route into the approval message and the email body:

{
  "type": "object",
  "properties": {
    "caption": { "type": "string" },
    "disclosureIncluded": { "type": "boolean" },
    "hashtags": { "type": "array", "items": { "type": "string" } }
  },
  "required": ["caption", "disclosureIncluded"]
}

Name the output, for example draft, so the caption is available as {{ draft.caption }}. Use Agent mode here (not Direct mode) because writing and judgment are exactly what an agent is for; Direct mode is for deterministic single-tool calls.

Step 4: Pause for sign-off with a Human approval node

Add a Human node so the draft cannot move until a person approves it. Set a clear Label (for example Approve sponsored caption) and a Message that shows the reviewer exactly what they are signing off on:

Campaign: {{ input.campaign }}
Platform: {{ input.platform }}
Disclosure included: {{ draft.disclosureIncluded }}

Proposed caption:
{{ draft.caption }}

In Approval slots, the only required field, add the reviewer who must sign off. A slot holds atoms (a User, a Role, or a Team); any atom satisfies its slot, and approval completes when every slot is satisfied. Set a Timeout (minutes) if a deal has a hard deadline (leave blank for no timeout), pick an Urgency, write a Notification title and body, and turn on Email approvers if you want reviewers emailed as well as notified in the Approvals inbox at /approvals. On approval, the node continues and outputs { approved: true, outcome: "APPROVED" }; a reject or timeout halts the run so nothing reaches the brand. Note that branching on reject is not supported: rejection simply stops the workflow.

Step 5: Confirm the brand contact (optional, via the Front connector)

If you manage brand relationships in a shared inbox, add a Connector node on the Front connector in Direct mode and select list-contacts to confirm the contact before sending. Pass the brand email as the search query in the q field:

q: {{ input.brandContactEmail }}

If you already store the Front contact ID, use get-contact with the id field instead. Use Direct mode here because this is a predictable single lookup with no AI cost. You can skip this step entirely and email the address from the trigger payload, but the lookup catches typos and confirms you are writing to the right brand manager.

Step 6: Email the approved copy to the brand

Add a Send Email node after the Human node so it only runs once the draft is approved. It sends from Spojit's built-in mail service with no connection required. Set the fields:

  • Recipients: {{ input.brandContactEmail }}
  • Subject: Approved caption for {{ input.campaign }}
  • Body: include the signed-off copy and the required hashtags.
Hi team,

Here is the approved {{ input.platform }} caption for {{ input.campaign }}:

{{ draft.caption }}

Tags: {{ input.requiredHashtags }}

Ready to schedule on my side once you confirm.

Set If sending fails to Fail the workflow so a delivery problem surfaces in your execution history rather than passing silently. Remember the recipient must be on your org allowlist under Settings > General > Email recipients.

Step 7: Send from your own creator domain instead (optional, via Resend)

To send the approved copy from your own address rather than Spojit's built-in mail service, replace or follow the Send Email node with a Connector node on the Resend connector in Direct mode, selecting send-email. Map the inputs:

from: Your Name <you@yourdomain.com>
to: {{ input.brandContactEmail }}
subject: Approved caption for {{ input.campaign }}
text: {{ draft.caption }}

This requires a Resend connection with a verified sending domain. Use this when the brand should see the message coming straight from your creator brand. For a deeper walkthrough, see the related Resend tutorial linked below.

Tips

  • Always use the same embedding model for embedding and querying your brand-voice collection; the model is fixed when you create the collection, so set it once and reuse the collection across every brand-deal workflow.
  • Scaffold this whole workflow fast by describing it to Miraxa, the intelligent layer across your automation: "Add a Knowledge query, an Agent-mode Connector node, a Human approval node, then a Send Email node." Then fine-tune each node in the properties panel.
  • Put the campaign name and disclosure flag in the Human node message and notification body so reviewers can approve from the badge or a notification without opening the full run.
  • Add more than one approval slot when both a manager and an agency lead must sign off; slots use AND semantics, so the workflow waits for every slot.

Common Pitfalls

  • If the brand contact email is not on the org allowlist, the Send Email node cannot deliver. Add external recipients under Settings > General > Email recipients first.
  • A rejected or timed-out approval halts the run; there is no "on reject" branch. If you want a revise-and-resubmit loop, re-run the workflow with an updated brief rather than expecting downstream nodes to fire.
  • The Send Email and Resend steps only see upstream variables, so make sure the caption is produced before the email node, not in a parallel branch that has not resolved yet.
  • If the agent leaves out a required hashtag or the disclosure, tighten the Response Schema (mark hashtags required) and restate the must-include rules in the agent prompt; vague prompts produce vague captions.

Testing

Before using this for a real deal, run it on a dummy brief from the Run button with the brandContactEmail set to your own address. Confirm the Knowledge query returns guidance you recognize, the Agent-mode draft reads in your voice and includes the disclosure, and the Human node appears in your Approvals inbox at /approvals. Approve it and verify the email lands in your inbox with the exact approved wording; then reject a second test run and confirm the workflow halts and no email is sent. Once both paths behave, swap in real brand contacts.

Learn More

Did this answer your question? Thanks for the feedback There was a problem submitting your feedback. Please try again later.