Differences
This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
| infrastructure_roadmap [2025/07/23 11:54] – Added OpenProject link. cornelius.reyneke | infrastructure_roadmap [2025/08/20 10:52] (current) – cornelius.reyneke | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ===== Infrastructure Roadmap | + | === Infrastructure Roadmap === |
| - | === For Crowdfunding Campaign | + | == For Crowdfunding Campaign == |
| View our [[https:// | View our [[https:// | ||
| - | |||
| - | Infrastructure we have: | ||
| - | |||
| - | * X / Mastodon | ||
| - | * Bluesky | ||
| - | * Youtube | ||
| Infrastructure we still need: | Infrastructure we still need: | ||
| - | | + | |
| - | * n8n | + | * Campaign Website |
| - | * Mautic | + | |
| - | * Stripe | + | |
| - | * Webshop | + | ======== Ecosystem Overview ======== |
| - | * Discord | + | |
| - | * (osTicket?) | + | * n8n: Orchestrates the automations and connects all systems. |
| + | * Stripe: Captures payments (Checkout) and emits webhooks. | ||
| + | * Shopware: Store backend where VIP promotion codes/ | ||
| + | * Mautic: Marketing automation/ | ||
| + | * Discord: Community platform; API used to generate single-use invite links. | ||
| + | * EspoCRM: Sales CRM; leads are ensured/ | ||
| + | |||
| + | |||
| + | ======= Workflow 1: Mautic Contact Updated → Discord Invite(s) → Mautic + EspoCRM Sync → Invite Email ======= | ||
| + | |||
| + | Purpose: | ||
| + | When a Mautic contact is updated and has opted in, this workflow issues the correct Discord invite (VIP or Basic), saves the link on the Mautic contact, ensures a Lead exists in EspoCRM, and emails the invite. It includes jitter and “already has a link?” checks to prevent duplicates. | ||
| + | |||
| + | ==== Steps ==== | ||
| + | |||
| + | * Trigger: Mautic " | ||
| + | * Wait 0–3s (jitter to reduce concurrent updates) | ||
| + | * Check if " | ||
| + | * If " | ||
| + | * Check if VIP Discord | ||
| + | * If not, wait 0.3–1.2s, re-fetch contact, check again | ||
| + | * If still missing, issue VIP Discord invite link (via Discord API) | ||
| + | * Update Mautic contact with discord_invite_link_vip | ||
| + | * Check if link was successfully added | ||
| + | * Send VIP Discord invite email to contact (from Mautic) | ||
| + | * Else (non-VIP): | ||
| + | * Check if Basic Discord invite link exists | ||
| + | * If not, wait 0.3–1.2s, re-fetch contact, check again | ||
| + | * If still missing, issue Basic Discord invite link (via Discord API) | ||
| + | * Update Mautic contact with discord_invite_link_basic | ||
| + | * Check if link was successfully added | ||
| + | * Send Basic Discord invite email to contact (from Mautic) | ||
| + | * EspoCRM Sync: | ||
| + | * Try to retrieve Lead by contact attributes (typically email) | ||
| + | * If not found, create Lead in EspoCRM (via HTTP POST) | ||
| + | |||
| + | {{: | ||
| + | |||
| + | === Outputs & Side Effects === | ||
| + | |||
| + | * Mautic contact has exactly one stored Discord invite link (VIP or Basic). | ||
| + | * Appropriate invite email is sent from Mautic. | ||
| + | * A corresponding Lead exists in EspoCRM. | ||
| + | |||
| + | ======== Workflow 2: Stripe → VIP Coupon → Mautic Update → Coupon Email ======== | ||
| + | |||
| + | Purpose: | ||
| + | When a customer successfully purchases a "VIP reservation" | ||
| + | |||
| + | ==== Steps ==== | ||
| + | |||
| + | * Trigger: Stripe webhook on checkout.session.completed | ||
| + | * Check if payment was successful | ||
| + | * Look up session in Stripe to get line items | ||
| + | * If the product was a VIP reservation, | ||
| + | * Generate promo code (unique for each purchase) | ||
| + | * Add promo code to VIP promotion in Shopware (via HTTP POST) | ||
| + | * Find corresponding contact in Mautic (by email) | ||
| + | * Merge promo code and contact details | ||
| + | * Set contact " | ||
| + | * Send email with coupon to contact (from Mautic) | ||
| + | |||
| + | {{: | ||
| + | |||
| + | === Outputs & Side Effects === | ||
| + | |||
| + | * A new single-use promo code is created in Shopware’s VIP promotion. | ||
| + | * The buyer’s Mautic contact is marked as VIP and stores the promo code. | ||
| + | * Coupon email is sent from Mautic. | ||
| + | |||
| + | ==== Notes ==== | ||
| + | |||
| + | * Only runs for successful payments and only for the VIP product. | ||
| + | * Contact matching uses the email captured by Stripe. | ||
| + | * If the Shopware API call fails, the Mautic update/ | ||
| + | |||
| + | |||
| + | ==== Field Conventions (Mautic Contact) ==== | ||
| + | |||
| + | * vip_status: boolean | ||
| + | * promo_code: string (from Workflow 1) | ||
| + | * discord_invite_link_vip / discord_invite_link_basic: | ||
| + | * opt_in_confirmed: | ||
| + | |||
| + | ==== Operational Tips ==== | ||
| + | |||
| + | * Credentials needed: Stripe (API + webhook secret), Mautic API + email config, Shopware API token, Discord Bot token, EspoCRM API credentials. | ||
| + | * Respect Discord rate limits; n8n waits help mitigate 429s. | ||
| + | * To reissue an invite, clear the relevant invite link field in Mautic and save; the workflow will create a new link. | ||
| + | * Troubleshooting: | ||