{
  "manifest_version": "1.0.0",
  "template": {
    "id": "95e9e7a9-bfc5-4806-bdd1-5e3aba0ba348",
    "slug": "entryedgemastertemp",
    "name": "EntryEdge_MasterTemp",
    "description": "Entry Edge templates for all customers",
    "url": "https://railway.com/deploy/entryedgemastertemp",
    "upstream": {
      "repo_url": "https://github.com/twine1993/EntryEdge"
    }
  },
  "status": "unvalidated",
  "validated_at": null,
  "success_rate_30d": null,
  "services": [
    {
      "name": "frontend-service",
      "source": {
        "repo": "https://github.com/twine1993/EntryEdge"
      },
      "needs_volume": false,
      "http": true
    },
    {
      "name": "backend-service",
      "source": {
        "repo": "https://github.com/twine1993/EntryEdge"
      },
      "needs_volume": true,
      "volume_mount_path": "/app/uploads/receipts",
      "http": true
    }
  ],
  "required_inputs": [
    {
      "key": "CI",
      "service": "frontend-service",
      "description": "Set this to false. It prevents the build from failing due to minor \"Linting\" warnings.",
      "secret": false,
      "strategy": "ask_user"
    },
    {
      "key": "VITE_BACKEND_URL",
      "service": "frontend-service",
      "description": "The public URL of your backend. Use ${{backend.RAILWAY_PUBLIC_DOMAIN}}.",
      "secret": false,
      "strategy": "default",
      "default": "https://"
    },
    {
      "key": "VITE_CLIENT_NAME",
      "service": "frontend-service",
      "description": "The display name for the frontend UI (matches CLIENT_NAME in backend).",
      "secret": false,
      "strategy": "ask_user"
    },
    {
      "key": "PORT",
      "service": "backend-service",
      "description": "The internal port the server runs on. Railway usually defaults this to 8080.",
      "secret": false,
      "strategy": "ask_user"
    },
    {
      "key": "DB_NAME",
      "service": "backend-service",
      "description": "The name of your MongoDB database (e.g., entryedge_db).",
      "secret": false,
      "strategy": "ask_user"
    },
    {
      "key": "LOGO_URL",
      "service": "backend-service",
      "description": "A direct link to the client's logo (PNG/SVG) to be displayed on the site.",
      "secret": false,
      "strategy": "ask_user"
    },
    {
      "key": "MONGO_URL",
      "service": "backend-service",
      "description": "The connection string for MongoDB. Use ${{MongoDB.MONGODB_URL}} to auto-link.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "ADMIN_PASS",
      "service": "backend-service",
      "description": "Provide a value for ADMIN_PASS.",
      "secret": false,
      "strategy": "default",
      "default": "The password used to access the /admin dashboard."
    },
    {
      "key": "ADMIN_USER",
      "service": "backend-service",
      "description": "The username used to access the /admin dashboard.",
      "secret": false,
      "strategy": "ask_user"
    },
    {
      "key": "JWT_SECRET",
      "service": "backend-service",
      "description": "A secure random string used to encrypt login sessions.",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "TERMS_TEXT",
      "service": "backend-service",
      "description": "Text shown in the \"I Accept\" popup",
      "secret": false,
      "strategy": "default",
      "default": "Standard terms apply."
    },
    {
      "key": "CLIENT_NAME",
      "service": "backend-service",
      "description": "Provide a value for CLIENT_NAME.",
      "secret": false,
      "strategy": "default",
      "default": "The business name displayed in the navigation bar and footer."
    },
    {
      "key": "COLOR_ACCENT",
      "service": "backend-service",
      "description": "Buttons & Icons color ",
      "secret": false,
      "strategy": "default",
      "default": "#facc15"
    },
    {
      "key": "FRONTEND_URL",
      "service": "backend-service",
      "description": "Provide a value for FRONTEND_URL.",
      "secret": false,
      "strategy": "default",
      "default": "pending"
    },
    {
      "key": "SENDER_EMAIL",
      "service": "backend-service",
      "description": "Provide a value for SENDER_EMAIL.",
      "secret": false,
      "strategy": "default",
      "default": "The email address that sends out winner notifications (must be verified in Resend)."
    },
    {
      "key": "COLOR_PRIMARY",
      "service": "backend-service",
      "description": "main bg colour",
      "secret": false,
      "strategy": "default",
      "default": "#7c3aed"
    },
    {
      "key": "NLCB_APPROVAL",
      "service": "backend-service",
      "description": "Provide a value for NLCB_APPROVAL.",
      "secret": false,
      "strategy": "default",
      "default": "This promotion is NLCB approved."
    },
    {
      "key": "CAMPAIGN_TITLE",
      "service": "backend-service",
      "description": "Main header text on Home Page",
      "secret": false,
      "strategy": "default",
      "default": "PURCHASE & WIN!"
    },
    {
      "key": "RESEND_API_KEY",
      "service": "backend-service",
      "description": "Provide a value for RESEND_API_KEY.",
      "secret": true,
      "strategy": "default",
      "default": "Your unique API key from Resend.com to enable automated emails."
    },
    {
      "key": "TARGET_PRODUCT",
      "service": "backend-service",
      "description": "The specific product (e.g., \"Coca-Cola 2L\") that users must have on their receipt.",
      "secret": false,
      "strategy": "ask_user"
    },
    {
      "key": "ALLOWED_ORIGINS",
      "service": "backend-service",
      "description": "Security setting: Put your frontend URL here to allow it to talk to the backend.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "COLLECTION_NAME",
      "service": "backend-service",
      "description": "The specific table name inside MongoDB where submissions are stored.",
      "secret": false,
      "strategy": "ask_user"
    },
    {
      "key": "COLOR_SECONDARY",
      "service": "backend-service",
      "description": "Navbar background color",
      "secret": false,
      "strategy": "default",
      "default": "#4f46e5"
    },
    {
      "key": "PROMO_START_DATE",
      "service": "backend-service",
      "description": "Provide a value for PROMO_START_DATE.",
      "secret": false,
      "strategy": "default",
      "default": "2026-01-01"
    },
    {
      "key": "PARTICIPATING_STORES",
      "service": "backend-service",
      "description": "Provide a value for PARTICIPATING_STORES.",
      "secret": false,
      "strategy": "default",
      "default": "Massy Stores,JTA Supermarkets,SuperPharm,PriceSmart"
    },
    {
      "key": "PROMO_DURATION_MONTHS",
      "service": "backend-service",
      "description": "how long the promo is",
      "secret": false,
      "strategy": "default",
      "default": "3"
    }
  ],
  "deploy": {
    "mcp": {
      "server": "railway",
      "tool": "deploy_template",
      "args": {
        "template_code": "entryedgemastertemp"
      }
    },
    "cli": "railway deploy --template entryedgemastertemp",
    "api": {
      "method": "POST",
      "path": "/graphql/v2",
      "body": {
        "query": "mutation templateDeploy($input: TemplateDeployV2Input!) { templateDeployV2(input: $input) { projectId workflowId } }",
        "variables": {
          "input": {
            "templateId": "95e9e7a9-bfc5-4806-bdd1-5e3aba0ba348",
            "serializedConfig": {
              "buckets": {},
              "services": {
                "152884b9-8c33-4430-83a9-d1c2e991b76b": {
                  "icon": null,
                  "name": "frontend-service",
                  "deploy": {
                    "startCommand": "npx serve -s build -l tcp://0.0.0.0:$PORT",
                    "healthcheckPath": null,
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "repo": "https://github.com/twine1993/EntryEdge",
                    "rootDirectory": "/frontend"
                  },
                  "variables": {
                    "CI": {
                      "isOptional": false,
                      "description": "Set this to false. It prevents the build from failing due to minor \"Linting\" warnings.",
                      "defaultValue": "{{CI}}"
                    },
                    "VITE_CLIENT_ID": {
                      "isOptional": true,
                      "description": "A unique short code for the client (used for PostHog tracking groups). if empty, analytics will not be used",
                      "defaultValue": ""
                    },
                    "VITE_BACKEND_URL": {
                      "isOptional": false,
                      "description": "The public URL of your backend. Use ${{backend.RAILWAY_PUBLIC_DOMAIN}}.",
                      "defaultValue": "https://"
                    },
                    "VITE_CLIENT_NAME": {
                      "isOptional": false,
                      "description": "The display name for the frontend UI (matches CLIENT_NAME in backend).",
                      "defaultValue": "{{VITE_CLIENT_NAME}}"
                    }
                  },
                  "networking": {
                    "serviceDomains": {
                      "<hasDomain>": {}
                    }
                  }
                },
                "f5db7533-35eb-497d-baf6-b44464699aa4": {
                  "icon": null,
                  "name": "backend-service",
                  "deploy": {
                    "startCommand": "uvicorn server:app --host 0.0.0.0 --port $PORT",
                    "healthcheckPath": "/api/config",
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "repo": "https://github.com/twine1993/EntryEdge",
                    "rootDirectory": "/backend"
                  },
                  "variables": {
                    "PORT": {
                      "isOptional": false,
                      "description": "The internal port the server runs on. Railway usually defaults this to 8080.",
                      "defaultValue": "{{PORT}}"
                    },
                    "DB_NAME": {
                      "isOptional": false,
                      "description": "The name of your MongoDB database (e.g., entryedge_db).",
                      "defaultValue": "{{DB_NAME}}"
                    },
                    "LOGO_URL": {
                      "isOptional": false,
                      "description": "A direct link to the client's logo (PNG/SVG) to be displayed on the site.",
                      "defaultValue": "{{LOGO_URL}}"
                    },
                    "MONGO_URL": {
                      "isOptional": false,
                      "description": "The connection string for MongoDB. Use ${{MongoDB.MONGODB_URL}} to auto-link.",
                      "defaultValue": "${{MongoDB.MONGODB_URL}}"
                    },
                    "ADMIN_PASS": {
                      "isOptional": false,
                      "description": "",
                      "defaultValue": "The password used to access the /admin dashboard."
                    },
                    "ADMIN_USER": {
                      "isOptional": false,
                      "description": "The username used to access the /admin dashboard.",
                      "defaultValue": "{{ADMIN_USER}}"
                    },
                    "JWT_SECRET": {
                      "isOptional": false,
                      "description": "A secure random string used to encrypt login sessions.",
                      "defaultValue": "{{JWT_SECRET}}"
                    },
                    "TERMS_TEXT": {
                      "isOptional": false,
                      "description": "Text shown in the \"I Accept\" popup",
                      "defaultValue": "Standard terms apply."
                    },
                    "CLIENT_NAME": {
                      "isOptional": false,
                      "description": "",
                      "defaultValue": "The business name displayed in the navigation bar and footer."
                    },
                    "COLOR_ACCENT": {
                      "isOptional": false,
                      "description": "Buttons & Icons color ",
                      "defaultValue": "#facc15"
                    },
                    "FRONTEND_URL": {
                      "isOptional": false,
                      "description": "",
                      "defaultValue": "pending"
                    },
                    "SENDER_EMAIL": {
                      "isOptional": false,
                      "description": "",
                      "defaultValue": "The email address that sends out winner notifications (must be verified in Resend)."
                    },
                    "COLOR_PRIMARY": {
                      "isOptional": false,
                      "description": "main bg colour",
                      "defaultValue": "#7c3aed"
                    },
                    "NLCB_APPROVAL": {
                      "isOptional": false,
                      "description": "",
                      "defaultValue": "This promotion is NLCB approved."
                    },
                    "CAMPAIGN_TITLE": {
                      "isOptional": false,
                      "description": "Main header text on Home Page",
                      "defaultValue": "PURCHASE & WIN!"
                    },
                    "RESEND_API_KEY": {
                      "isOptional": false,
                      "description": "",
                      "defaultValue": "Your unique API key from Resend.com to enable automated emails."
                    },
                    "TARGET_PRODUCT": {
                      "isOptional": false,
                      "description": "The specific product (e.g., \"Coca-Cola 2L\") that users must have on their receipt.",
                      "defaultValue": "{{TARGET_PRODUCT}}"
                    },
                    "ALLOWED_ORIGINS": {
                      "isOptional": false,
                      "description": "Security setting: Put your frontend URL here to allow it to talk to the backend.",
                      "defaultValue": "${{frontend.RAILWAY_PUBLIC_DOMAIN}},http://localhost:5173"
                    },
                    "COLLECTION_NAME": {
                      "isOptional": false,
                      "description": "The specific table name inside MongoDB where submissions are stored.",
                      "defaultValue": "{{COLLECTION_NAME}}"
                    },
                    "COLOR_SECONDARY": {
                      "isOptional": false,
                      "description": "Navbar background color",
                      "defaultValue": "#4f46e5"
                    },
                    "PROMO_START_DATE": {
                      "isOptional": false,
                      "description": "",
                      "defaultValue": "2026-01-01"
                    },
                    "VITE_POSTHOG_KEY": {
                      "isOptional": true,
                      "description": "",
                      "defaultValue": ""
                    },
                    "PARTICIPATING_STORES": {
                      "isOptional": false,
                      "description": "",
                      "defaultValue": "Massy Stores,JTA Supermarkets,SuperPharm,PriceSmart"
                    },
                    "PROMO_DURATION_MONTHS": {
                      "isOptional": false,
                      "description": "how long the promo is",
                      "defaultValue": "3"
                    }
                  },
                  "networking": {
                    "serviceDomains": {
                      "<hasDomain>": {}
                    }
                  },
                  "volumeMounts": {
                    "f5db7533-35eb-497d-baf6-b44464699aa4": {
                      "mountPath": "/app/uploads/receipts"
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  "post_deploy": {
    "healthcheck": {
      "service": "backend-service",
      "method": "GET",
      "path": "/api/config",
      "expect_status": 200
    }
  },
  "resources": {
    "expected_services": 2,
    "needs_volume": true
  },
  "generated_at": "2026-09-22T22:14:50.114Z",
  "generator_version": "0.1.0"
}
