{
  "name": "Pledge",
  "slug": "pledge",
  "blocks": ["Pages", "Lists", "Sign-in: users", "Actions: pay, scan"],
  "persona": "community",
  "keywords": [
    "donations",
    "monthly giving",
    "recurring donations",
    "charity",
    "donate",
    "nonprofit",
    "supporters",
    "regular giving",
    "donor portal",
    "fundraising",
    "donations page for my charity",
    "monthly donations",
    "orchard charity",
    "donors area",
    "volunteer sign-up",
    "volunteer days",
    "donor app",
    "supporter app"
  ],
  "description": "An app template for a community orchard charity: monthly donors sign in to see what their level paid for this season, read the impact updates, book a volunteer Saturday and get a reply from the team, and collect a stamp at the gate for every Saturday worked, ten for a case of the orchard's apple juice. Friend is free; Seed, Grow and Orchard are monthly gifts. A public page with the levels and a one-off gift, eight member screens under /app and a privacy notice with blanks.",
  "audience": [
    "community orchards and food-growing charities",
    "small charities that take monthly gifts",
    "friends groups and supporters' clubs that run a donor area"
  ],
  "category": "Membership",
  "job": "member-app",
  "categoryId": "membership",
  "alsoFits": [
    "recurring donations for a charity",
    "friends of a park",
    "community garden donors",
    "monthly patrons",
    "supporters' updates",
    "volunteer rota for a charity",
    "conservation volunteers",
    "friends of a nature reserve"
  ],
  "direction": "Apple crate labels on timber slats: apple red, leaf and sky, slab lettering and a row of apples per tree",
  "mood": [
    "light",
    "bold",
    "classic"
  ],
  "fonts": [
    "Alfa Slab One",
    "Lato"
  ],
  "memberApp": {
    "path": "/app",
    "setup": {
      "signup": "open",
      "profile_fields": [
        {
          "name": "name",
          "type": "text",
          "label": "First name",
          "required": true
        }
      ],
      "display_field": "name"
    },
    "lists": [
      {
        "list": "bookings",
        "label": "Volunteer Saturdays",
        "by": "member",
        "status_options": [
          "Requested",
          "Confirmed",
          "Came along",
          "Cancelled"
        ],
        "reply": true,
        "fields": [
          {
            "name": "task",
            "type": "choice",
            "label": "Job",
            "required": true,
            "options": [
              "Pruning the old block",
              "Planting bare-root trees",
              "Mulching and weeding",
              "Fencing and tree guards",
              "Picking",
              "Pressing"
            ]
          },
          {
            "name": "date",
            "type": "date",
            "label": "Saturday",
            "required": true
          },
          {
            "name": "guests",
            "type": "choice",
            "label": "Who's coming",
            "required": true,
            "options": [
              "Just me",
              "Me and 1 guest",
              "Me and 2 guests"
            ]
          },
          {
            "name": "tools",
            "type": "choice",
            "label": "Tools",
            "required": true,
            "options": [
              "Borrow ours",
              "Bringing my own"
            ]
          },
          {
            "name": "memo",
            "type": "text",
            "label": "Anything we should know"
          }
        ]
      },
      {
        "list": "messages",
        "label": "Notes to the team",
        "by": "member",
        "status_options": [
          "Sent",
          "Read",
          "Answered"
        ],
        "reply": true,
        "fields": [
          {
            "name": "topic",
            "type": "choice",
            "label": "Topic",
            "required": true,
            "options": [
              "Volunteering",
              "My monthly gift",
              "Fruit and food bank",
              "Events",
              "Something else"
            ]
          },
          {
            "name": "message",
            "type": "long_text",
            "label": "Your message",
            "required": true
          }
        ]
      },
      {
        "list": "stamps",
        "label": "Work days",
        "by": "owner",
        "fields": [
          {
            "name": "item",
            "type": "text",
            "label": "For",
            "required": true
          }
        ]
      }
    ],
    "scan": [
      {
        "list": "stamps",
        "actions": [
          {
            "label": "Work day",
            "values": {
              "item": "Volunteer Saturday"
            },
            "goal": 10,
            "daily_limit": 1
          },
          {
            "label": "Juice share",
            "redeem": 10,
            "from": "Work day"
          }
        ]
      }
    ],
    "plans": [
      {
        "plan": "friend",
        "name": "Friend",
        "free": true
      },
      {
        "plan": "seed",
        "name": "Seed",
        "paid": true,
        "price": {
          "amount": 500,
          "currency": "gbp",
          "interval": "month"
        }
      },
      {
        "plan": "grow",
        "name": "Grow",
        "paid": true,
        "price": {
          "amount": 1200,
          "currency": "gbp",
          "interval": "month"
        }
      },
      {
        "plan": "orchard",
        "name": "Orchard",
        "paid": true,
        "price": {
          "amount": 2500,
          "currency": "gbp",
          "interval": "month"
        }
      }
    ],
    "demo": {
      "member": {
        "name": "Daniel Whitcombe",
        "email": "daniel.whitcombe@example.com",
        "profile": {
          "name": "Daniel"
        }
      },
      "plans": [
        "grow"
      ],
      "rows": {
        "bookings": [
          {
            "date": "+1w:sat",
            "task": "Pruning the old block",
            "guests": "Me and 1 guest",
            "tools": "Bringing my own",
            "_added": "-2d",
            "_status": "Confirmed",
            "_reply": "Lovely. You and Sam are with Ruth on the pear row. Gate at 9:30, tea at 11.",
            "memo": "Bringing my neighbour Sam, his first time"
          },
          {
            "date": "+3w:sat",
            "task": "Planting bare-root trees",
            "guests": "Just me",
            "tools": "Borrow ours",
            "_added": "-1d",
            "_status": "Requested"
          },
          {
            "date": "-1w:sat",
            "task": "Picking",
            "guests": "Just me",
            "tools": "Bringing my own",
            "_added": "-2w:tue",
            "_status": "Came along",
            "_reply": "Thank you, Daniel. Picking done before the rain."
          },
          {
            "date": "-2w:sat",
            "task": "Picking",
            "guests": "Just me",
            "tools": "Bringing my own",
            "_added": "-3w:wed",
            "_status": "Came along"
          },
          {
            "date": "-4w:sat",
            "task": "Pressing",
            "guests": "Me and 1 guest",
            "tools": "Borrow ours",
            "_added": "-6w:sun",
            "_status": "Came along",
            "memo": "Apple day"
          },
          {
            "date": "-5w:sat",
            "task": "Picking",
            "guests": "Just me",
            "tools": "Borrow ours",
            "_added": "-7w:mon",
            "_status": "Cancelled",
            "_reply": "No problem, see you at apple day."
          }
        ],
        "messages": [
          {
            "topic": "Fruit and food bank",
            "message": "I have about six crates of cooking apples from my garden and no way to press them. Do you take surplus fruit?",
            "_added": "-3d",
            "_status": "Answered",
            "_reply": "Yes please. Bring them to the gate on a Saturday morning and we'll weigh them in with the food bank fruit."
          },
          {
            "topic": "My monthly gift",
            "message": "Can I move from Seed to Grow from next month?",
            "_added": "-5w:thu",
            "_status": "Answered",
            "_reply": "Done, and thank you. Grow starts with your next payment; nothing else to do."
          },
          {
            "topic": "Events",
            "message": "Is apple day dog friendly? Ours is very well behaved on a lead.",
            "_added": "-7w:tue",
            "_status": "Answered",
            "_reply": "Dogs on leads are welcome. There's a water bowl by the press."
          }
        ],
        "stamps": [
          {
            "item": "Volunteer Saturday",
            "_added": "-1w:sat"
          },
          {
            "item": "Volunteer Saturday",
            "_added": "-2w:sat"
          },
          {
            "item": "Volunteer Saturday",
            "_added": "-4w:sat"
          },
          {
            "item": "Volunteer Saturday",
            "_added": "-7w:sat"
          },
          {
            "item": "Volunteer Saturday",
            "_added": "-9w:sat"
          },
          {
            "item": "Volunteer Saturday",
            "_added": "-12w:sat"
          },
          {
            "item": "Volunteer Saturday",
            "_added": "-14w:sat"
          }
        ]
      },
      "staff": {
        "members": [
          {
            "name": "Joyce",
            "counts": {
              "Work day": 10,
              "Juice share": 0
            },
            "plan": "orchard",
            "since": "-60w:sat"
          },
          {
            "name": "Daniel",
            "counts": {
              "Work day": 7
            },
            "plan": "grow",
            "since": "-30w:mon"
          },
          {
            "name": "Ama",
            "counts": {
              "Work day": 4
            },
            "plan": "seed",
            "since": "-20w:sat"
          },
          {
            "name": "Sam",
            "counts": {
              "Work day": 0
            },
            "plan": "friend",
            "since": "-1w:mon"
          },
          {
            "name": "Tomasz",
            "counts": {
              "Work day": 13,
              "Juice share": 1
            },
            "plan": "friend",
            "since": "-70w:sat"
          },
          {
            "name": "Gwen",
            "counts": {
              "Work day": 2
            },
            "plan": "grow",
            "since": "-8w:sat"
          }
        ],
        "log": [
          {
            "name": "Joyce",
            "action": "Work day",
            "at": "09:31",
            "by": "Ruth"
          },
          {
            "name": "Tomasz",
            "action": "Work day",
            "at": "09:33",
            "by": "Ruth"
          },
          {
            "name": "Ama",
            "action": "Work day",
            "at": "09:38",
            "by": "Nkem"
          },
          {
            "name": "Tomasz",
            "action": "Juice share",
            "at": "12:24",
            "by": "Ruth"
          }
        ],
        "logDay": "-1w:sat",
        "views": [
          "messages"
        ],
        "queue": [
          {
            "name": "Ama",
            "values": {
              "task": "Pruning the old block",
              "date": "+1w:sat",
              "guests": "Me and 1 guest",
              "tools": "Borrow ours",
              "memo": "First time with loppers"
            },
            "status": "Requested"
          },
          {
            "name": "Gwen",
            "values": {
              "task": "Pruning the old block",
              "date": "+1w:sat",
              "guests": "Just me",
              "tools": "Bringing my own"
            },
            "status": "Requested"
          },
          {
            "name": "Tomasz",
            "values": {
              "task": "Pruning the old block",
              "date": "+1w:sat",
              "guests": "Just me",
              "tools": "Bringing my own"
            },
            "status": "Confirmed"
          },
          {
            "name": "Joyce",
            "values": {
              "task": "Planting bare-root trees",
              "date": "+2w:sat",
              "guests": "Just me",
              "tools": "Borrow ours"
            },
            "status": "Requested"
          }
        ],
        "entries": {
          "messages": [
            {
              "name": "Joyce",
              "values": {
                "topic": "Events",
                "message": "When is the members’ meeting this year?"
              },
              "status": "Sent",
              "added": "today"
            },
            {
              "name": "Ama",
              "values": {
                "topic": "Volunteering",
                "message": "Can I bring my own loppers, or do you prefer we use yours?"
              },
              "status": "Read",
              "added": "-1d"
            },
            {
              "name": "Gwen",
              "values": {
                "topic": "My monthly gift",
                "message": "Could I have a list of my gifts this year for my records?"
              },
              "status": "Sent",
              "added": "-2d"
            },
            {
              "name": "Tomasz",
              "values": {
                "topic": "Fruit and food bank",
                "message": "Our street has a pear tree nobody picks. Could the Saturday team take the fruit next September?"
              },
              "status": "Answered",
              "reply": "Yes please. It’s on our September list; we’ll bring ladders and crates.",
              "added": "-6d"
            }
          ]
        },
        "tally": {
          "messages": "topic"
        },
        "copy": {
          "show": "Show this to Ruth or Nkem at the gate. It changes every minute and works once.",
          "scanTitle": "Scan a volunteer",
          "scanHint": "At the gate, point the orchard phone at the code on the volunteer’s screen.",
          "noun": "work day",
          "nouns": "work days",
          "notes": {
            "Work day": "One stamp per Saturday worked. The scan doesn’t change the booking: mark it Came along in Entries after the day.",
            "Juice share": "Hand over one case of six bottles from the press shed"
          },
          "daily": "one per Saturday",
          "next": "next Saturday",
          "logTitle": "Last Saturday",
          "queueNote": "Confirm each request by Friday evening with a reply saying who they work with; after the Saturday, mark Came along.",
          "membersNote": "Donors and volunteers"
        }
      }
    }
  },
  "slots": [
    {
      "id": "oneoff",
      "kind": "payment",
      "page": "index.html",
      "fallback": "mailto"
    }
  ],
  "files": [
    "index.html",
    "app/index.html",
    "app/updates.html",
    "app/update.html",
    "app/volunteer.html",
    "app/card.html",
    "app/giving.html",
    "app/messages.html",
    "app/account.html",
    "privacy.html",
    "styles.css",
    "app.js",
    "kit.css",
    "kit.js",
    "kit-icons.svg",
    "icons.svg",
    "site.webmanifest",
    "favicon.svg",
    "art/label-scene.svg",
    "art/crate-seed.svg",
    "art/crate-grow.svg",
    "art/crate-orchard.svg",
    "art/apple.svg",
    "art/apple-empty.svg",
    "art/hills.svg",
    "art/task-prune.svg",
    "art/task-plant.svg",
    "art/task-pick.svg",
    "art/task-mulch.svg",
    "art/task-fence.svg",
    "art/press.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: a red poster with the crate label and its tree row, the app at real size, the orchard in numbers, three monthly levels as crate labels and Friend, volunteer Saturdays through the year, a one-off gift, where the money went last year, and Sign in"
    },
    {
      "path": "app/index.html",
      "label": "Home",
      "purpose": "The donor's home: their level as a crate label with a row of apples for the trees it keeps in care, their next volunteer Saturday as an almanac page with its status and reply, work days toward the juice share with Show my code, the winter appeal, the latest reply and this month's update; signed out, a welcome with Continue with email"
    },
    {
      "path": "app/updates.html",
      "label": "Updates",
      "purpose": "Every impact update, newest first, with the numbers each one reports"
    },
    {
      "path": "app/update.html",
      "label": "This month's update",
      "purpose": "The latest update in full: what was done, what the levels paid for, and what's next"
    },
    {
      "path": "app/volunteer.html",
      "label": "Volunteer",
      "purpose": "The next four open Saturdays with each one's job, the request form (closes at noon on the Friday before), and the donor's requests with the team's status and reply"
    },
    {
      "path": "app/card.html",
      "label": "Volunteer card",
      "purpose": "The code to show at the gate, work days toward a case of apple juice, the juice share when ready and every work day stamped"
    },
    {
      "path": "app/giving.html",
      "label": "Giving",
      "purpose": "The donor's level as a crate label with its trees, what it pays for this winter, the appeal, Gift Aid, a one-off gift, and the levels as crate labels with Give monthly buttons"
    },
    {
      "path": "app/messages.html",
      "label": "Ask the team",
      "purpose": "Send the team a note and read their replies, with each note's status"
    },
    {
      "path": "app/account.html",
      "label": "Account",
      "purpose": "Profile, level and renewal, billing, devices and leaving, and links to the card, notes and privacy"
    },
    {
      "path": "privacy.html",
      "label": "Privacy",
      "purpose": "The privacy notice, with blanks the charity fills in"
    }
  ],
  "facts": [
    "charity name and registered number",
    "address, phone and email",
    "director",
    "the four levels and their monthly prices",
    "what each level pays for",
    "one-off gift amounts",
    "impact updates",
    "where the money went last year",
    "volunteer days, times, jobs and places",
    "volunteer reward",
    "current appeal and its progress",
    "team names"
  ],
  "interview": [
    "What is your charity called, and where is the orchard or project?",
    "Which monthly levels will you offer, and what does each one pay for over a year?",
    "When are your volunteer days, and which jobs and how many places does each have?",
    "Would you like a reward for regular volunteers, and after how many days?",
    "What is your current appeal, its target and how far you've got?",
    "Which email address should donors write to, and who answers privacy questions?"
  ],
  "customise": {
    "strings": [
      "Brookside Orchard Trust, Brook Lane, Ottery Hythe, the director Nkem Ashworth-Lyle, the volunteer lead Ruth Pell, the registered charity number and the phone in the header, footer, titles and privacy notice: replace every data-pl-fill fact with the charity's own, and the appeal, the impact updates and the spending chart with its own figures. Also replace site.webmanifest name and short_name.",
      "Set the four levels with save_plan (friend free; seed £5, grow £12 and orchard £25 a month) and change the prices on index.html and app/giving.html together.",
      "Make the bookings and messages lists with save_app_list exactly as memberApp.lists says (status_options and reply on). The Saturdays' jobs are in app.js (SEASON, a rota per month that turns one job a week; SESSIONS for one-off changes) and in the task options: change them together.",
      "The stamps list and its scan actions: save_app_list for stamps with scan exactly as memberApp.scan says (Work day, goal 10, one a day; Juice share redeems 10). Staff who stamp at the gate need the Scan members permission. Change the reward text on app/card.html and app/index.html if the goal or reward changes.",
      "Fill in every highlighted blank on privacy.html before donors use the site (not legal advice: https://pagelemon.com/agents/member-app-legal).",
      "Each impact update is static HTML: put the newest at the top of app/updates.html and its full text on app/update.html, and change the teaser on app/index.html.",
      "Adults only. Never collect postal addresses, tax details, Gift Aid declarations, card numbers or bank details in the app: Gift Aid declarations are made on the charity's paper form, and payments go through Stripe.",
      "The tree row: £14 keeps one tree in care for a year, so Seed shows 4 apples, Grow 10 and Orchard 21 (index.html, app/index.html, app/giving.html). If your costs or levels differ, change the sentence and the number of <li> in each .p-apples list together."
    ],
    "colours": "Edit the --p-* tokens at the top of styles.css (Apple Red, Leaf, Sky, Cider Cream, Crate Wood, ink); the kit's --k-* tokens follow them. The dark scheme follows the device: the orchard at night, deep leaf with a starry sky band.",
    "fonts": "Alfa Slab One for crate-label lettering and headings, Lato for text, both from Google Fonts (one link in every page head).",
    "sections": "Member pages live under /app and use the data-pl-view markup and the shared app kit (kit.css, kit.js, kit-icons.svg; node scripts/sync-app-kit.mjs pledge). setup_app with signup open and the first-name profile field, so anyone can join as a Friend and staff see the first name when they scan. Then save_app_list for bookings, messages and stamps (with scan), then save_plan for friend (free), seed, grow and orchard (monthly). The level cards sit inside data-pl-if=\"plan:<level>\" and the Give monthly buttons inside no-plan. The team confirms bookings and answers notes in the Dashboard (status and reply); staff stamp work days by scanning the donor's code at the gate.",
    "images": "art/label-scene.svg is the Friend and signed-out crate label's picture (a sun over hills, apple trees and one big apple); art/crate-seed.svg, art/crate-grow.svg and art/crate-orchard.svg are the Seed, Grow and Orchard labels' pictures (a sapling with its guard, a pruned tree with the chipper, a full tree with a ladder and a crate); the label's arched name is live text in each page. art/task-*.svg and art/press.svg are the Saturday jobs as four-colour crate-label drawings (prune, plant, fence, mulch, pick, press); app.js picks one per Saturday by its job. art/apple.svg draws the tree row and stamps, art/hills.svg the hill line under each sky band, and the favicon is the apple on a red label. To use a photo of the orchard, swap a task drawing for a landscape 4:3 photo. Never a stranger's face: show volunteers' hands, tools or backs."
  },
  "updated": "2026-10-21",
  "schemaVersion": 2
}
