Home›Membora›Quickstart
Membora · Quickstart

Membora Quickstart, as shipped in the download

The QUICKSTART.txt in the download — the same steps your delivery email carries.

MEMBORA — QUICKSTART
===================

REQUIREMENTS
------------
  - PHP 8.0+ with extensions: pdo, pdo_sqlite (or pdo_mysql)
  - MySQL 5.7+ OR SQLite 3 (SQLite requires no extra setup)
  - A web server (Apache with mod_rewrite, or Nginx with try_files)


SHARED HOSTING / CPANEL (RECOMMENDED FOR MOST BUYERS)
------------------------------------------------------
1. Upload the CONTENTS of the `app/` folder to your web root (e.g. public_html/)
   or a subdirectory (e.g. public_html/membora/).

2. Make sure this directory is writable by PHP:
     data/

   Via cPanel File Manager: right-click -> Permissions -> set to 755 or 775.

3. Visit https://yourdomain.com/install/ in your browser.

4. Fill in the installer:
     - Database: choose MySQL (fill in host/name/user/pass) or SQLite (no setup)
     - Club or association name, currency and timezone
     - Admin name, email + password

5. The installer writes config.php and redirects you to the login page.

6. Sign in. On the dashboard or Settings, click "Load demo data" to explore a
   sample club -- including an AGM that was quorate and carried a motion, and a
   committee meeting that was NOT, whose motion is still open. That second one is
   deliberate: it is the state the product exists to make visible.


TYPICAL FIRST-RUN WORKFLOW
--------------------------
  1. Settings      -> confirm the club name, currency and timezone.
  2. Rates         -> create the subscription rates your constitution names
                      (e.g. "Full member", "Concession", "Life member",
                      "Honorary member"). Life and honorary never lapse.
  3. Members       -> add a member, or import a roster from CSV.
  4. Member page   -> put them on a rate; a subscription term starts and
                      (optionally) a charge is raised.
  5. Meetings      -> schedule a meeting and set its QUORUM. This is the number
                      everything else hangs off: a motion cannot be carried at a
                      meeting that did not reach it.
  6. Roll call     -> pick the meeting, type a name, mark present or apologies.
                      The quorum count moves as you go. Members in arrears are
                      still marked present -- attendance is a record of fact.
  7. Motions       -> record what was proposed, then who voted which way. A member
                      whose subscription has lapsed cannot have a vote recorded;
                      Membora says so, with the date it lapsed.
  8. Payments      -> record subscriptions paid; watch the Arrears list, because
                      everyone on it loses their vote at the next meeting.

OPTIONAL: DUES BY CARD AND RENEWAL TEXTS (both off until you switch them on)
---------------------------------------------------------------------------
  Card payments, through your own Stripe account (Settings -> Card payments for dues):
    1. In Stripe, add a webhook endpoint at https://<your Membora address>/hooks/stripe
       for checkout.session.completed and checkout.session.async_payment_succeeded.
    2. In Settings, tick "Take dues by card", choose the currency, paste your secret
       key (sk_live_... or sk_test_... to try it) and the endpoint's signing secret.
    A member's card page then shows what they owe with a "Pay by card" button.
    Refunds are made in Stripe and recorded in Membora by hand.

  Renewal texts, through your own SMS gateway (Settings -> Text reminders for renewals):
    1. Give your gateway's https address, key and field names (Twilio: form-encoded,
       To,From,Body, Basic with AccountSid:AuthToken), then press "Send test".
    2. Tick "Texts OK" on the records of members who agreed to texts.
    Texts go out inside your send window: a few each time someone opens the
    dashboard, and the rest whenever cron/expiring.php runs inside the window.


VPS / SELF-HOSTED
-----------------
Apache example:

  <VirtualHost *:80>
    DocumentRoot /var/www/membora/app
    <Directory /var/www/membora/app>
      AllowOverride All
      Require all granted
    </Directory>
  </VirtualHost>

Run the web installer as above, or use the CLI seeder to load demo data:

  php bin/demo.php    # loads demo data (login: admin@membora.app with the one-time password it prints)


DOCKER (QUICK TEST)
-------------------
  docker run --rm -p 8080:8080 \
    -v "$(pwd)/app:/var/www/html" \
    -w /var/www/html \
    php:8.3-cli \
    php -S 0.0.0.0:8080 router.php

  Then visit http://localhost:8080/install/


RUNNING THE TESTS
-----------------
  docker run --rm -v "$(pwd)/app:/app" -w /app php:8.3-cli php tests/run.php

  Expect: ALL 90 TESTS PASSED (0 failed)


POST-INSTALL SECURITY CHECKLIST
--------------------------------
  [ ] config.php is protected (the .htaccess does this automatically)
  [ ] data/ is not web-accessible (.htaccess blocks it automatically)
  [ ] Use HTTPS in production
  [ ] Keep PHP updated
  [ ] Use a strong admin password


LOOKING AFTER IT (from 4.0)
---------------------------
  * Updates: open Updates in the menu, save your license key once, press Check for updates.
    Reaching 4.0 from 3.x is the last update by hand: replace the files; config.php and data/ stay.
  * Sample data: the installer offers to start with a sample; remove it later with one click.
  * Backups: "Back up once a day by itself" is on by default (/restore); add an S3-compatible bucket there for
    a copy somewhere else. The Health page (/health) says whether all of this is working.
  * On Nginx: use the server block in the manual ("On Nginx: keep data/ private", https://ownware.io/p/membora/manual);
    it opens the installer and keeps data/ private.
  * One-line install for technical owners:
    curl -fsSL https://ownware.io/install.sh | sh -s -- membora <your license key>

NOTES
-----
  * Membora is the SECRETARY-side register, not a public club website.
  * "Today", lapse dates and subscriptions-this-month are all computed in the
    timezone you set in Settings.
  * Money is stored as integer cents; enter subscriptions as plain decimals (35.00).
  * Quorum 0 on a meeting means "none required", not "a requirement of zero".
    Capacity 0 likewise means no limit, which is what most club meetings are.
  * The demo's "Reset all data" removes members, subscriptions, payments, meetings,
    motions and votes, but keeps your login and settings.

← Back to Membora · Manual · API · Test run