SMS Marketing Campaign Builder
Run ID: 69c955e1a17964d77e86e1a32026-03-29Marketing
PantheraHive BOS
BOS Dashboard

Design SMS marketing campaigns with opt-in flows, drip sequences, segmentation, and compliance (TCPA).

As part of your "SMS Marketing Campaign Builder" workflow, this deliverable outlines a comprehensive design for your SMS marketing campaigns, incorporating best practices for opt-in flows, drip sequences, segmentation, and critical TCPA compliance.


SMS Marketing Campaign Design: Comprehensive Strategy

This document provides a detailed framework for launching and managing effective, compliant SMS marketing campaigns.

1. Opt-in Flow Design & TCPA Compliance

The foundation of any successful SMS campaign is a robust, compliant opt-in process. This ensures you have explicit consent to message subscribers, mitigating legal risks and building a quality audience.

1.1 Opt-in Methods

We recommend implementing a multi-channel approach to capture subscribers effectively:

  • Keyword Opt-in (SMS to Short Code/Long Code): Users text a specific keyword (e.g., "JOIN", "SAVE") to your dedicated SMS number.

* Example: "Text SAVE to 12345 to get 15% off your first order!"

  • Web Form Integration: Embed an SMS opt-in field on your website (e.g., homepage, checkout, pop-ups).

* Example: "Enter your mobile number to receive exclusive deals and updates!" (Checkbox for consent required).

  • Point-of-Sale (POS) Opt-in: Capture phone numbers during in-store transactions.

* Example: "Would you like to receive SMS alerts for new arrivals and special offers? Text 'YES' to the prompt on the card reader."

  • QR Code Campaigns: Place QR codes in physical locations (posters, packaging) that link to a mobile-friendly opt-in page or pre-fill a text message.

1.2 Initial Opt-in Confirmation Message (TCPA Compliant)

Immediately after a user opts in (regardless of method), they must receive a confirmation message that includes specific, legally required disclosures. This message serves as proof of consent and provides essential information.

Key Requirements for Opt-in Confirmation Message:

  • Confirmation of Subscription: Clearly states the user has subscribed.
  • Brand Identification: Identifies your company.
  • Message Frequency: Specifies how often users can expect messages (e.g., "max 4 msg/month").
  • "STOP" Instructions: Clear instructions on how to opt-out (e.g., "Text STOP to cancel").
  • "HELP" Instructions: Clear instructions on how to get help (e.g., "Text HELP for info").
  • Message & Data Rates: A disclaimer about potential carrier charges.
  • Link to Terms & Conditions/Privacy Policy: Essential for full disclosure.

Example Opt-in Confirmation Message:

Welcome to Meridian Solutions! You're subscribed to receive exclusive offers & updates. Msg freq varies. Msg&Data rates may apply. Text STOP to cancel, HELP for help. [Link to T&Cs/Privacy Policy]

1.3 Double Opt-in (Recommended Best Practice)

While not always legally mandatory for all types of SMS marketing, implementing a double opt-in process is a highly recommended best practice. It significantly enhances compliance, reduces spam complaints, and ensures a higher quality subscriber list.

Double Opt-in Flow Example:

  1. User Initiates Opt-in: User texts "SAVE" to 12345 or enters number on web form.
  2. Initial Opt-in Request Message:

Meridian Solutions: Reply YES to confirm you want to receive exclusive offers & updates. Msg freq varies. Msg&Data rates may apply. Text STOP to cancel, HELP for help. [Link to T&Cs/Privacy Policy]

  1. User Confirms: User replies "YES".
  2. Final Confirmation Message: (Same as 1.2, but confirms the second step of consent)

Welcome to Meridian Solutions! You're subscribed to receive exclusive offers & updates. Msg freq varies. Msg&Data rates may apply. Text STOP to cancel, HELP for help. [Link to T&Cs/Privacy Policy]

1.4 Record Keeping

Maintain meticulous records of every opt-in, including:

  • Date and time of consent.
  • Method of consent (e.g., keyword, web form, POS).
  • The specific language used to obtain consent.
  • The phone number that opted in.
  • IP address (for web opt-ins).

2. Drip Sequence Design: Welcome Series Example

Drip sequences are automated series of messages triggered by specific events (e.g., opt-in, purchase, abandoned cart). A well-designed welcome series is crucial for onboarding new subscribers and immediately providing value.

2.1 Welcome Series Overview

Goal: Introduce new subscribers to your brand, highlight key benefits, and drive an initial conversion or engagement.

Trigger: Immediate upon successful opt-in confirmation.

Cadence: Typically 2-4 messages over 3-7 days.

2.2 Message 1: Welcome & Value Proposition (Immediately after opt-in)

  • Purpose: Reiterate thanks, confirm membership, set expectations, and deliver initial promised value (e.g., discount code).
  • Content:

Hey [Subscriber Name, if available]! Thanks for joining Meridian Solutions! Here's your 15% off code: WELCOME15. Shop now: [Link to Website] Enjoy exclusive deals & early access! Msg&Data rates apply. STOP to opt out.

2.3 Message 2: Product/Service Highlight or Benefit (24-48 hours after Message 1)

  • Purpose: Showcase a popular product, service, or a key unique selling proposition (USP) of your brand.
  • Content (Option A - Product Highlight):

