Stylify Reels — UX Copy Reference

For: Stitch (CTO) — Implementation Reference

Author: Charlotte (COO)

Date: 2026-02-25

Version: 1.0

Table of Contents

1. Upload Flow Copy

Copy used throughout the Reel upload process, from initial file selection through success confirmation.

Primary CTA Button

Upload a Reel

Main button that opens the file picker. Used in the empty state, dashboard, and Reel creation interface.

Upload Instructions (Subtitle)

Add a video from your camera roll. Stylify handles the caption.

Displayed below the upload button or in the upload modal to set expectations. Emphasizes relief (you don't have to write the caption).

Upload Progress State

Getting your video ready...

Shown while the file is being uploaded to Stylify servers. Keep it light and brief. Display during file transfer and local processing.

Caption Generation State

Writing your caption...

Shown while Stylify is generating the caption based on the video content. Can be paired with a progress indicator or spinner. This is where voice personality is applied.

Instagram Processing State

Your Reel is processing on Instagram...

Shown after the video is sent to Instagram. Instagram takes time to process video files. This state should have a longer timeout (5-10 min) before showing the timeout error.

Success Confirmation (Posted Now)

Your Reel is live!

Shown when the Reel is successfully posted immediately. Should link to the Instagram post if possible. Keep it celebratory but professional.

Success Confirmation (Scheduled)

Your Reel is scheduled for [DATE] at [TIME]

Shown when the Reel is scheduled for future posting. Replace [DATE] and [TIME] with the actual scheduled datetime. Link to calendar view if available.

Retry Option After Failure

Try Again

Button text for retrying an upload that failed. Keep it simple and action-oriented.

2. Frame Picker Copy

Copy for the cover frame selection screen. This appears after upload but before caption review.

Section Header

Pick a cover frame

Main label for the frame picker UI. Usually displayed as a large heading above the frame carousel/selector.

Frame Selection Instruction

Drag to choose the frame that shows your best work.

Instruction text explaining how to interact with the frame picker. Works for both desktop (drag) and mobile (swipe). If mobile-only, adjust to: "Swipe to choose the frame that shows your best work."

Skip Frame Selection (Optional)

Use first frame

Button or link text to skip frame selection and use the first frame of the video as the cover. Should appear near the bottom or as a secondary action. Alternative: "Skip" or "Use default".

Helper Text (Optional)

This is the thumbnail people see before clicking your Reel.

Additional context explaining why the cover frame matters. Display under the section header or as a tooltip. Helps stylists understand the importance of the choice.

Frame Counter (If Applicable)

Frame [CURRENT] of [TOTAL]

Optional counter shown when scrubbing through frames. Helps users understand their position in the video. Only needed if frames are extracted at intervals (not continuous scrubbing).

3. Validation Error Messages

User-friendly error messages for invalid video files. All errors include the specific value that failed, not just generic "file error" messages. These are critical for UX — don't use technical jargon.

Validation Scenario Error Message
File Too Large
Video exceeds 300 MB
Your video is [X]MB — the max is 300MB. Try trimming or compressing it first.
Too Short
Video under 3 seconds
Your video is only [X] seconds — Reels need to be at least 3 seconds long.
Too Long
Video over 15 minutes
Your video is [X] minutes — the max for Reels is 15 minutes.
Wrong Video Codec
Not H.264 or HEVC
This video format isn't supported. Reels need H.264 or HEVC video. Most phone recordings work — try recording directly from your camera app.
Resolution Too High
Longer side > 1920px
Your video is [W]×[H] — the max is 1920px on the longest side. Try exporting at a lower resolution.
Landscape Orientation (WARNING)
Not blocking, but suboptimal
Heads up: your video is landscape ([W]×[H]). Instagram will add black bars. Vertical (9:16) works best for Reels.
No Audio Detected (WARNING)
Not blocking, but engagement hint
No audio detected. Reels with sound tend to get more engagement — consider adding music or voiceover.
Unsupported Container
Not MP4 or MOV
This file type isn't supported. Reels need MP4 or MOV video files.
Generic Upload Failure
Network error or unknown issue
Something went wrong uploading your video. Please try again.
Instagram Processing Timeout
Instagram taking too long (>10 min)
Instagram is still processing your Reel. We'll keep checking — you'll get a notification when it's live.
Instagram Processing Failed
Instagram rejected the file
Instagram couldn't process this video. Try uploading again, or use a different video.

Error Message Design Notes

Important Implementation Details:
  • Variable Replacement: Always replace [X], [W], [H] with actual detected values from the file. E.g., "Your video is 450MB — the max is 300MB." not "Your video is [X]MB..."
  • Visual Treatment: Display errors in red/pink backgrounds (CSS class: .copy-block.error). Warnings in yellow/orange.
  • Tone: Conversational, helpful, not blaming. Provide the next step (trim, export, try again) when possible.
  • Placement: Errors should appear inline with the upload area and persist until the user dismisses or fixes the issue.
  • Action Button: Always include a "Try Again" button or a "Select Different File" button below the error message.

4. Calendar & Schedule View Copy

Copy for the calendar interface where Reels appear alongside other posts. Reels are a new content type, so clear labeling is essential.

Reel Indicator Badge

Reel

Small badge displayed on calendar cells to indicate a Reel post (vs. a regular image post). Usually shown in a distinct color (purple or vibrant, matching brand). Example: A calendar cell showing "2/27" with a small "Reel" badge below the time "2:00 PM".

Reel vs. Image Toggle Label

Post type:

Label for the dropdown/selector that lets users choose between uploading a Reel or a static image post. Shown in the post creation modal or sidebar. Full context: "Post type: [Reel / Image]".

Schedule Confirmation (Reel)

Your Reel is scheduled for [DATE] at [TIME]

Confirmation message after scheduling a Reel for future posting. Replace [DATE] and [TIME] with the user's selection. Shown after the user clicks "Schedule".

Edit/Modify Reel Link

Edit Reel

Button/link text in the calendar cell context menu (right-click or long-press) to modify a scheduled Reel. Opens the edit modal with the video, caption, and frame options.

Delete Reel Confirmation

Delete this Reel?

Confirmation prompt when user clicks delete on a scheduled Reel. Should be followed by "This can't be undone." and show "Delete" and "Cancel" buttons.

5. Approval Screen Copy

Copy shown on the final review screen before posting or scheduling. This is where stylists see their video, caption, and hashtags together.

Screen Title

Your Reel is ready

Main heading on the approval screen. Clear and affirmative. Tells the user they're at the final step.

Screen Subtitle

Review your video and caption before posting.

Secondary text explaining what to do next. Encourages user to double-check before committing.

Video Section Header

Your Reel

Label for the video preview area. Usually displayed above a video player thumbnail or preview.

Caption Section Header

Caption

Label for the caption text area. Displayed above the generated caption text. User can edit if needed.

Edit Caption Link/Button

Edit caption

Button or link allowing the user to modify the Stylify-generated caption. Should open an inline text editor or modal.

Hashtag Section Label

Hashtags

Label for the hashtag section. Shows the hashtags that will be added to the caption. User can edit or remove if needed.

Post Now Button

Post Now

Primary CTA button to post the Reel immediately. Leads to success state or processing state.

Schedule Button

Schedule

Secondary CTA button to schedule the Reel for future posting. Opens a date/time picker modal.

Go Back/Edit Video Link

Change video

Link or button to go back and re-upload or select a different video. Should appear as a secondary action, usually in the footer or sidebar.

Hashtag Warning (If Many)

Instagram allows up to 30 hashtags. This caption has [X].

Optional informational text if the generated caption includes many hashtags. Not an error — just FYI. Display only if over 20 hashtags.

Hashtag Best Practice Tip

Pro tip: 5-10 relevant hashtags tend to get better engagement than 30.

Optional helper text to guide users on hashtag strategy. Display as a collapsible tip or informational card. Reference: Instagram's December 2025 change limiting effective hashtags to 5-10 per post.

6. Empty State & First-Time Copy

Copy shown when the user hasn't created any Reels yet or when there are no Reels scheduled. This is an opportunity to encourage the feature.

Empty State Heading

No Reels yet

Primary heading when the Reels section is empty. Short and straightforward.

Empty State Subtitle / Value Prop

Reels get 39% more engagement than static posts. Upload your first one and watch your reach grow.

Motivational copy explaining why Reels matter. Emphasizes results (engagement boost). Data point is based on general industry knowledge as of Feb 2025 (verify with source before using in marketing materials).

Empty State CTA

Upload a Reel

Button text for the primary action in the empty state. Same as the main CTA button elsewhere for consistency.

Alternative Empty State (After Viewing)

Your next Reel is waiting. Upload a video to get started.

Alternative messaging for users who've posted before and come back to an empty state. More action-oriented than the first-time message.

First Reel Encouragement Toast (Optional)

Congrats on your first Reel! 🎉 Check back for engagement insights.

Optional celebratory toast message shown after the first Reel is posted. Appears in a toast/notification and auto-dismisses after 5 seconds. Keep it brief and positive.

7. Tooltips & Info Copy

Contextual help text, tooltips, and educational copy that explains Reels to stylists who may be unfamiliar with the format.

What is a Reel? (Help Panel)

Reels are short, engaging videos (3–15 seconds) that showcase your work. Think of them as quick before-and-afters, transformation clips, or day-in-the-life moments. Instagram promotes Reels heavily, so they're a great way to reach new clients.

Expandable help section or tooltip explaining Reels for stylists who are unfamiliar with the format. Emphasize the platform prioritization (results/relief) and practical examples relevant to hair stylists.

Why Reels Matter for Reach (Info Card)

Instagram's algorithm favors Reels. A video showing your best transformation can reach 10x more people than a static photo.

Educational info card displayed in the empty state or onboarding. Emphasizes reach and discoverability. Wording: "10x" is conservative and defensible based on industry data.

Best Practices Tip #1 (Duration)

Sweet spot: 15–30 seconds. Longer Reels (up to 15 min) work if the content stays engaging, but shorter tends to get more views.

Tooltip or info card about ideal Reel length. Helps stylists understand the format without being prescriptive.

Best Practices Tip #2 (Vertical Format)

Vertical video (9:16) fills the full screen on mobile. Landscape videos get black bars and perform worse.

Tooltip when a user uploads a landscape video (warning state). Educates without blocking the upload.

Best Practices Tip #3 (Hook)

Hook viewers in the first 2 seconds. Use text overlays, cuts, or a surprising moment to keep them watching.

Optional tip displayed in a collapsible "Pro Tips" section. Educational for stylists optimizing Reel performance. Keep it short.

Business Account Requirement (Info)

You'll need an Instagram Business or Creator account to schedule Reels. Personal accounts can post immediately, but can't schedule.

Informational message displayed when a user tries to schedule a Reel without a Business account. Links to Instagram's account type help page. This is a real constraint based on Instagram's API.

Reel Icon/Indicator Tooltip

This is a Reel — a short video post. Reels get more reach than static photos.

Tooltip that appears when hovering over a "Reel" badge in the calendar or post list. Reinforces the value prop in context.

Audio/Music Suggestion Tooltip

Reels with trending audio get 40% more engagement. Stylify picks music based on your caption, but you can change it in Instagram's editor.

Tooltip explaining audio strategy. Appears near the "No audio detected" warning. Data point: verify "40%" before using in final copy (conservative estimate).

8. Implementation Guide for Stitch

String Localization Setup

Recommended Approach: Create a central strings file (e.g., strings/reels.json) with all copy strings organized by section and state. This makes it easy to update copy without touching component code and enables A/B testing later.

Example structure:
{
  "uploadFlow": {
    "primaryCta": "Upload a Reel",
    "subtitle": "Add a video from your camera roll. Stylify handles the caption.",
    "progressUploading": "Getting your video ready...",
    "progressCaption": "Writing your caption...",
    ...
  },
  "errors": {
    "fileTooLarge": "Your video is {sizeInMB}MB — the max is 300MB. Try trimming or compressing it first.",
    ...
  }
}
                

State Machine Mapping

Each string in this document maps to a specific UI state. Implement states in your upload component like this:

States: idleuploadingvalidatinggenerating-captionframe-pickerapprovalinstagram-processingsuccess

Error states: error-file-too-large, error-wrong-codec, error-instagram-processing-failed, etc.

Each state gets its own message/copy from the strings file. Errors should show the specific error message + retry button. Processing states should show a spinner or progress bar.

Component Structure

Component Strings Used State Dependency
<ReelUpload /> primaryCta, subtitle, progressUploading, progressCaption, all error messages uploading, validating, generating-caption, error-*, instagram-processing
<FramePicker /> sectionHeader, instruction, skipButton, helperText frame-picker (only shown if frame picker is enabled)
<ApprovalScreen /> screenTitle, subtitle, videoHeader, captionHeader, editCaption, hashtags, postNow, schedule, changeVideo approval (after caption generated)
<CalendarCell /> (Reel variant) reelBadge, postType, scheduleConfirmation Always visible when a Reel is scheduled
<EmptyState /> emptyHeading, emptySubtitle, emptyButtonCta idle, no scheduled Reels

Validation Function Checklist

Before showing an error, validate in this order:
  1. File existence: Does the file exist and is it readable?
  2. Container format: Is it MP4 or MOV? → If not, show "Unsupported container"
  3. File size: Is it ≤ 300MB? → If not, show "File too large"
  4. Video codec: Is it H.264 or HEVC? → If not, show "Wrong codec"
  5. Duration: Is it 3-900 seconds (3 sec to 15 min)? → If not, show "Too short" or "Too long"
  6. Resolution: Is the longest side ≤ 1920px? → If not, show "Resolution too high"
  7. Audio: Is audio detected? → If not, show warning only (non-blocking)
  8. Orientation: Is it portrait/vertical (9:16 or close)? → If landscape, show warning only
Success: If all checks pass, move to next state (frame picker or caption generation).

Variable Replacement Pattern

Use curly braces or template literals for variables:
"Your video is {sizeInMB}MB — the max is 300MB..."
"Your video is {durationSeconds} seconds — Reels need at least 3 seconds..."
"Your video is {width}×{height} — the max is 1920px on the longest side..."
"Your Reel is scheduled for {date} at {time}"
                
Replace variables client-side before displaying to user. Never show placeholder text like "[X]" or "{variable}" to the end user.

Error Message Styling

CSS Classes:
  • .copy-block.error — Red/pink background for blocking errors (file invalid, upload failed)
  • .copy-block.warning — Yellow/orange background for non-blocking warnings (landscape orientation, no audio)
  • .copy-block (default) — Green background for success messages
Placement: Errors and warnings should appear directly below the upload area or in an inline alert component. Allow dismiss with an X button, but keep the error message visible until the user retries or fixes the issue.

Loading States & Spinner Timing

Timeouts to implement:
  • Uploading: Show spinner indefinitely (user may have slow connection) — but display upload speed estimate after 2 seconds if available
  • Caption generation: Show spinner indefinitely (depends on model inference time) — 30-60 seconds typical
  • Instagram processing: Show status indefinitely — but after 10 minutes, show "Still processing" message and allow user to check back later or proceed to next post
  • Frame extraction: Show spinner with frame count (e.g., "Loading frames 1 of 120...") — timeout after 30 seconds

Mobile-Specific Considerations

  • File picker: On mobile, use native camera/gallery picker (intent-based, not web file input). Filepath passed back to Stylify API.
  • Frame scrubbing: Use swipe/gesture instead of drag. Text instructions should say "Swipe to choose the frame..."
  • Approval screen: Ensure video player is full-width and easily dismissable. Caption and buttons below in a scrollable section.
  • Schedule picker: Use native date/time pickers (e.g., iOS DatePicker) for best UX.

Testing Checklist for Copy Integration

Before shipping, verify:
  • All variable replacements show actual values (no [X] or {variable} placeholder text in UI)
  • Error messages appear for all validation scenarios in the table above
  • Success message differs between "Post Now" and "Schedule" flows
  • Tooltips and info cards appear on hover/tap (not on every interaction)
  • Frame picker appears only if enabled and video is valid
  • Empty state appears when user has no Reels scheduled
  • Loading spinners have accompanying copy (e.g., "Writing your caption...")
  • Calendar cells show "Reel" badge for Reel posts (distinct from image posts)
  • All copy is in the strings file and can be updated without code changes

A/B Testing Setup

This copy is vetted but can be A/B tested later. Structure the strings file to support variants:
{
  "uploadFlow": {
    "primaryCta": {
      "default": "Upload a Reel",
      "variant_a": "Create a Reel",
      "variant_b": "Add Video"
    }
  }
}
                
This makes it easy to swap variants at runtime based on user ID or experiment flag.

Brand Rules Reminder

Critical Copy Rules (Non-Negotiable):
  • Never say "AI": Not "AI writes your caption" → Instead "Stylify writes your caption" or "Stylify creates captions based on your video."
  • Messaging Hierarchy: (1) Results/relief first, (2) Time savings second, (3) Voice authenticity third. Example: "Get more engagement" (relief) → "in minutes" (time) → "in your voice" (voice).
  • Tone: Peer-to-peer, knowledgeable professional, not teacher-like. Avoid patronizing language. Stylists are experts in hair — Stylify is a tool that respects that expertise.
  • Voice: Conversational, helpful, direct. No corporate speak. E.g., "Your video is 450MB — try trimming it" not "The video file exceeds the maximum supported size constraint."
  • No over-claiming: Don't claim "guaranteed 39% more engagement" — say "Reels get 39% more engagement" (industry data, not a guarantee).