1. Upload Flow Copy
Copy used throughout the Reel upload process, from initial file selection through success confirmation.
Primary CTA Button
Main button that opens the file picker. Used in the empty state, dashboard, and Reel creation interface.
Upload Instructions (Subtitle)
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
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
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
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)
Shown when the Reel is successfully posted immediately. Should link to the Instagram post if possible. Keep it celebratory but professional.
Success Confirmation (Scheduled)
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
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
Main label for the frame picker UI. Usually displayed as a large heading above the frame carousel/selector.
Frame Selection Instruction
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)
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)
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)
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
- 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
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
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)
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
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
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
Main heading on the approval screen. Clear and affirmative. Tells the user they're at the final step.
Screen Subtitle
Secondary text explaining what to do next. Encourages user to double-check before committing.
Video Section Header
Label for the video preview area. Usually displayed above a video player thumbnail or preview.
Caption Section Header
Label for the caption text area. Displayed above the generated caption text. User can edit if needed.
Edit Caption Link/Button
Button or link allowing the user to modify the Stylify-generated caption. Should open an inline text editor or modal.
Hashtag Section Label
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
Primary CTA button to post the Reel immediately. Leads to success state or processing state.
Schedule Button
Secondary CTA button to schedule the Reel for future posting. Opens a date/time picker modal.
Go Back/Edit Video Link
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)
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
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
Primary heading when the Reels section is empty. Short and straightforward.
Empty State Subtitle / Value Prop
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
Button text for the primary action in the empty state. Same as the main CTA button elsewhere for consistency.
Alternative Empty State (After Viewing)
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)
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)
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)
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)
Tooltip or info card about ideal Reel length. Helps stylists understand the format without being prescriptive.
Best Practices Tip #2 (Vertical Format)
Tooltip when a user uploads a landscape video (warning state). Educates without blocking the upload.
Best Practices Tip #3 (Hook)
Optional tip displayed in a collapsible "Pro Tips" section. Educational for stylists optimizing Reel performance. Keep it short.
Business Account Requirement (Info)
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
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
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
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:
idle → uploading → validating → generating-caption → frame-picker → approval → instagram-processing → success
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
- File existence: Does the file exist and is it readable?
- Container format: Is it MP4 or MOV? → If not, show "Unsupported container"
- File size: Is it ≤ 300MB? → If not, show "File too large"
- Video codec: Is it H.264 or HEVC? → If not, show "Wrong codec"
- Duration: Is it 3-900 seconds (3 sec to 15 min)? → If not, show "Too short" or "Too long"
- Resolution: Is the longest side ≤ 1920px? → If not, show "Resolution too high"
- Audio: Is audio detected? → If not, show warning only (non-blocking)
- Orientation: Is it portrait/vertical (9:16 or close)? → If landscape, show warning only
Variable Replacement Pattern
"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
.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
Loading States & Spinner Timing
- 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
- 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
{
"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
- 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).