Discover our best-sellers! From [Product Category 1] to [Product Category 2], find your next favorite. Shop here: [Link to Bestsellers Page] Don't forget your WELCOME15 code!

  • Content (Option B - Brand Story/Benefit):

Did you know Meridian Solutions is committed to [Key Value, e.g., sustainable practices]? Learn more about our mission & products: [Link to About Us/Mission Page]

2.4 Message 3: Call to Action & Urgency (48-72 hours after Message 2)

  • Purpose: Drive a conversion by creating a sense of urgency or offering a limited-time incentive.
  • Content:

Last chance! Your WELCOME15 code expires in 24 hours. Don't miss out on amazing savings. Shop now: [Link to Product Page] What are you waiting for?

2.5 Considerations for Other Drip Sequences

  • Abandoned Cart Series: Remind customers about items left in their cart, potentially with an incentive.
  • Post-Purchase Series: Thank customers, provide tracking info, suggest complementary products, or request reviews.
  • Re-engagement Series: Target inactive subscribers with special offers to bring them back.
  • Event/Webinar Series: Send reminders, links, and follow-ups for specific events.

3. Segmentation Strategy

Segmentation allows you to send highly relevant and personalized messages, leading to higher engagement and conversion rates.

3.1 Why Segment?

  • Increased Relevance: Messages resonate more when tailored to specific interests.
  • Higher Engagement: Improved open rates, click-through rates, and conversion rates.
  • Reduced Opt-Outs: Subscribers are less likely to leave if content is valuable to them.
  • Better ROI: More efficient spending of marketing resources.

