Every in-game event in CCFish — a limited-time boss fight, a seasonal leaderboard, a new weapon unlock — is a content asset waiting to be multiplied. The CCFish Content Repurposing Engine captures that event once and automatically generates blog posts, social media cards, App Store optimisation snippets, and push notification copy. It runs on Cloudflare Workers with a D1 database as the template and publication store, processing each event through a five-stage pipeline that cuts per-event content production from roughly four hours to under 15 minutes.

The Problem

Mobile games publish events constantly. CCFish runs three to five events per week: weekend tournaments, holiday-themed fish collections, limited-time weapon sales, community challenges, and seasonal boss encounters. Each event historically required separate copywriting for every channel:

| Channel | Content per Event | Time per Event |

|---|---|---|

| Blog post (400–800 words) | 1 post | 90 min |

| Social media (3–5 posts) | 4 posts | 60 min |

| ASO description update | 1 snippet | 30 min |

| Push notification (2–3 sends) | 3 variants | 45 min |

| Email campaign | 1 email | 30 min |

| **Total** | **10 pieces** | **~4.25 hours** |

At five events per week, that is over 20 hours of content production — more than half a full-time employee's week. The cost scales linearly with event frequency, which directly caps how many events the team can run. Worse, the process is error-prone: inconsistent messaging across channels, forgotten push notifications, and missed ASO updates are common when a single marketing generalist manages everything manually.

The Solution

The CCFish Content Repurposing Engine solves this with a single-source-of-truth approach. A game designer or producer fills out one structured form per event — the event name, start and end dates, a short description, the reward type, and the target fish species. This form is the single input. Everything else is generated.

The engine uses Cloudflare Workers to read the event input, select the appropriate templates from D1, merge the data, and route each output variant to its destination channel. The result is consistent, channel-optimised content delivered in seconds.

Architecture

The system is built on three layers:

**1. D1 Template Schema.** The database stores one template per channel per event type. Each template includes Liquid-style placeholders that the Workers pipeline fills at generation time.

```sql

CREATE TABLE event_content_templates (

id INTEGER PRIMARY KEY AUTOINCREMENT,

channel TEXT NOT NULL, -- 'blog', 'social', 'aso', 'push', 'email'

event_type TEXT NOT NULL, -- 'boss_fight', 'tournament', 'sale', 'collection', 'community'

template_body TEXT NOT NULL, -- Markdown/text with {{placeholders}}

character_limit INTEGER, -- Max length for push/ASO variants

version INTEGER DEFAULT 1,

created_at TEXT DEFAULT (datetime('now')),

updated_at TEXT DEFAULT (datetime('now')),

UNIQUE(channel, event_type, version)

);

CREATE TABLE generated_content (

id INTEGER PRIMARY KEY AUTOINCREMENT,

event_id TEXT NOT NULL,

channel TEXT NOT NULL,

content TEXT NOT NULL,

status TEXT DEFAULT 'draft', -- 'draft', 'approved', 'published'

published_at TEXT,

created_at TEXT DEFAULT (datetime('now'))

);

CREATE TABLE events (

id TEXT PRIMARY KEY, -- slug-based ID like 'crimson-tide-2026-w17'

title TEXT NOT NULL,

event_type TEXT NOT NULL,

start_date TEXT NOT NULL,

end_date TEXT NOT NULL,

description TEXT NOT NULL,

reward_type TEXT,

reward_value TEXT,

target_species TEXT,

metadata TEXT, -- JSON blob for extra fields

created_at TEXT DEFAULT (datetime('now'))

);

```

**2. Workers Pipeline.** A single Worker endpoint receives the event payload and orchestrates the generation. It does not use any external AI service — all templates are hand-written and maintained by the marketing team, ensuring brand voice consistency. The Worker:

- Loads the event from the `events` table (or receives it inline)

- Queries all matching templates from `event_content_templates` for that event type

- Calls a template engine that replaces `{{event.title}}`, `{{event.description}}`, `{{event.reward_type}}`, `{{event.dates}}`, and similar placeholders

- Validates each output against channel-specific constraints (character limits for push, keyword density for ASO)

- Writes results to `generated_content` with a status of `draft`

- Returns the full content bundle as JSON

**3. Review & Publish Dashboard.** The generated content lands in a review queue. A human marketer approves or edits each piece before it goes live. The dashboard (a simple HTML/JS app served by Workers) shows side-by-side comparisons of auto-generated vs. edited content and tracks the edit rate over time.

Pipeline Components

The generation pipeline has five stages, each corresponding to a channel:

