Activate your member workspace.
The mobile app and subscription-sync endpoints are prepared. A Google Sheet link and an exported workflow do not connect the live services: finish the private settings and import the companion n8n workflow to activate them.
Use your existing Sheet2
The supplied workflow uses Subscription for the Razorpay subscription ID (sub_…). It is not a plan-name column. Subscription Status controls access; only active subscriptions qualify. A PAID value in ID Status, a payment record or being in the WhatsApp group does not activate app access by itself.
| Setting | Value / purpose |
|---|---|
Email | Registered account identity; trimmed and lowercased. |
Subscription | Razorpay subscription ID. Updates match this ID, never phone. |
Subscription Status | active grants access; pending, halted, cancelled, blank and other inactive states do not. |
Name / Phone / Role | Keep the existing columns. Existing contact details are preserved during reconciliation. |
Payment fields | Captured INR payment metadata is recorded when available; amount is in rupees. Ambiguous older payment dates are preserved. |
Other columns | Keep all existing registration columns and any extras. No roster data is returned to visitors. |
Your old payment step appended rows without setting Subscription Status. Run the existing-member reconciliation below to fill these statuses from Razorpay. Do not mark every PAID row active.
Repeated rows for the same subscription must agree before access is allowed. A cancelled old subscription does not block a different active subscription under the same email. All subscriptions for one email share the same profile and weekly search allowance.
Install the private membership bridge
- Open the membership spreadsheet → Extensions → Apps Script.
- Download the updated membership script and replace the editor contents.
- Set these Script properties. Store secrets here, never in sheet cells.
| Setting | Value / purpose |
|---|---|
SPREADSHEET_ID | The ID in your supplied spreadsheet URL. |
SHEET_NAME | Sheet2 |
SUBSCRIPTION_COLUMN_MODE | identifier |
DUPLICATE_EMAIL_POLICY | subscription_records |
ACTIVE_STATUS_VALUES | ["active"] |
RAZORPAY_PREMIUM_PLAN_ID | The exact plan ID in your current Create Razorpay Subscription node. |
BRIDGE_SECRET | A random secret of at least 32 characters; also set as the app’s MEMBERSHIP_SHARED_SECRET. |
BILLING_SYNC_SECRET | A different random secret of at least 32 characters; shared with the app and the n8n reconciliation credential. |
EPIC_DASHBOARD_URL | This app’s HTTPS homepage, without a query string. |
Leave PREMIUM_SUBSCRIPTION_VALUES and ID_STATUS_VALUES unset for this Sheet2 integration. The plan is verified through Razorpay. The older label-based roster mode remains available for other installations.
- Deploy a new Web app version. Execute as yourself; allow Anyone to reach the endpoint. Every request still requires a private shared secret.
- Authorize sheet access and sending sign-in / welcome email. Copy the deployment URL ending in /exec.
- Set
GOOGLE_SHEETS_WEB_APP_URLandMEMBERSHIP_SHARED_SECRETas secret app settings, then republish.
The script creates private tabs for Member Profiles, Buyer Reports, Community Orders, Service Enquiries and Subscription Sync, prefixed with EPIC. Preserve their headers and report rows: the report ledger enforces one completed search per calendar week. Sessions last up to six hours and recheck membership on every protected request.
Connect verified billing and migrate existing members
| Setting | Value / purpose |
|---|---|
RAZORPAY_KEY_ID / RAZORPAY_KEY_SECRET | App server secrets for the Razorpay account used by the existing workflow. |
RAZORPAY_PREMIUM_PLAN_ID | The same exact Premium plan ID as the Apps Script property. |
RAZORPAY_WEBHOOK_SECRET | A random 32+ character secret shared with the new Razorpay webhook configuration. |
BILLING_SYNC_SECRET | The same value as the Apps Script property and n8n HTTP Header Auth credential. |
Import the prepared EPIC Premium Onboarding v2 companion workflow. Bind the existing Google Sheets credential and create an HTTP Header Auth credential with name Authorization and value Bearer YOUR_BILLING_SYNC_SECRET. The workflow is inactive on import.
- Run its manual existing-member branch. It reads Sheet2, deduplicates subscription IDs, and asks the app to fetch each subscription’s current Razorpay status. It does not send welcome emails or create another account.
- Review failed records and identity conflicts before enabling access. Blank / invalid IDs need manual review; no new subscription or payment is required for existing active members.
- Configure Razorpay’s subscription lifecycle events to the new n8n production webhook URL. Keep Raw Body enabled: the workflow forwards the original binary body and signature to
/api/billing/razorpay. - Test activation, renewal, replay and cancellation with the appropriate test-mode keys and matching test plan. Use matching live-mode settings only for production.
- After the new flow is verified, disable the old payment-success, cancellation and direct joining-link email branches. Keep the existing create-subscription endpoint for the official joining page.
The companion workflow includes reconciliation every six hours once activated. Failed requests must remain visible in n8n for review and retry. The app reads current provider state instead of trusting webhook arrival order, browser payment callbacks or a phone-number match.
New paid members receive a dashboard welcome email after the sheet update. Retries do not automatically resend it. The Subscription Sync tab records delivery; sending or review_delivery requires checking the mail outcome before a manual resend. Google’s email quotas apply. Existing-member backfills suppress welcome emails.
Complete the member journey
The official joining link is EPIC Premium registration . On the existing checkout page, set its successful-payment handler to open this dashboard with /?welcome=1. The supplied n8n export does not include that website handler, so it must be updated there separately. The welcome email provides a dashboard link as well.
| Setting | Value / purpose |
|---|---|
EPIC_SUBSCRIPTION_URL | Official registration page; public. |
EPIC_WHATSAPP_GROUP_URL | Current invitation from the supplied welcome email. Store as a secret. |
EPIC_TUTORIALS_URL | EPIC’s course / learning portal. Store as a secret; course eligibility is controlled by that portal. |
EPIC_SUPPORT_URL | EPIC’s membership support link. |
Community and learning links are returned only to verified active members. Existing group members can mark “I’m already in the group.” This is their confirmation; it does not independently verify WhatsApp membership or automatically remove inactive members from a group.
Profiles support products, services or both. The three-step setup saves to the same email account and can be updated later. The app does not expose the WhatsApp invitation in public HTML or the onboarding workflow download.
Activate buyer research and AI matching
If the OpenAI Developers plugin does not open
The plugin helps an administrator provision a key. It is not required on members’ phones or for this app’s runtime. The app already calls OpenAI directly from its server.
- In your OpenAI Platform account, create an API key for the project that will run EPIC matching. Follow the official key setup instructions.
- Have your hosting administrator save it as the private server setting
OPENAI_API_KEY. On the prepared VPS, use.env.production; on the current hosted app, use its secret environment settings. - Republish or restart the app, then sign in as an active member with a saved profile and request a match. An actual successful assessment confirms the key and account access work.
Keep keys out of member forms, Google Sheet cells, browser code and screenshots. A ChatGPT plugin installation alone does not activate the Google Sheet or buyer-search connections.
| Setting | Value / purpose |
|---|---|
TAVILY_API_KEY | Secret key for buyer web search and contact-page extraction. |
OPENAI_API_KEY | Secret key for profile-based opportunity matching. |
OPENAI_MATCH_MODEL | Optional; prepared default gpt-4.1-mini. |
Buyer reports search company websites, directories and public business profiles. Each report includes available contact evidence and a reason for the match. Buying intent and email deliverability still require qualification. One completed search is available per email each week, resetting Monday at 00:00 Asia/Kolkata; reopening a report uses no credit. Completed reports with no matches count; failed searches release the reservation.
AI matching has a separate limit of 20 assessments per member per hour and 500 across members per hour. It compares the saved export profile with a current community order or a buyer from that member’s saved report. Assessments give reasons, gaps and a next step; they do not establish buying intent. Business offering and market preferences go to OpenAI after the member requests a match. Account identity, billing details and contact email are excluded. No AI or search key is sent to the browser.
The checklist separates required, conditional, review and buyer-specific steps. It asks about origin, ingredients, processing, packaging and claims; source-review dates and coverage gaps remain visible. Readiness notes can be downloaded. Review current requirements before every shipment. The calculator uses entered rates, not live freight quotes.
Run the community order board
The updated membership script creates EPIC Community Orders when the first requirement is submitted. No changes to the existing Sheet2 headers are needed. Redeploy Apps Script as a new version at the existing /exec URL before using the new app.
Active members with saved profiles can post up to 10 current requirements. Each submission needs a closing date within 90 days and permission to share its contact details. Orders close automatically at the end of the selected date in India time. Owners can edit or close their records. The board clearly labels all entries “Member submitted”.
EPIC can moderate an inappropriate requirement by finding its Order ID in the private orders tab and setting Status to hidden. Preserve the other cells and headers. Hidden entries cannot be reopened by members. Only an authorised sheet administrator should restore a reviewed row to open or closed. No verification badge is granted by posting.
Hosting and release
Keep the app on its current hosting, or use the prepared Node production build and Docker / HTTPS-proxy files for your VPS. n8n can remain on its existing host.
Download hosting and launch instructionsThe guide includes environment settings, Sheet2 setup, existing-member migration, domain cutover, backups and rollback. A static HTML upload or WordPress plugin installation cannot run the app’s protected server routes.
Finish the live checks
Verify a real eligible member’s email delivery, profile save and reload, both member links, one buyer report and a blocked second search, one member-submitted order, its AI match, and a saved service enquiry. Confirm cancelled access is revoked and an existing member can sign in without paying again. Local automated checks cannot establish that your live credentials, n8n version or private sheet permissions are configured.