3.2 Key Segmentation Criteria

  • Demographics: Age, gender, location (if collected and relevant).
  • Purchase History: First-time buyer, repeat customer, high-value customer, specific product categories purchased.
  • Browsing Behavior: Viewed specific products, visited certain pages, abandoned cart.
  • Engagement Level: Active (frequently clicks), inactive (hasn't clicked in X days), new subscriber.
  • Opt-in Source: Keyword used, web form (e.g., "newsletter" vs. "deals").
  • Customer Lifecycle Stage: Prospect, new customer, loyal customer, at-risk customer.

3.3 Example Segments & Targeted Content

  • Segment: New Customers (First Purchase within 30 days)

* Content: "Thank you for your recent purchase! Here are some tips for getting started with your new [Product Name]: [Link to Guide]" or "Enjoying your [Product Name]? Explore complementary items: [Link to Related Products]"

  • Segment: High-Value Customers (Purchases > $500 in 6 months)

* Content: "As a valued Meridian Solutions VIP, enjoy early access to our new [Product Line]! Shop now: [Link] Limited stock!"

  • Segment: Abandoned Cart (Items in cart for > 24 hours)

* Content: "Still thinking about your [Item Name]? It's waiting for you! Complete your order & get 10% off: [Link to Cart]"

  • Segment: Inactive Subscribers (No clicks/purchases in 90 days)

* Content: "We miss you! Here's 20% off your next order to welcome you back: [Discount Code] Shop our latest arrivals: [Link]"

  • Segment: Location-Based (e.g., for local events/store openings)

* Content: "Hey [City Name]! Our new store is opening on [Date]! Join us for grand opening specials & giveaways: [Link to Event Info]"

4. TCPA Compliance Checklist & Best Practices

Adherence to the Telephone Consumer Protection Act (TCPA) is non-negotiable for SMS marketing in the US. Non-compliance can result in substantial fines.

4.1 Express Written Consent

  • Mandatory: You must obtain "express written consent" from subscribers before sending any marketing text messages. This means a clear affirmative action (e.g., checking a box, texting a keyword).
  • Clear Disclosure: Consent language must clearly state that the subscriber agrees to receive text messages from your brand, that messages may be sent using an autodialer, and that consent is not a condition of purchase.

4.2 Clear Disclosures

  • Initial Opt-in Message: As detailed in Section 1.2, this message must include your brand name, message frequency, "STOP" and "HELP" instructions, and message/data rates disclaimer.
  • Terms & Conditions/Privacy Policy: Provide a clear link to these documents in your opt-in flow and initial confirmation message.

4.3 Opt-Out Mechanism

  • Easy & Free: Subscribers must be able to opt-out at any time by simply texting "STOP," "END," "CANCEL," "UNSUBSCRIBE," or "QUIT" to your number.
  • Immediate Confirmation: Upon receiving an opt-out request, send an immediate confirmation message:

You have successfully unsubscribed from Meridian Solutions alerts. You will no longer receive messages. Reply START to resubscribe.

  • Global Opt-Out: Ensure that an opt-out removes the subscriber from all future marketing messages from your brand.

4.4 Frequency & Quiet Hours

  • Reasonable Frequency: Avoid overwhelming subscribers. Adhere to the stated frequency in your opt-in message. Over-messaging is a primary reason for opt-outs and complaints.
  • Quiet Hours: Do not send messages during standard quiet hours (typically 9 PM to 8 AM local time of the recipient). Implement geo-targeting to respect time zones.

4.5 Data Privacy

  • Protect Subscriber Data: Safeguard phone numbers and other personal information. Do not share or sell subscriber lists without explicit consent.
  • Privacy Policy: Ensure your privacy policy clearly outlines how subscriber data is collected, used, and protected.

4.6 Regular Audits

  • Compliance Review: Periodically review your opt-in processes, message content, and opt-out handling to ensure ongoing compliance with TCPA and carrier guidelines.
  • Record Keeping: Continuously maintain and update your opt-in records.

5. Analytics & Optimization

To ensure your campaigns are performing optimally, continuous monitoring and testing are essential.

5.1 Key Performance Indicators (KPIs)

  • Opt-in Rate: Percentage of visitors/leads who subscribe.
  • Unsubscribe Rate: Percentage of subscribers who opt out.
  • Click-Through Rate (CTR): Percentage of recipients who click on a link in your message.
  • Conversion Rate: Percentage of recipients who complete a desired action (e.g., purchase) after clicking a link.
  • Return on Investment (ROI): Revenue generated directly from SMS campaigns versus cost.
  • Message Delivery Rate: Percentage of messages successfully delivered.
  • Response Rate: For two-way messaging, the percentage of subscribers who respond to a query.

5.2 A/B Testing Strategy

Systematic A/B testing helps refine your campaigns for better performance.

  • Message Copy: Test different headlines, calls to action (CTAs), and overall message tone.
  • Offers/Incentives: Compare the effectiveness of different discounts, free shipping, or exclusive access.
  • Timing: Experiment
gemini Output

SMS Marketing Campaign Design & Implementation Strategy

This document outlines a comprehensive, detailed strategy for designing and implementing your SMS marketing campaigns, focusing on robust opt-in flows, effective drip sequences, precise segmentation, and critical TCPA compliance. Our goal is to create high-performing campaigns that are both engaging and legally sound.


1. Opt-in Flow Design: Building Your Subscriber Base Compliantly

A well-designed opt-in flow is the foundation of a successful and compliant SMS marketing program. It ensures you collect consent legally and effectively.

  • Primary Opt-in Methods:

* Keyword Opt-in (SMS-to-Join):

* Mechanism: Users text a specific keyword (e.g., "DEALS", "JOIN") to your dedicated short code or long code.

* Initial Call-to-Action (CTA) Placement:

* Website banners/pop-ups

* Social media posts

* In-store signage (point-of-sale, posters)

* Print ads, flyers

* QR codes linked to the keyword instruction.

* Example CTA: "Text DEALS to MRDN for exclusive offers & updates!"

* Webform Opt-in:

* Mechanism: Users submit their phone number through a webform on your website, landing page, or checkout process.

* Placement: Dedicated landing pages, website footers, checkout pages, account creation forms.

* Required Disclosure: Directly below the phone number input field, clearly state what they are signing up for, frequency, "Msg & data rates may apply," and opt-out instructions.

  • Double Opt-in (Highly Recommended for Compliance & Quality):

* Process:

1. Initial Opt-in: User texts keyword OR submits webform.

2. Confirmation Request (Automated Reply): Immediately send a message asking the user to confirm their subscription.

* Example: "You're signing up for Meridian Solutions SMS alerts. Reply YES to confirm. Msg & data rates may apply. Max 4 msgs/month. Text STOP to cancel."

3. Welcome Message: Only after the user replies "YES" (or equivalent confirmation), send your welcome message.

  • Essential Opt-in Messaging Elements (for ALL initial disclosures and confirmation messages):

* Your Brand Name: Clearly identify who is sending the messages.

* Purpose: State what types of messages they will receive (e.g., "exclusive offers," "order updates," "news & events").

* Message Frequency: Provide an estimate (e.g., "Max 4 msgs/month," "2-3 msgs/week").

* "Message and data rates may apply." (Mandatory)

* Opt-out Instructions: Clearly state how to opt-out (e.g., "Text STOP to cancel," "Reply STOP to end").

* Terms & Conditions/Privacy Policy Link: (Optional but recommended for webforms)


2. Drip Sequence Strategy: Engaging Subscribers with Automated Messages

Drip sequences are automated series of messages triggered by specific events or time intervals, designed to nurture leads, drive sales, and build customer loyalty.

  • 1. Welcome Series (Post Opt-in):

* Trigger: User successfully confirms opt-in.

* Goal: Greet new subscribers, introduce your brand, and provide initial value.

* Sequence Example (3 Messages over 7 days):

* Message 1 (Immediate): "Welcome to Meridian Solutions! Thanks for joining. Here's 10% off your first order: [Link to unique code/website]. Enjoy! Reply STOP to cancel."

* Message 2 (24-48 hours later): "Did you know Meridian Solutions offers [unique product/service feature]? Explore our bestsellers: [Link]. Reply STOP to cancel."

* Message 3 (5-7 days later): "We love our customers! Check out what others are saying about us: [Link to testimonials/reviews]. Or, shop now: [Link]. Reply STOP to cancel."

  • 2. Abandoned Cart Recovery (E-commerce Specific):

* Trigger: User adds items to cart but does not complete purchase.

* Goal: Remind users of their cart and encourage completion.

* Sequence Example (2 Messages over 24-48 hours):

* Message 1 (1-2 hours after abandonment): "Hey [Customer Name], you left some great items in your cart! Finish your order here: [Link to cart]. Reply STOP to cancel."

* Message 2 (24 hours after abandonment, if still open): "Still thinking about your [Item Name]? Use code CART15 for 15% off your order! [Link to cart]. Offer valid for 24 hrs. Reply STOP to cancel."

  • 3. Post-Purchase Follow-up:

* Trigger: User completes a purchase.

* Goal: Enhance customer experience, drive repeat business, solicit reviews.

* Sequence Example (2-3 Messages over 14 days):

* Message 1 (Order Confirmation/Shipping Update - transactional, but can be part of drip): "Your order #[Order Number] is confirmed! Track here: [Link]. Thanks for shopping with Meridian Solutions!"

* Message 2 (7 days after delivery): "Hope you're loving your new [Product Name]! Got a moment to share your feedback? [Link to review page]. Reply STOP to cancel."

* Message 3 (14 days after delivery): "Ready for more? Shop our related products and get 10% off your next order with code REPEAT10: [Link]. Reply STOP to cancel."

  • 4. Re-engagement Campaign:

* Trigger: Subscriber has not engaged (clicked, purchased) with SMS messages for a defined period (e.g., 60-90 days).

* Goal: Re-activate dormant subscribers or remove unengaged contacts.

* Sequence Example (2 Messages over 7 days):

* Message 1: "Long time no see, [Customer Name]! We miss you. Here's a special offer to welcome you back: [Link to exclusive deal]. Reply STOP to cancel."

* Message 2 (if no engagement after Message 1): "Still interested in exclusive offers from Meridian Solutions? Reply YES to stay subscribed or we'll remove you from our list in 48 hours. Reply STOP to cancel."


3. Segmentation Best Practices: Delivering Personalized & Relevant Content

Segmentation allows you to send targeted messages to specific groups of subscribers, significantly increasing engagement and conversion rates.

  • Key Segmentation Criteria:

* Demographics: (If collected at opt-in or from CRM) Age, gender, location (e.g., for local promotions).

* Purchase History:

* First-time vs. Repeat Buyers: Tailor offers.

* Product Categories: Promote related products based on past purchases.

* Average Order Value (AOV): High-value customers might receive exclusive previews.

* Last Purchase Date: Target with re-engagement or replenishment reminders.

* Engagement Level:

* Active: Recently clicked links, opened messages.

* Dormant: No engagement for X days (target with re-engagement drips).

* Opt-in Source: Where they subscribed (e.g., specific event, website pop-up) to tailor initial messages.

* Website Behavior (Requires CRM/SMS Platform Integration):

* Pages Visited: Target users who viewed specific product pages but didn't add to cart.

* Items Viewed: Send reminders or similar product recommendations.

* Customer Lifecycle Stage: New subscriber, active customer, loyal customer, at-risk customer.

  • Actionable Segmentation Examples:

* Birthday/Anniversary Offers: Send a special discount to subscribers on their birthday (if date collected).

* Location-Based Promotions: Alert customers in a specific city about a local event or store opening.

* Product Replenishment: Remind customers to reorder consumables based on typical usage cycles.

* VIP Programs: Offer exclusive access or discounts to your most loyal customers (e.g., those with 5+ purchases).

* Category-Specific Sales: Promote a sale on "Women's Shoes" only to subscribers who have previously shown interest in or purchased from that category.


4. TCPA Compliance Checklist: Ensuring Legal & Ethical Operations

The Telephone Consumer Protection Act (TCPA) is a critical federal law governing telemarketing calls and text messages. Strict adherence is mandatory to avoid significant penalties.

  • 1. Express Written Consent (The Cornerstone):

Requirement: You must obtain "express written consent" from every subscriber before* sending them any marketing or promotional text messages.

* How to Obtain:

* Digital Signature: A checkbox on a webform, clearly stating the user agrees to receive SMS marketing messages from your brand, with all necessary disclosures (see below).

* Keyword Opt-in: User texting a keyword to your short code, followed by a double opt-in confirmation.

Record Keeping: You must* maintain a clear, auditable record of consent for each subscriber, including the date, time, method of consent, and the specific disclosures presented to them. Keep these records for at least four years.

  • 2. Clear & Conspicuous Disclosure:

* Requirement: Before obtaining consent, subscribers must be fully informed about what they are signing up for.

* Mandatory Elements to Disclose:

* Identity: Clearly state who is sending the messages (your brand name).

* Purpose/Content: Explain the type of messages they will receive (e.g., "promotional offers," "alerts," "news").

* Frequency: Provide an estimated message frequency (e.g., "Max 4 msgs/month," "standard message frequency applies").

* "Message and data rates may apply." (Crucial and non-negotiable).

* Opt-out Method: How to revoke consent (e.g., "Text STOP to cancel," "Reply STOP to end").

* Terms & Conditions/Privacy Policy: Provide links if using webforms.

  • 3. Easy Opt-Out Mechanism:

Requirement: Every marketing SMS message must* include clear instructions on how to opt-out.

* Standard Keywords: "STOP," "END," "CANCEL," "UNSUBSCRIBE," "QUIT" must all function immediately and effectively.

* Confirmation: Upon receiving an opt-out request, send a single, final confirmation message (e.g., "You have been unsubscribed from Meridian Solutions alerts. You will no longer receive messages. Reply START to resubscribe."). Do not send any further marketing messages.

  • 4. Respecting Quiet Hours:

* Requirement: Do not send marketing text messages too early in the morning or too late at night.

* General Guideline: Adhere to 9:00 AM to 8:00 PM local time of the recipient.

* State-Specific Rules: Some states (e.g., Florida) have stricter quiet hour regulations; it's prudent to follow the most restrictive applicable rule.

  • 5. No Automated Dialing System (ATDS) Requirement for Consent:

While SMS platforms use automation, the TCPA focus is on consent for the message, not necessarily the technical means of sending. However, the express written consent* requirement is paramount for any marketing text messages sent using an ATDS.

  • 6. Do Not Call (DNC) Registry:

While primarily for voice calls, it's a good practice to cross-reference your SMS lists with the DNC registry if you also engage in voice telemarketing. For SMS, valid consent overrides DNC for your specific messages*.

  • 7. State-Specific Regulations:

* Be aware of emerging state-level regulations (e.g., Florida's updated TCPA-like

Copy all content
Full output as text
Download ZIP
IDE-ready project ZIP
Copy share link
Permanent URL for this run
Get Embed Code
Embed this result on any website
Print / Save PDF
Use browser print dialog
\n\n\n"); var hasSrcMain=Object.keys(extracted).some(function(k){return k.indexOf("src/main")>=0;}); if(!hasSrcMain) zip.file(folder+"src/main."+ext,"import React from 'react'\nimport ReactDOM from 'react-dom/client'\nimport App from './App'\nimport './index.css'\n\nReactDOM.createRoot(document.getElementById('root')!).render(\n \n \n \n)\n"); var hasSrcApp=Object.keys(extracted).some(function(k){return k==="src/App."+ext||k==="App."+ext;}); if(!hasSrcApp) zip.file(folder+"src/App."+ext,"import React from 'react'\nimport './App.css'\n\nfunction App(){\n return(\n
\n
\n

"+slugTitle(pn)+"

\n

Built with PantheraHive BOS

\n
\n
\n )\n}\nexport default App\n"); zip.file(folder+"src/index.css","*{margin:0;padding:0;box-sizing:border-box}\nbody{font-family:system-ui,-apple-system,sans-serif;background:#f0f2f5;color:#1a1a2e}\n.app{min-height:100vh;display:flex;flex-direction:column}\n.app-header{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;padding:40px}\nh1{font-size:2.5rem;font-weight:700}\n"); zip.file(folder+"src/App.css",""); zip.file(folder+"src/components/.gitkeep",""); zip.file(folder+"src/pages/.gitkeep",""); zip.file(folder+"src/hooks/.gitkeep",""); Object.keys(extracted).forEach(function(p){ var fp=p.startsWith("src/")?p:"src/"+p; zip.file(folder+fp,extracted[p]); }); zip.file(folder+"README.md","# "+slugTitle(pn)+"\n\nGenerated by PantheraHive BOS.\n\n## Setup\n\`\`\`bash\nnpm install\nnpm run dev\n\`\`\`\n\n## Build\n\`\`\`bash\nnpm run build\n\`\`\`\n\n## Open in IDE\nOpen the project folder in VS Code or WebStorm.\n"); zip.file(folder+".gitignore","node_modules/\ndist/\n.env\n.DS_Store\n*.local\n"); } /* --- Vue (Vite + Composition API + TypeScript) --- */ function buildVue(zip,folder,app,code,panelTxt){ var pn=pkgName(app); var C=cc(pn); var extracted=extractCode(panelTxt); zip.file(folder+"package.json",'{\n "name": "'+pn+'",\n "version": "0.0.0",\n "type": "module",\n "scripts": {\n "dev": "vite",\n "build": "vue-tsc -b && vite build",\n "preview": "vite preview"\n },\n "dependencies": {\n "vue": "^3.5.13",\n "vue-router": "^4.4.5",\n "pinia": "^2.3.0",\n "axios": "^1.7.9"\n },\n "devDependencies": {\n "@vitejs/plugin-vue": "^5.2.1",\n "typescript": "~5.7.3",\n "vite": "^6.0.5",\n "vue-tsc": "^2.2.0"\n }\n}\n'); zip.file(folder+"vite.config.ts","import { defineConfig } from 'vite'\nimport vue from '@vitejs/plugin-vue'\nimport { resolve } from 'path'\n\nexport default defineConfig({\n plugins: [vue()],\n resolve: { alias: { '@': resolve(__dirname,'src') } }\n})\n"); zip.file(folder+"tsconfig.json",'{"files":[],"references":[{"path":"./tsconfig.app.json"},{"path":"./tsconfig.node.json"}]}\n'); zip.file(folder+"tsconfig.app.json",'{\n "compilerOptions":{\n "target":"ES2020","useDefineForClassFields":true,"module":"ESNext","lib":["ES2020","DOM","DOM.Iterable"],\n "skipLibCheck":true,"moduleResolution":"bundler","allowImportingTsExtensions":true,\n "isolatedModules":true,"moduleDetection":"force","noEmit":true,"jsxImportSource":"vue",\n "strict":true,"paths":{"@/*":["./src/*"]}\n },\n "include":["src/**/*.ts","src/**/*.d.ts","src/**/*.tsx","src/**/*.vue"]\n}\n'); zip.file(folder+"env.d.ts","/// \n"); zip.file(folder+"index.html","\n\n\n \n \n "+slugTitle(pn)+"\n\n\n
\n \n\n\n"); var hasMain=Object.keys(extracted).some(function(k){return k==="src/main.ts"||k==="main.ts";}); if(!hasMain) zip.file(folder+"src/main.ts","import { createApp } from 'vue'\nimport { createPinia } from 'pinia'\nimport App from './App.vue'\nimport './assets/main.css'\n\nconst app = createApp(App)\napp.use(createPinia())\napp.mount('#app')\n"); var hasApp=Object.keys(extracted).some(function(k){return k.indexOf("App.vue")>=0;}); if(!hasApp) zip.file(folder+"src/App.vue","\n\n\n\n\n"); zip.file(folder+"src/assets/main.css","*{margin:0;padding:0;box-sizing:border-box}body{font-family:system-ui,sans-serif;background:#fff;color:#213547}\n"); zip.file(folder+"src/components/.gitkeep",""); zip.file(folder+"src/views/.gitkeep",""); zip.file(folder+"src/stores/.gitkeep",""); Object.keys(extracted).forEach(function(p){ var fp=p.startsWith("src/")?p:"src/"+p; zip.file(folder+fp,extracted[p]); }); zip.file(folder+"README.md","# "+slugTitle(pn)+"\n\nGenerated by PantheraHive BOS.\n\n## Setup\n\`\`\`bash\nnpm install\nnpm run dev\n\`\`\`\n\n## Build\n\`\`\`bash\nnpm run build\n\`\`\`\n\nOpen in VS Code or WebStorm.\n"); zip.file(folder+".gitignore","node_modules/\ndist/\n.env\n.DS_Store\n*.local\n"); } /* --- Angular (v19 standalone) --- */ function buildAngular(zip,folder,app,code,panelTxt){ var pn=pkgName(app); var C=cc(pn); var sel=pn.replace(/_/g,"-"); var extracted=extractCode(panelTxt); zip.file(folder+"package.json",'{\n "name": "'+pn+'",\n "version": "0.0.0",\n "scripts": {\n "ng": "ng",\n "start": "ng serve",\n "build": "ng build",\n "test": "ng test"\n },\n "dependencies": {\n "@angular/animations": "^19.0.0",\n "@angular/common": "^19.0.0",\n "@angular/compiler": "^19.0.0",\n "@angular/core": "^19.0.0",\n "@angular/forms": "^19.0.0",\n "@angular/platform-browser": "^19.0.0",\n "@angular/platform-browser-dynamic": "^19.0.0",\n "@angular/router": "^19.0.0",\n "rxjs": "~7.8.0",\n "tslib": "^2.3.0",\n "zone.js": "~0.15.0"\n },\n "devDependencies": {\n "@angular-devkit/build-angular": "^19.0.0",\n "@angular/cli": "^19.0.0",\n "@angular/compiler-cli": "^19.0.0",\n "typescript": "~5.6.0"\n }\n}\n'); zip.file(folder+"angular.json",'{\n "$schema": "./node_modules/@angular/cli/lib/config/schema.json",\n "version": 1,\n "newProjectRoot": "projects",\n "projects": {\n "'+pn+'": {\n "projectType": "application",\n "root": "",\n "sourceRoot": "src",\n "prefix": "app",\n "architect": {\n "build": {\n "builder": "@angular-devkit/build-angular:application",\n "options": {\n "outputPath": "dist/'+pn+'",\n "index": "src/index.html",\n "browser": "src/main.ts",\n "tsConfig": "tsconfig.app.json",\n "styles": ["src/styles.css"],\n "scripts": []\n }\n },\n "serve": {"builder":"@angular-devkit/build-angular:dev-server","configurations":{"production":{"buildTarget":"'+pn+':build:production"},"development":{"buildTarget":"'+pn+':build:development"}},"defaultConfiguration":"development"}\n }\n }\n }\n}\n'); zip.file(folder+"tsconfig.json",'{\n "compileOnSave": false,\n "compilerOptions": {"baseUrl":"./","outDir":"./dist/out-tsc","forceConsistentCasingInFileNames":true,"strict":true,"noImplicitOverride":true,"noPropertyAccessFromIndexSignature":true,"noImplicitReturns":true,"noFallthroughCasesInSwitch":true,"paths":{"@/*":["src/*"]},"skipLibCheck":true,"esModuleInterop":true,"sourceMap":true,"declaration":false,"experimentalDecorators":true,"moduleResolution":"bundler","importHelpers":true,"target":"ES2022","module":"ES2022","useDefineForClassFields":false,"lib":["ES2022","dom"]},\n "references":[{"path":"./tsconfig.app.json"}]\n}\n'); zip.file(folder+"tsconfig.app.json",'{\n "extends":"./tsconfig.json",\n "compilerOptions":{"outDir":"./dist/out-tsc","types":[]},\n "files":["src/main.ts"],\n "include":["src/**/*.d.ts"]\n}\n'); zip.file(folder+"src/index.html","\n\n\n \n "+slugTitle(pn)+"\n \n \n \n\n\n \n\n\n"); zip.file(folder+"src/main.ts","import { bootstrapApplication } from '@angular/platform-browser';\nimport { appConfig } from './app/app.config';\nimport { AppComponent } from './app/app.component';\n\nbootstrapApplication(AppComponent, appConfig)\n .catch(err => console.error(err));\n"); zip.file(folder+"src/styles.css","* { margin: 0; padding: 0; box-sizing: border-box; }\nbody { font-family: system-ui, -apple-system, sans-serif; background: #f9fafb; color: #111827; }\n"); var hasComp=Object.keys(extracted).some(function(k){return k.indexOf("app.component")>=0;}); if(!hasComp){ zip.file(folder+"src/app/app.component.ts","import { Component } from '@angular/core';\nimport { RouterOutlet } from '@angular/router';\n\n@Component({\n selector: 'app-root',\n standalone: true,\n imports: [RouterOutlet],\n templateUrl: './app.component.html',\n styleUrl: './app.component.css'\n})\nexport class AppComponent {\n title = '"+pn+"';\n}\n"); zip.file(folder+"src/app/app.component.html","
\n
\n

"+slugTitle(pn)+"

\n

Built with PantheraHive BOS

\n
\n \n
\n"); zip.file(folder+"src/app/app.component.css",".app-header{display:flex;flex-direction:column;align-items:center;justify-content:center;min-height:60vh;gap:16px}h1{font-size:2.5rem;font-weight:700;color:#6366f1}\n"); } zip.file(folder+"src/app/app.config.ts","import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { provideRouter } from '@angular/router';\nimport { routes } from './app.routes';\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n provideRouter(routes)\n ]\n};\n"); zip.file(folder+"src/app/app.routes.ts","import { Routes } from '@angular/router';\n\nexport const routes: Routes = [];\n"); Object.keys(extracted).forEach(function(p){ var fp=p.startsWith("src/")?p:"src/"+p; zip.file(folder+fp,extracted[p]); }); zip.file(folder+"README.md","# "+slugTitle(pn)+"\n\nGenerated by PantheraHive BOS.\n\n## Setup\n\`\`\`bash\nnpm install\nng serve\n# or: npm start\n\`\`\`\n\n## Build\n\`\`\`bash\nng build\n\`\`\`\n\nOpen in VS Code with Angular Language Service extension.\n"); zip.file(folder+".gitignore","node_modules/\ndist/\n.env\n.DS_Store\n*.local\n.angular/\n"); } /* --- Python --- */ function buildPython(zip,folder,app,code){ var title=slugTitle(app); var pn=pkgName(app); var src=code.replace(/^\`\`\`[\w]*\n?/m,"").replace(/\n?\`\`\`$/m,"").trim(); var reqMap={"numpy":"numpy","pandas":"pandas","sklearn":"scikit-learn","tensorflow":"tensorflow","torch":"torch","flask":"flask","fastapi":"fastapi","uvicorn":"uvicorn","requests":"requests","sqlalchemy":"sqlalchemy","pydantic":"pydantic","dotenv":"python-dotenv","PIL":"Pillow","cv2":"opencv-python","matplotlib":"matplotlib","seaborn":"seaborn","scipy":"scipy"}; var reqs=[]; Object.keys(reqMap).forEach(function(k){if(src.indexOf("import "+k)>=0||src.indexOf("from "+k)>=0)reqs.push(reqMap[k]);}); var reqsTxt=reqs.length?reqs.join("\n"):"# add dependencies here\n"; zip.file(folder+"main.py",src||"# "+title+"\n# Generated by PantheraHive BOS\n\nprint(title+\" loaded\")\n"); zip.file(folder+"requirements.txt",reqsTxt); zip.file(folder+".env.example","# Environment variables\n"); zip.file(folder+"README.md","# "+title+"\n\nGenerated by PantheraHive BOS.\n\n## Setup\n\`\`\`bash\npython3 -m venv .venv\nsource .venv/bin/activate\npip install -r requirements.txt\n\`\`\`\n\n## Run\n\`\`\`bash\npython main.py\n\`\`\`\n"); zip.file(folder+".gitignore",".venv/\n__pycache__/\n*.pyc\n.env\n.DS_Store\n"); } /* --- Node.js --- */ function buildNode(zip,folder,app,code){ var title=slugTitle(app); var pn=pkgName(app); var src=code.replace(/^\`\`\`[\w]*\n?/m,"").replace(/\n?\`\`\`$/m,"").trim(); var depMap={"mongoose":"^8.0.0","dotenv":"^16.4.5","axios":"^1.7.9","cors":"^2.8.5","bcryptjs":"^2.4.3","jsonwebtoken":"^9.0.2","socket.io":"^4.7.4","uuid":"^9.0.1","zod":"^3.22.4","express":"^4.18.2"}; var deps={}; Object.keys(depMap).forEach(function(k){if(src.indexOf(k)>=0)deps[k]=depMap[k];}); if(!deps["express"])deps["express"]="^4.18.2"; var pkgJson=JSON.stringify({"name":pn,"version":"1.0.0","main":"src/index.js","scripts":{"start":"node src/index.js","dev":"nodemon src/index.js"},"dependencies":deps,"devDependencies":{"nodemon":"^3.0.3"}},null,2)+"\n"; zip.file(folder+"package.json",pkgJson); var fallback="const express=require(\"express\");\nconst app=express();\napp.use(express.json());\n\napp.get(\"/\",(req,res)=>{\n res.json({message:\""+title+" API\"});\n});\n\nconst PORT=process.env.PORT||3000;\napp.listen(PORT,()=>console.log(\"Server on port \"+PORT));\n"; zip.file(folder+"src/index.js",src||fallback); zip.file(folder+".env.example","PORT=3000\n"); zip.file(folder+".gitignore","node_modules/\n.env\n.DS_Store\n"); zip.file(folder+"README.md","# "+title+"\n\nGenerated by PantheraHive BOS.\n\n## Setup\n\`\`\`bash\nnpm install\n\`\`\`\n\n## Run\n\`\`\`bash\nnpm run dev\n\`\`\`\n"); } /* --- Vanilla HTML --- */ function buildVanillaHtml(zip,folder,app,code){ var title=slugTitle(app); var isFullDoc=code.trim().toLowerCase().indexOf("=0||code.trim().toLowerCase().indexOf("=0; var indexHtml=isFullDoc?code:"\n\n\n\n\n"+title+"\n\n\n\n"+code+"\n\n\n\n"; zip.file(folder+"index.html",indexHtml); zip.file(folder+"style.css","/* "+title+" — styles */\n*{margin:0;padding:0;box-sizing:border-box}\nbody{font-family:system-ui,-apple-system,sans-serif;background:#fff;color:#1a1a2e}\n"); zip.file(folder+"script.js","/* "+title+" — scripts */\n"); zip.file(folder+"assets/.gitkeep",""); zip.file(folder+"README.md","# "+title+"\n\nGenerated by PantheraHive BOS.\n\n## Open\nDouble-click \`index.html\` in your browser.\n\nOr serve locally:\n\`\`\`bash\nnpx serve .\n# or\npython3 -m http.server 3000\n\`\`\`\n"); zip.file(folder+".gitignore",".DS_Store\nnode_modules/\n.env\n"); } /* ===== MAIN ===== */ var sc=document.createElement("script"); sc.src="https://cdnjs.cloudflare.com/ajax/libs/jszip/3.10.1/jszip.min.js"; sc.onerror=function(){ if(lbl)lbl.textContent="Download ZIP"; alert("JSZip load failed — check connection."); }; sc.onload=function(){ var zip=new JSZip(); var base=(_phFname||"output").replace(/\.[^.]+$/,""); var app=base.toLowerCase().replace(/[^a-z0-9]+/g,"_").replace(/^_+|_+$/g,"")||"my_app"; var folder=app+"/"; var vc=document.getElementById("panel-content"); var panelTxt=vc?(vc.innerText||vc.textContent||""):""; var lang=detectLang(_phCode,panelTxt); if(_phIsHtml){ buildVanillaHtml(zip,folder,app,_phCode); } else if(lang==="flutter"){ buildFlutter(zip,folder,app,_phCode,panelTxt); } else if(lang==="react-native"){ buildReactNative(zip,folder,app,_phCode,panelTxt); } else if(lang==="swift"){ buildSwift(zip,folder,app,_phCode,panelTxt); } else if(lang==="kotlin"){ buildKotlin(zip,folder,app,_phCode,panelTxt); } else if(lang==="react"){ buildReact(zip,folder,app,_phCode,panelTxt); } else if(lang==="vue"){ buildVue(zip,folder,app,_phCode,panelTxt); } else if(lang==="angular"){ buildAngular(zip,folder,app,_phCode,panelTxt); } else if(lang==="python"){ buildPython(zip,folder,app,_phCode); } else if(lang==="node"){ buildNode(zip,folder,app,_phCode); } else { /* Document/content workflow */ var title=app.replace(/_/g," "); var md=_phAll||_phCode||panelTxt||"No content"; zip.file(folder+app+".md",md); var h=""+title+""; h+="

"+title+"

"; var hc=md.replace(/&/g,"&").replace(//g,">"); hc=hc.replace(/^### (.+)$/gm,"

$1

"); hc=hc.replace(/^## (.+)$/gm,"

$1

"); hc=hc.replace(/^# (.+)$/gm,"

$1

"); hc=hc.replace(/\*\*(.+?)\*\*/g,"$1"); hc=hc.replace(/\n{2,}/g,"

"); h+="

"+hc+"

Generated by PantheraHive BOS
"; zip.file(folder+app+".html",h); zip.file(folder+"README.md","# "+title+"\n\nGenerated by PantheraHive BOS.\n\nFiles:\n- "+app+".md (Markdown)\n- "+app+".html (styled HTML)\n"); } zip.generateAsync({type:"blob"}).then(function(blob){ var a=document.createElement("a"); a.href=URL.createObjectURL(blob); a.download=app+".zip"; a.click(); URL.revokeObjectURL(a.href); if(lbl)lbl.textContent="Download ZIP"; }); }; document.head.appendChild(sc); } function phShare(){navigator.clipboard.writeText(window.location.href).then(function(){var el=document.getElementById("ph-share-lbl");if(el){el.textContent="Link copied!";setTimeout(function(){el.textContent="Copy share link";},2500);}});}function phEmbed(){var runId=window.location.pathname.split("/").pop().replace(".html","");var embedUrl="https://pantherahive.com/embed/"+runId;var code='';navigator.clipboard.writeText(code).then(function(){var el=document.getElementById("ph-embed-lbl");if(el){el.textContent="Embed code copied!";setTimeout(function(){el.textContent="Get Embed Code";},2500);}});}