Social Sharing & Hashtag Generator¶
Overview¶
The Social Sharing Kit helps event hosts generate platform-ready marketing copy—hashtags, captions, story text, email subject lines, and SEO meta—for Instagram, X (Twitter), LinkedIn, Facebook, and WhatsApp. Content is built from your event details and always includes Nigall brand tags #Nigall and #NigallEvents, plus the handle @nigall_events.
When an OpenAI API key is configured on the server, Nigall uses AI to produce tailored copy. Otherwise, a built-in template engine generates professional fallback assets so the feature works in every environment.
Purpose¶
Reduce time spent writing promotional posts across channels, keep brand voice consistent, and give organizers copy-paste assets for launch announcements, reminders, day-of posts, and attendee share prompts.
Who should use it¶
| Role | Use case |
|---|---|
| Event host / organizer | Generate and copy captions before marketing push |
| Marketing / comms | Hashtag sets, email subject lines, OG descriptions |
| Attendees | Use Attendee share captions (copy from kit or share manually) |
Benefits¶
- One-click generation from live event data (title, date, venue, price, description)
- Tabbed output by platform with Copy buttons
- Optional custom event hashtag included in primary tags
- Cached results saved on the event—no re-generation unless you choose Regenerate
- Brand-compliant defaults even without AI
Navigation path¶
| Action | Path |
|---|---|
| Social Sharing Kit (host) | /events/<pk>/<event_tag>/ → Social sharing kit panel |
| Generate / regenerate (API) | POST /events/<pk>/<event_tag>/social-sharing/generate/ |
| Public event page (share URL in copy) | /events/<pk>/<event_tag>/ |
| Discover listing (public events) | /events/discover/ |
Tip: Open View Event from the edit page. The Social sharing kit appears in the left column when signed in as the event host.
Prerequisites¶
- Event must exist with title, dates, location, and description filled in
- User must be the event host (
Event.host) - No paid module or subscription required—available on all events
- Optional: Server
OPENAI_API_KEYfor AI-generated copy (see Administrator notes)
Step-by-step instructions¶
Beginner — Generate your first sharing kit¶
- Sign in as event host.
- Open your event → View Event (
/events/<pk>/<tag>/). - Scroll to Social sharing kit (below Survey questions).
- Optionally enter a Custom event hashtag (e.g.,
#SummerFest2026). Use camelCase; no spaces. - Click Generate.
- Browse tabs: Hashtags, Instagram, X / Twitter, LinkedIn, Facebook, WhatsApp, Stories, Email & SEO.
- Click Copy on any block and paste into your social tool or scheduler.
[SCREENSHOT: Social sharing kit panel with Hashtags tab open]
Intermediate — Regenerate after event updates¶
- Update event title, date, venue, description, or ticket price on Edit Event.
- Return to event detail → Social sharing kit.
- Adjust custom hashtag if needed.
- Click Regenerate to refresh all assets (previous cache is replaced).
Note: Cached assets are stored on the event. If you only change minor copy in the description, regenerate so captions stay accurate.
Advanced — Use outputs in a campaign workflow¶
| Timing | Suggested asset |
|---|---|
| Launch | Instagram Organizer announcement, LinkedIn Organizer announcement, X Thread opener |
| 7 days out | Instagram Organizer reminder, X Organizer reminder, story Countdown 7 days |
| 3 days / 1 day | Story Countdown 3 days / Countdown 1 day |
| Day of | Instagram Organizer day of, story Day of |
| Attendee advocacy | Instagram / X Attendee share captions |
| Email blast | Pick from Email subject lines; body from Email Communications |
| Low capacity | Story Few spots left |
| Sold out | Story Sold out |
Append the platform Follow CTA where relevant (e.g., “Follow @nigall_events for more events near you!” on Instagram).
Field descriptions¶
| Field | Location | Description |
|---|---|---|
| Custom event hashtag | Social sharing kit panel | Optional organizer tag (max 80 chars). Normalized to camelCase on save. Example: #BrooklynTech2026 |
| Generate / Regenerate | Panel header button | Builds or refreshes all assets |
| Primary hashtags | Hashtags tab | 3–5 event-specific tags; always includes #Nigall and #NigallEvents |
| Secondary hashtags | Hashtags tab | Broader discovery tags (location, topic) |
| Full tag string | Hashtags tab | All tags in one copyable line |
| Platform captions | Per-tab content | Organizer and attendee variants per network |
| Story text | Stories tab | Short overlays (≤8 words) for countdown and urgency |
| Email subject lines | Email & SEO tab | Five promotional subject options |
| SEO meta | Email & SEO tab | meta_title, meta_description, og_title, og_description |
Data sources (automatic)¶
| Placeholder | Pulled from |
|---|---|
| Event name | Event.title |
| Event type | Event.event_category or registration type |
| Date & time | Event.start_date / end_date (local timezone) |
| Venue | Linked Venue.name or first segment of Event.location |
| City | Parsed from Event.location |
| Organizer name | Host full name or email |
| Description | Plain text from Event.description (HTML stripped) |
| Ticket price | Free, RSVP, or “From $X” from ticket tiers |
| Event URL | Absolute link to event detail page |
Business rules¶
| Rule | Behavior |
|---|---|
| Host-only | Only Event.host can generate assets |
| Cache | Results saved in Event.social_sharing_assets JSON |
| Regenerate | force_refresh=1 replaces cache |
| Custom hashtag | Saved on generate if changed in panel |
| Brand tags | #Nigall and #NigallEvents always in primary list |
| Brand handle | @nigall_events referenced in follow CTAs and many captions |
| X/Twitter length | Captions truncated or validated to ≤280 characters |
| AI vs fallback | OpenAI when key present; template fallback on error or missing key |
| Language | AI follows event description language when key configured |
Validation rules¶
| Input | Rule |
|---|---|
| Custom hashtag | Max 80 characters; normalized to #CamelCase |
| Generate POST | CSRF + login required |
| Non-host POST | HTTP 403 JSON error |
User permissions¶
| Action | Host | Guest | Staff |
|---|---|---|---|
| View kit panel | ✅ | ❌ | ❌ (unless host) |
| Generate / regenerate | ✅ | ❌ | ❌ (unless host) |
| Share you're going panel | ❌ | ✅ if RSVP/registration confirmed and host generated kit | ❌ |
| Copy public event URL | ✅ | ✅ | ✅ |
Workflow¶
Examples¶
Tech meetup: Custom hashtag #AustinDevNight2026. Use X announcement tweet + LinkedIn post for launch; Instagram reminder 7 days before; attendee share caption for community reposts.
Wedding RSVP: Custom hashtag #SmithJonesWedding. WhatsApp Personal invite for family groups; Instagram attendee share for guests posting “I’m going!”
Paid conference: Regenerate after early-bird pricing ends so Ticket price in captions reflects current tiers.
Best practices¶
- Complete About the Event, location, and cover image before generating
- Set Discover visibility and category before public launch (Discover & Visibility)
- Add survey questions first if copy should reference guest data collection (Survey & Custom Questions)
- Regenerate after any date, venue, or pricing change
- Pair kit output with Email Blasts for owned-audience sends
- Use Full tag string for Instagram (hashtags at end of caption per platform norms)
Tips¶
- Status line shows AI vs template source after generation
- LinkedIn posts: keep to ≤5 hashtags for professional tone
- Story overlays are short by design—pair with event cover art in your design tool
- SEO fields are suggestions; paste into meta tags if you customize landing pages externally
Common mistakes¶
| Mistake | Result | Fix |
|---|---|---|
| Generating before event details finalized | Outdated URLs/dates in copy | Regenerate after edits |
| Hashtag with spaces | Normalization may strip words | Use #CamelCase only |
| Expecting auto-post to social | Nigall does not publish for you | Copy/paste or use external scheduler |
| Assuming AI without server key | Template copy only | Configure OPENAI_API_KEY (admin) |
FAQs¶
Does Nigall post to Instagram or X for me?
No. The kit generates copy; you publish through each platform or your scheduling tool.
Is AI required?
No. Template fallback produces complete assets without an API key.
Can attendees see the kit?
Hosts see the full Social sharing kit. Guests who RSVP Will Attend / Tentative (or have a confirmed registration) see a Share that you're going panel with attendee captions and hashtags—only after the host has generated the kit once.
Do RSVP and Registration events both support this?
Yes. Ticket price line adapts (Free, RSVP, or priced tiers).
Where are brand hashtags defined?
Always #Nigall and #NigallEvents; handle @nigall_events.
Troubleshooting¶
| Symptom | Cause | Fix |
|---|---|---|
| Panel not visible | Not signed in as host | Sign in as Event.host |
| “Generation failed” | OpenAI error or timeout | Retry; check server logs; fallback runs automatically on most errors |
| Stale dates in copy | Cache from prior generate | Click Regenerate |
| Empty description in copy | Event description blank | Fill About the Event on edit page |
| 403 on generate | Wrong user | Host account only |
Related features¶
- Discover & Event Visibility
- Email Communications & Blasts
- Events & Registration
- Survey & Custom Questions
- Field Reference — Event Model
Screenshot placeholders¶
[SCREENSHOT: Social sharing kit — custom hashtag + Generate button][SCREENSHOT: Hashtags tab — primary, secondary, full tag string][SCREENSHOT: Instagram tab — organizer announcement with Copy button][SCREENSHOT: Email & SEO tab — subject lines and meta fields]
Administrator notes¶
Environment variables (optional AI):
| Variable | Purpose | Default |
|---|---|---|
OPENAI_API_KEY |
Enables AI generation | Empty → template fallback |
OPENAI_MODEL |
Chat model | gpt-4o-mini |
Prompt template path: events/prompts/social_sharing.txt
Generated JSON stored in Event.social_sharing_assets. No PII beyond event/host display name is sent to OpenAI.
Developer / API notes¶
Endpoint: POST /events/<pk>/<event_tag>/social-sharing/generate/
Body (form-urlencoded):
| Parameter | Description |
|---|---|
custom_hashtag |
Optional; persisted on event |
force_refresh |
1 to bypass cache |
Response (JSON):
{
"ok": true,
"assets": {
"hashtags": { "primary": [], "secondary": [], "full_tag_string": "" },
"captions": { "instagram": {}, "x_twitter": {}, "linkedin": {}, "facebook": {}, "whatsapp": {} },
"story_text": {},
"email_subject_lines": [],
"seo_meta": {},
"follow_cta": {},
"brand_compliance_check": {},
"_source": "openai | fallback",
"generated_at": "ISO-8601 timestamp"
}
}
Service module: events.social_sharing_services.generate_social_sharing_assets()