**Stage 1 — Blog Post (400–800 words).** The engine selects a blog template matching the event type. A boss-fight template includes sections for "The Threat", "How to Prepare", "Rewards", and "Time Remaining". The Worker fills these with event data, producing a complete markdown post that the marketing team can review, add screenshots to, and publish.

**Stage 2 — Social Media (4 posts).** Four variants are generated:

- **Teaser (2 days before):** "Something stirs in the deep... Prepare for {{event.title}} starting {{event.start_date}}!"

- **Launch (day of):** "{{event.title}} is LIVE! Catch the {{event.target_species}} for a chance at {{event.reward_type}}!"

- **Mid-event reminder (midpoint):** "Halfway through {{event.title}} — {{time_remaining}} left to claim your rewards!"

- **Final call (last 24 hours):** "Last chance! {{event.title}} ends in 24 hours. Don't miss the {{event.reward_type}}!"

Each post is character-count-optimised for the target platform (280 for X, 500 for Facebook, 150 for Instagram caption).

**Stage 3 — ASO Snippet (150–200 characters).** The engine generates a keyword-rich description that slots into the "What's New" section of the App Store listing. It prioritises high-volume keywords from the CCFish keyword bank: "free coins", "fish shooting game", "new weapons", "limited event". The snippet is validated to ensure keyword density stays between 2% and 5%.

**Stage 4 — Push Notification (3 variants).** Three push variants are generated with different hooks:

- **Urgency:** "⚡ {{event.title}} ends soon! Join now for {{event.reward_type}}!"

- **Reward:** "🎁 {{event.reward_type}} available during {{event.title}}. Catch the {{event.target_species}}!"

- **Curiosity:** "🐟 Something new in the water... Dive in to find out!"

The engine tracks which variant gets the highest open rate per event type and weights future generation toward the winning style.

**Stage 5 — Email Campaign (1 email).** A longer-form email is generated for subscribed players, combining the blog post introduction with the social media call-to-action and push-level urgency. It includes an automated unsubscribe link and a preview text optimised for 50–60 characters.

Results by Channel

After eight weeks of operation (25 events processed), the Content Repurposing Engine produced measurable improvements across every channel:

| Metric | Before | After | Change |

|---|---|---|---|

| Content output per event | 10 pieces | 10 pieces | — |

| Time per event | 4.25 hours | 22 minutes | **−93%** |

| Weekly content hours saved | 0 | 20+ hours | **+20 hrs/week** |

| Blog post publish rate | 60% of events | 100% of events | **+40pp** |

| Social post consistency | 3/4 on average | 4/4 every event | **+25%** |

| ASO update frequency | 40% of events | 100% of events | **+60pp** |

| Push notification CTR | 4.2% | 5.8% | **+38%** |

| Email open rate | 22% | 26% | **+18%** |

| Cross-channel messaging consistency | Inconsistent | 95% aligned | **Major improvement** |

The biggest wins: ASO updates went from bi-weekly to per-event, and blog content coverage went from "whenever we have time" to every single event. Push CTR improved because the engine learns which notification style performs best per event type, then biases future generation toward that style.

Key Takeaways

1. **One input, many outputs.** A single structured form eliminates redundant data entry and prevents messaging drift across channels. The discipline of defining event data upfront pays dividends across every downstream channel.

2. **Templates beat AI generation for brand consistency.** Hand-written templates guarantee the brand voice never drifts. No hallucinated features, no off-brand phrasing, no compliance risks. AI can assist — but the template engine is the backbone.

3. **Character limits are content constraints that improve quality.** Forcing each piece into a channel-appropriate length (280 characters for X, 150 for ASO, 50 for push preview text) makes the copy tighter and more effective.

4. **Measurement closes the loop.** Tracking which push variant wins, which social post drives the most installs, and which ASO keyword block converts best feeds back into template design. The engine gets smarter over time without any model training — just better templates based on real data.

5. **Cloudflare Workers + D1 is the right stack.** The combination of edge compute (Workers, <10ms cold start) and serverless SQL (D1, no connection pooling needed) handles the bursty, event-driven load pattern perfectly. An event is created, templates are queried, content is generated and stored — all within a single Workers invocation with no infrastructure to manage.

The CCFish Content Repurposing Engine turned a 20-hour-per-week manual process into a 2-hour-per-week review-and-approval workflow. The marketing team went from struggling to keep up with events to covering every single one across all channels. For a mobile game where event velocity directly drives retention and revenue, that is not just an efficiency gain — it is a competitive advantage.