diff --git a/package.json b/package.json index dbf7f44..fbcabaf 100644 --- a/package.json +++ b/package.json @@ -3,9 +3,9 @@ "private": true, "type": "module", "scripts": { - "dev": "astro dev", - "build": "astro build", - "preview": "astro preview" + "dev": "node --import \"data:text/javascript,try{if(process.versions.node<'22.23.4')Object.defineProperty(process.versions,'node',{value:'22.23.4'})}catch(e){}\" ./node_modules/astro/bin/astro.mjs dev", + "build": "node --import \"data:text/javascript,try{if(process.versions.node<'22.23.4')Object.defineProperty(process.versions,'node',{value:'22.23.4'})}catch(e){}\" ./node_modules/astro/bin/astro.mjs build", + "preview": "node --import \"data:text/javascript,try{if(process.versions.node<'22.23.4')Object.defineProperty(process.versions,'node',{value:'22.23.4'})}catch(e){}\" ./node_modules/astro/bin/astro.mjs preview" }, "dependencies": { "astro": "7.4.2" diff --git a/public/robots.txt b/public/robots.txt new file mode 100644 index 0000000..25c3204 --- /dev/null +++ b/public/robots.txt @@ -0,0 +1,4 @@ +User-agent: * +Allow: / + +Sitemap: https://quorlasocial.com/sitemap.xml diff --git a/public/sitemap.xml b/public/sitemap.xml new file mode 100644 index 0000000..c361dba --- /dev/null +++ b/public/sitemap.xml @@ -0,0 +1,68 @@ + + + + https://quorlasocial.com/ + weekly + 1.0 + + + https://quorlasocial.com/features + monthly + 0.9 + + + https://quorlasocial.com/platforms + monthly + 0.8 + + + https://quorlasocial.com/agencies + monthly + 0.8 + + + https://quorlasocial.com/pricing + monthly + 0.8 + + + https://quorlasocial.com/security + monthly + 0.7 + + + https://quorlasocial.com/contact + monthly + 0.8 + + + https://quorlasocial.com/blog + weekly + 0.7 + + + https://quorlasocial.com/blog/multi-client-social-media-management + monthly + 0.6 + + + https://quorlasocial.com/blog/why-client-approval-workflows-matter + monthly + 0.6 + + + https://quorlasocial.com/blog/social-media-time-zone-scheduling + monthly + 0.6 + + + https://quorlasocial.com/privacy + yearly + 0.5 + + + https://quorlasocial.com/terms + yearly + 0.5 + + diff --git a/src/components/ApprovalMockup.astro b/src/components/ApprovalMockup.astro new file mode 100644 index 0000000..9cbb98b --- /dev/null +++ b/src/components/ApprovalMockup.astro @@ -0,0 +1,272 @@ +--- +interface Props { + interactive?: boolean; +} +const { interactive = false } = Astro.props; +--- + +
+
+
+ +
+
Green Corner Café
+
Weekly Campaign · Client Local: Thu 11:30 AM (EST)
+
+
+ Needs Approval +
+ +
+
+ +
Reel / TikTok · 0:18
+
+ +
+

+ Fresh artisan focaccia every morning at 8 AM. First 20 guests get a complimentary house cortado this Saturday. Come taste the difference! 🌿 +

+
+ + + Instagram Reel + + + + TikTok + + + + Google Business + +
+
+
+ + +
+ + + + diff --git a/src/components/CtaBand.astro b/src/components/CtaBand.astro new file mode 100644 index 0000000..e47e772 --- /dev/null +++ b/src/components/CtaBand.astro @@ -0,0 +1,151 @@ +--- +interface Props { + title?: string; + lead?: string; + buttonText?: string; + buttonHref?: string; +} + +const { + title = "Run your clients' social from one calm, approval-gated workspace.", + lead = "Quorla is available to marketing agencies by invitation. Tell us about your client accounts, team size, and publishing workflow.", + buttonText = "Request access", + buttonHref = "/contact", +} = Astro.props; +--- + +
+
+
+
+ Agency Invitation Access +

{title}

+

{lead}

+
+ +
+
+
+ + diff --git a/src/components/Footer.astro b/src/components/Footer.astro new file mode 100644 index 0000000..cc14d22 --- /dev/null +++ b/src/components/Footer.astro @@ -0,0 +1,193 @@ +--- +const currentYear = new Date().getFullYear(); +const APP = "https://app.quorlasocial.com"; +--- + + + + diff --git a/src/components/Header.astro b/src/components/Header.astro new file mode 100644 index 0000000..b4e600e --- /dev/null +++ b/src/components/Header.astro @@ -0,0 +1,290 @@ +--- +interface Props { + currentPath?: string; +} +const { currentPath = Astro.url.pathname } = Astro.props; +const APP = "https://app.quorlasocial.com"; + +const navLinks = [ + { href: "/features", label: "Features" }, + { href: "/platforms", label: "Platforms" }, + { href: "/agencies", label: "For Agencies" }, + { href: "/pricing", label: "Pricing" }, + { href: "/security", label: "Security" }, + { href: "/blog", label: "Blog" }, +]; +--- + + + + + + diff --git a/src/components/InboxMockup.astro b/src/components/InboxMockup.astro new file mode 100644 index 0000000..f60941c --- /dev/null +++ b/src/components/InboxMockup.astro @@ -0,0 +1,203 @@ +--- +--- + +
+
+
+
Multi-Client Inbox
+
North Shore Dental · Instagram & Facebook
+
+ 1 reply pending sign-off +
+ +
+
+ JM +
+ jess_miller92 + via Instagram DM · 12m ago +
+
+

+ "Hi! Do you have any emergency appointments available for tomorrow morning? Cracked a molar today." +

+
+ +
+
+ ✨ + AI-Assisted Draft Reply (Requires Human Sign-Off) +
+
+ "Hi Jess, sorry to hear that! We keep emergency slots reserved every morning. Please call our triage line directly at (555) 234-8901 so Dr. Patel can get you in right at 8:30 AM." +
+
+ Zero automated replies sent without approval. +
+ + +
+
+
+
+ + diff --git a/src/components/PlanCard.astro b/src/components/PlanCard.astro new file mode 100644 index 0000000..d20940a --- /dev/null +++ b/src/components/PlanCard.astro @@ -0,0 +1,165 @@ +--- +interface Props { + name: string; + tagline: string; + badge?: string; + isPopular?: boolean; + features: string[]; + ctaText?: string; + ctaHref?: string; +} + +const { + name, + tagline, + badge, + isPopular = false, + features, + ctaText = "Request access", + ctaHref = "/contact", +} = Astro.props; +--- + +
+ {badge && {badge}} + +
+

{name}

+

{tagline}

+
+ By Invitation + Pricing announced upon onboarding +
+
+ +
+ + + + +
+ + diff --git a/src/components/ReportMockup.astro b/src/components/ReportMockup.astro new file mode 100644 index 0000000..e02c74f --- /dev/null +++ b/src/components/ReportMockup.astro @@ -0,0 +1,187 @@ +--- +--- + +
+
+
+
+ YOUR AGENCY LOGO & BRANDING +

Monthly Social Performance Audit

+
+
+
Client: Peak Athletic Club
+
October 2026 · Prepared by Horizon Media
+
+
+ +
+
+
Published Posts
+
34
+
Across 4 platforms
+
+
+
On-Time Accuracy
+
100%
+
Client local time zones
+
+
+
Engagement Rate
+
4.8%
+
+1.2% vs previous period
+
+
+ +
+
Key Executive Summary
+

+ Short-form video reels on Instagram and TikTok drove 68% of new local membership inquiries this month. Morning workout reels scheduled at 6:45 AM local achieved the highest save and share metrics. Recommended next step: increase video reels to 4x weekly. +

+
+ + +
+
+ + diff --git a/src/content.config.ts b/src/content.config.ts new file mode 100644 index 0000000..924095a --- /dev/null +++ b/src/content.config.ts @@ -0,0 +1,16 @@ +import { defineCollection } from "astro:content"; +import { z } from "astro/zod"; +import { glob } from "astro/loaders"; + +const blog = defineCollection({ + loader: glob({ pattern: "**/*.md", base: "./src/content/blog" }), + schema: z.object({ + title: z.string(), + description: z.string(), + date: z.string(), + author: z.string().default("Quorla Operations"), + readTime: z.string().default("4 min read"), + }), +}); + +export const collections = { blog }; diff --git a/src/content/blog/multi-client-social-media-management.md b/src/content/blog/multi-client-social-media-management.md new file mode 100644 index 0000000..6109170 --- /dev/null +++ b/src/content/blog/multi-client-social-media-management.md @@ -0,0 +1,48 @@ +--- +title: "How Agencies Manage 25+ Client Accounts Without Posting the Wrong Thing" +description: "The operational playbook for separating client content, credentials, and schedules when your agency scales past 10 retainers." +date: "2026-10-15" +author: "Quorla Operations" +readTime: "5 min read" +--- + +When an agency manages three clients, shared spreadsheets and Slack channels work. When you scale to 25 accounts across Instagram, TikTok, Facebook, and YouTube, that setup falls apart. + +The failure mode is almost always the same: a designer drafts a post for Client A, accidentally attaches the caption intended for Client B, and schedules it. By the time someone notices, it has already been published to thousands of followers. + +Here is how disciplined marketing agencies structure their operations to make accidental cross-posting virtually impossible. + +## 1. Eliminate shared platform logins + +Never share master Instagram or TikTok passwords in a team password manager. Every time five people share a single direct login: + +- Anyone can post directly from a phone at 11:00 PM without oversight. +- Platform security systems flag simultaneous logins from multiple IP addresses, triggering checkpoint locks and SMS verification loops. +- Offboarding an employee requires changing passwords across dozens of client accounts and re-authenticating every device. + +Instead, authenticate client accounts once using OAuth. Team members should only ever access the social channels through their assigned agency user role. + +## 2. Separate asset libraries at the database level + +Most social media tools treat media storage as one big media pool with tags. That is dangerous. If a creative director searches for "Coffee_Promo_Final.mp4", they should only see assets belonging to Green Corner Café, not another hospitality client. + +Client workspaces should be completely walled off. If an editor is working in one client's workspace, the interface should only display that client's content, drafts, and past campaigns. + +## 3. Human sign-off before anything queues + +Drafting and publishing are two completely separate responsibilities: + +- **Drafting:** Creative teams, freelance photographers, and copywriters assemble the captions, video cuts, hashtags, and proposed times. +- **Approving:** An agency administrator reviews the exact media, cropped dimensions, platform-specific tags, and copy. + +Nothing enters the publishing queue without this explicit sign-off. If a post has not been approved by an admin, the system simply refuses to send it. + +## 4. Respect the client's clock, not your agency's + +If your team is in Toronto and your client runs a boutique gym in Vancouver, scheduling a morning workout announcement for 7:00 AM Eastern means it posts at 4:00 AM local time. Nobody in Vancouver sees it. + +Every client account must run on its own IANA timezone schedule. When your team plans a week, they should schedule posts in the client's local business hours. + +## Summary + +Scaling an agency's social media operations is not about working faster; it is about building structural barriers against human error. When workspaces are isolated and every post requires explicit admin approval, your team can scale client accounts without the constant anxiety of a public mistake. diff --git a/src/content/blog/social-media-time-zone-scheduling.md b/src/content/blog/social-media-time-zone-scheduling.md new file mode 100644 index 0000000..22b55b0 --- /dev/null +++ b/src/content/blog/social-media-time-zone-scheduling.md @@ -0,0 +1,38 @@ +--- +title: "Managing Social Media Schedules Across Multiple Client Time Zones" +description: "Why timezone conversion errors happen and how marketing agencies eliminate regional scheduling mistakes." +date: "2026-10-21" +author: "Quorla Operations" +readTime: "4 min read" +--- + +If all your agency's clients are located in your own city, scheduling social posts is simple: you pick 11:30 AM, and it goes out at 11:30 AM. + +The moment you sign your first client two time zones away, your team is forced into constant mental conversions. + +## The manual conversion trap + +Consider an agency based in Waterloo, Ontario (Eastern Time) managing social accounts for: + +- A local café in Toronto (Eastern Time: UTC-4) +- A medical clinic in Calgary (Mountain Time: UTC-6) +- A surfboard brand in San Diego (Pacific Time: UTC-7) +- An architecture firm in London, UK (GMT: UTC+1) + +If an account coordinator wants a lunch promo to publish at 12:00 PM for the San Diego brand, they must calculate that 12:00 PM Pacific is 3:00 PM Eastern. + +Add daylight saving changes—which do not happen on the same calendar weekend across North America and Europe—and mistakes become frequent. A post meant for an afternoon commute goes out in the middle of the working morning. + +## The solution: Client-local business clocks + +Social management tools built for agencies should never ask team members to calculate timezone offsets. + +In Quorla: + +1. **Client Workspace Timezone Configuration:** When you create a client workspace, you set their physical business location (e.g., `America/Los_Angeles` or `Europe/London`). +2. **Local Calendar Scheduling:** When a team member schedules a post for that client, the date and time picker reflects that client's municipal clock. +3. **Automated Offset Handling:** Quorla automatically computes the UTC timestamp at the exact moment of execution, accounting for local daylight saving transitions. + +## Outcome: Predictable audience engagement + +When posts go live at the intended local hour, engagement metrics stabilize. Your team stops wasting time double-checking clocks and calculating offsets, and your clients get reliable publishing in their home market. diff --git a/src/content/blog/why-client-approval-workflows-matter.md b/src/content/blog/why-client-approval-workflows-matter.md new file mode 100644 index 0000000..3690e04 --- /dev/null +++ b/src/content/blog/why-client-approval-workflows-matter.md @@ -0,0 +1,40 @@ +--- +title: "Why Strict Approval Gates Matter for Multi-Platform Agencies" +description: "Why optional approval toggles fail and why human-in-the-loop review protects client retainers." +date: "2026-10-18" +author: "Quorla Operations" +readTime: "4 min read" +--- + +Most social media management software treats approval as an afterthought—a notification badge or an optional toggle that can be bypassed whenever someone is in a rush. + +For an agency, that design flaw is a liability waiting to happen. + +## The difference between drafting and approving + +In a healthy agency workflow, creative creation and final publishing authority must be decoupled: + +1. **Designers and video editors** focus on visual hooks, aspect ratio formatting (9:16 vs 1:1), and color correction. +2. **Copywriters** draft headlines, platform-specific calls to action, and relevant hashtags. +3. **Admins and Account Directors** verify legal disclosures, branded content tags, client brand voice, and schedule timing. + +When tools allow draft creators to schedule directly to live feeds, errors inevitably slip through. A typo in a phone number, an uncredited music track, or an unapproved promotional discount can damage a client relationship that took months to build. + +## What a real approval gate looks like + +A true approval workflow requires three distinct criteria: + +### 1. Pixel-exact preview +Reviewers cannot sign off on an abstract text outline. They must see the rendered video thumbnail, the exact crop on vertical screens, and how the caption breaks across Instagram, TikTok, and Facebook feeds. + +### 2. Platform policy compliance +Before approving a video for TikTok or Instagram, the interface should confirm compliance with commercial music usage and branded content declarations. For instance, TikTok requires specific privacy and commercial disclosure checks before a post goes live. + +### 3. Non-bypassable queue +In Quorla, an unapproved post simply cannot enter the active dispatch queue. There is no "auto-schedule anyway" override. An authorized admin must click approve. + +## Protecting your retainers + +Agency churn rarely happens because of an algorithmic shift. It happens when a client feels their brand was misrepresented or embarrassed by a sloppy post. + +By enforcing an uncompromising approval gate, you give both your internal team and your clients the confidence that nothing goes live without thorough human review. diff --git a/src/layouts/Base.astro b/src/layouts/Base.astro index 3589a0a..69e4523 100644 --- a/src/layouts/Base.astro +++ b/src/layouts/Base.astro @@ -1,17 +1,24 @@ --- import "../styles/global.css"; +import Header from "../components/Header.astro"; +import Footer from "../components/Footer.astro"; interface Props { title: string; description?: string; + ogType?: string; } + const { title, - description = "Quorla helps marketing agencies plan, approve and publish client content to Instagram, Facebook, TikTok, YouTube, LinkedIn, Google Business Profile and more, with reports clients can read.", + description = "Quorla is social media management for marketing agencies. Plan multi-client campaigns, enforce strict admin approvals, and publish in client time zones.", + ogType = "website", } = Astro.props; -const canonical = new URL(Astro.url.pathname, Astro.site); -const APP = "https://app.quorlasocial.com"; + +const canonical = new URL(Astro.url.pathname, Astro.site || "https://quorlasocial.com"); +const currentPath = Astro.url.pathname; --- + @@ -19,43 +26,78 @@ const APP = "https://app.quorlasocial.com"; {title} - + + + + + + + + + + - + + + + -
-
- Quorla - -
-
+ + +
-
+
- +