{
  "name": "Tally",
  "slug": "tally",
  "blocks": ["Pages", "Lists", "Sign-in: users", "Actions: pay"],
  "persona": "freelancers",
  "keywords": [
    "client portal",
    "app",
    "login",
    "member sign-in",
    "clients",
    "files",
    "coach",
    "career coach",
    "coaching",
    "sessions",
    "session packages",
    "check-ins",
    "mentoring",
    "members area"
  ],
  "description": "An app template: a coach’s client portal. Each client signs in with their email, sees the sessions left in their package and when it runs out, requests their next session and follows it from Requested to Confirmed, sends a check-in before it and reads the coach’s reply, and keeps every session’s takeaways and actions in one place. The coach adds sessions and replies in the Dashboard. A public page, six member screens under /app (Home, Book, Sessions, Check-in, Package, Account) and a privacy notice with blanks.",
  "audience": [
    "career coaches",
    "leadership and executive coaches"
  ],
  "category": "Client portal",
  "job": "member-app",
  "categoryId": "client-portal",
  "alsoFits": [
    "mentoring programmes",
    "interview and CV coaching",
    "public speaking coaching",
    "business advisers with session packages"
  ],
  "direction": "Yellow legal pad on a teal desk, with tally marks in pen struck through in coral and a tear-off calendar page",
  "mood": [
    "light",
    "calm",
    "modern"
  ],
  "fonts": [
    "Spectral",
    "Public Sans"
  ],
  "memberApp": {
    "path": "/app",
    "lists": [
      {
        "list": "package",
        "label": "Package",
        "by": "owner",
        "fields": [
          {
            "name": "package",
            "type": "text",
            "label": "Package",
            "required": true
          },
          {
            "name": "sessions_total",
            "type": "number",
            "label": "Sessions in the package",
            "required": true
          },
          {
            "name": "sessions_left",
            "type": "number",
            "label": "Sessions left",
            "required": true
          },
          {
            "name": "renews",
            "type": "date",
            "label": "Use by"
          },
          {
            "name": "memo",
            "type": "long_text",
            "label": "Note"
          }
        ]
      },
      {
        "list": "sessions",
        "label": "Sessions",
        "by": "owner",
        "fields": [
          {
            "name": "date",
            "type": "date",
            "label": "Date",
            "required": true
          },
          {
            "name": "topic",
            "type": "text",
            "label": "Topic",
            "required": true
          },
          {
            "name": "takeaways",
            "type": "long_text",
            "label": "Takeaways"
          },
          {
            "name": "next_step",
            "type": "text",
            "label": "Next step"
          },
          {
            "name": "link",
            "type": "text",
            "label": "Link to the notes"
          }
        ]
      },
      {
        "list": "bookings",
        "label": "Session requests",
        "by": "member",
        "status_options": [
          "Requested",
          "Confirmed",
          "Done",
          "Moved",
          "Cancelled"
        ],
        "reply": true,
        "fields": [
          {
            "name": "focus",
            "type": "text",
            "label": "What you want to work on"
          },
          {
            "name": "day",
            "type": "date",
            "label": "Day you’d like",
            "required": true
          },
          {
            "name": "time",
            "type": "choice",
            "label": "Time",
            "required": true,
            "options": [
              "08:00",
              "09:00",
              "10:00",
              "11:00",
              "12:30",
              "14:00",
              "15:00",
              "16:00",
              "17:00",
              "18:00"
            ]
          },
          {
            "name": "format",
            "type": "choice",
            "label": "Where",
            "required": true,
            "options": [
              "Video call",
              "In person, Ilkley"
            ]
          }
        ]
      },
      {
        "list": "checkins",
        "label": "Check-ins",
        "by": "member",
        "fields": [
          {
            "name": "wins",
            "type": "long_text",
            "label": "What went well",
            "required": true
          },
          {
            "name": "stuck_on",
            "type": "long_text",
            "label": "Where you're stuck"
          },
          {
            "name": "question",
            "type": "text",
            "label": "One question for next time"
          },
          {
            "name": "session_date",
            "type": "date",
            "label": "For your session on",
            "required": true
          }
        ],
        "status_options": [
          "Sent",
          "Replied"
        ],
        "reply": true
      },
      {
        "list": "changes",
        "label": "Moves and cancellations",
        "by": "member",
        "status_options": [
          "Sent",
          "Done"
        ],
        "reply": true,
        "fields": [
          {
            "name": "request",
            "type": "choice",
            "label": "What would you like?",
            "required": true,
            "options": [
              "Move it",
              "Cancel it"
            ]
          },
          {
            "name": "day",
            "type": "date",
            "label": "Session day",
            "required": true
          },
          {
            "name": "time",
            "type": "choice",
            "label": "Time",
            "required": true,
            "options": [
              "08:00",
              "09:00",
              "10:00",
              "11:00",
              "12:30",
              "14:00",
              "15:00",
              "16:00",
              "17:00",
              "18:00"
            ]
          },
          {
            "name": "new_time",
            "type": "text",
            "label": "If moving: when suits you"
          }
        ]
      }
    ],
    "demo": {
      "member": {
        "name": "Priya Nandakumar",
        "email": "priya.nandakumar@example.com",
        "profile": {
          "name": "Priya"
        }
      },
      "plans": [],
      "rows": {
        "package": [
          {
            "package": "Six-session leadership package",
            "sessions_total": 6,
            "sessions_left": 4,
            "renews": "+23w:fri",
            "memo": "Book your next two sessions early so you can keep your preferred time.",
            "_added": "-5w:mon"
          }
        ],
        "sessions": [
          {
            "date": "-1w:thu",
            "topic": "Making the case for a bigger team",
            "takeaways": "Lead with the two projects we turned down this year, not with workload. Declan decides on numbers, so bring the cost of a hire next to the revenue we lost.",
            "next_step": "Ask Declan for the budget meeting before the quarter ends.",
            "link": "https://notes.thorleycoaching.example.com/s/team-case",
            "_added": "-1w:thu"
          },
          {
            "date": "-3w:thu",
            "topic": "Stepping back from the day-to-day",
            "takeaways": "You pick up tasks because it is faster than explaining them. Choose one weekly job to hand over, write down what good looks like, and check in once rather than hovering.",
            "next_step": "Hand over the supplier calls and run the Monday stand-up without fixing things.",
            "link": "https://notes.thorleycoaching.example.com/s/stepping-back",
            "_added": "-3w:thu"
          }
        ],
        "checkins": [
          {
            "session_date": "-1w:thu",
            "wins": "I ran the Monday stand-up without jumping in to fix things. Two people offered to take the supplier calls.",
            "stuck_on": "Declan keeps moving the budget meeting.",
            "question": "How do I ask again without sounding pushy?",
            "_added": "-1w:tue",
            "_status": "Replied",
            "_reply": "Not pushy at all: ask for 20 minutes and name the decision you need. We’ll script the first two lines on Thursday."
          },
          {
            "session_date": "-3w:thu",
            "wins": "I told my director I want to lead the team properly, not just carry the work.",
            "stuck_on": "I say yes to every request and then catch up in the evenings.",
            "question": "Where do I start with delegating?",
            "_added": "-3w:tue",
            "_status": "Replied",
            "_reply": "Start with one recurring job you could explain in ten minutes. We’ll pick it together on Thursday."
          }
        ],
        "bookings": [
          {
            "day": "+1w:thu",
            "time": "09:00",
            "format": "Video call",
            "focus": "Getting the budget meeting with Declan, and what to ask for",
            "_added": "-1d",
            "_status": "Confirmed",
            "_reply": "Confirmed for 09:00. Same video link as last time; send your check-in by Tuesday evening."
          },
          {
            "day": "-1w:thu",
            "time": "09:00",
            "format": "In person, Ilkley",
            "focus": "Making the case for a bigger team",
            "_added": "-2w:fri",
            "_status": "Done"
          },
          {
            "day": "-3w:thu",
            "time": "09:00",
            "format": "Video call",
            "focus": "Stepping back from the day-to-day",
            "_added": "-4w:mon",
            "_status": "Done"
          }
        ],
        "changes": [
          {
            "day": "-3w:thu",
            "time": "11:00",
            "request": "Move it",
            "new_time": "09:00",
            "_added": "-4w:wed",
            "_status": "Done",
            "_reply": "Done: moved to 09:00 that Thursday."
          }
        ]
      }
    },
    "setup": {
      "signup": "invite",
      "profile_fields": [
        {
          "name": "name",
          "type": "text",
          "label": "First name"
        }
      ],
      "display_field": "name"
    },
    "profile_fields": [
      {
        "name": "name",
        "type": "text",
        "label": "First name"
      }
    ],
    "display_field": "name",
    "plans": [
      {
        "plan": "monthly",
        "name": "Monthly coaching",
        "paid": true,
        "price": {
          "amount": 36000,
          "currency": "gbp",
          "interval": "month"
        }
      }
    ]
  },
  "files": [
    "index.html",
    "app/index.html",
    "app/book.html",
    "app/change.html",
    "app/sessions.html",
    "app/checkin.html",
    "app/package.html",
    "app/account.html",
    "privacy.html",
    "styles.css",
    "app.js",
    "kit.css",
    "kit.js",
    "kit-icons.svg",
    "site.webmanifest",
    "favicon.svg",
    "art/notebook.svg",
    "og.png",
    "apple-touch-icon.png",
    "icon-192.png",
    "icon-512.png",
    "icon-512-maskable.png"
  ],
  "pages": [
    {
      "path": "index.html",
      "label": "Home",
      "purpose": "The public page: Saoirse Thorley’s leadership coaching, the packages and prices, how the client app works, and the way in for clients"
    },
    {
      "path": "app/index.html",
      "label": "Home (app)",
      "purpose": "The client’s home: sessions left in the package, the next session and its status, the latest actions from the coach, the check-in prompt and quick actions"
    },
    {
      "path": "app/book.html",
      "label": "Book",
      "purpose": "Request the next session (day, time, video or in person, what to work on) with the moving and cancelling rule, and the requests with their status and the coach’s reply"
    },
    {
      "path": "app/change.html",
      "label": "Move or cancel",
      "purpose": "Ask the coach to move or cancel a booked session (prefilled from the session), with the 24-hour rule, and the changes asked for with their status and reply"
    },
    {
      "path": "app/sessions.html",
      "label": "Sessions",
      "purpose": "Every session newest first with its takeaways, the next step and a link to the notes"
    },
    {
      "path": "app/checkin.html",
      "label": "Check-in",
      "purpose": "Send a check-in before a session (what went well, where you are stuck, one question) and read past check-ins with the coach’s replies"
    },
    {
      "path": "app/package.html",
      "label": "Package",
      "purpose": "The package balance and use-by date, what a session includes, and Monthly coaching to join when the package runs out"
    },
    {
      "path": "app/account.html",
      "label": "Account",
      "purpose": "The account block (email, devices, billing, leaving), the first name the coach sees, and help"
    },
    {
      "path": "privacy.html",
      "label": "Privacy",
      "purpose": "The privacy notice, with blanks the Site Owner fills in"
    }
  ],
  "facts": [
    "coaching business name",
    "coach's name",
    "contact email",
    "phone",
    "package names and sizes",
    "how long before a session to check in",
    "privacy contact and address"
  ],
  "interview": [
    "What is your coaching business called, and what name do clients know you by?",
    "What kind of coaching do you do, and who are your clients?",
    "Which packages do you sell (name and number of sessions), and do sessions have a use-by date?",
    "Where do you keep session notes you share (a link per session works best)?",
    "How long before a session should a client send their check-in?",
    "Which email address and phone number should clients use?",
    "What address and privacy contact should the privacy notice show?"
  ],
  "customise": {
    "strings": [
      "Thorley Coaching and Saoirse Thorley in the header, footer, titles and copy: replace every data-pl-fill fact with the owner’s own. Replace the name in site.webmanifest.name too; keep short_name as Coaching unless the owner chooses another.",
      "Fill in every highlighted blank on privacy.html with the Site Owner before clients use the site (not legal advice: https://pagelemon.com/agents/member-app-legal)",
      "setup_app with signup invite, then save_app_list for each list exactly as memberApp.lists says: package and sessions by owner (the coach adds one package row per client and lowers sessions_left after each session; adds a sessions row after each session, assigned to the client), bookings and checkins by member with their status_options and reply on. Invite each client with invite_users.",
      "The coach confirms a session request by setting its status to Confirmed and writing a reply (the time and the video link or address). A move updates the booking’s day and time and sets it back to Confirmed. Done is for attended sessions, and Cancelled for cancellations. A check-in is marked Replied with a short reply.",
      "The changes list: clients ask to move or cancel a session (members can’t edit a saved booking); the coach moves the booking (day and time, back to Confirmed) or marks it Cancelled, then marks the change Done with a reply.",
      "The week grid on app/book.html shows no times as taken; to show one, list it in data-ta-taken on that grid (\"1-11:00\" is the first day at 11:00), so a real booking is never shown as free.",
      "Set the paid plan with save_plan: monthly (Monthly coaching, £360 a month). Change the prices on index.html and app/package.html together. Packages sold by invoice are rows in the package list, not plans.",
      "Coaching about work only: never add health, diagnosis, medication, payment card, bank or ID fields, and never collect anything about children."
    ],
    "colours": "Edit the :root tokens in the art-direction block at the end of styles.css (light, then dark).",
    "fonts": "Spectral and Public Sans, loaded from Google Fonts on every page; your AI can self-host them on request.",
    "sections": "Member pages live under /app on the shared app kit (kit.css, kit.js, kit-icons.svg; never edit the copies). app/index.html shows the package gate as the link to the package (app.js draws one mark per session from sessions_total and sessions_left), the next booking and the latest next step; app/book.html and app/checkin.html hold the add forms (names match the list’s fields); app/sessions.html the sessions; app/package.html the package and the Monthly coaching join button; app/account.html the account block. index.html holds no member blocks.",
    "images": "art/notebook.svg is the drawn notebook (880 by 1100) on the signed-out welcome screens; replace it with a photo of the coaching room at the same size if the owner has one (never a stranger’s face). The public page draws its own gate and calendar page in index.html. favicon.svg is the session gate mark."
  },
  "schemaVersion": 2,
  "updated": "2026-10-21"
}
