You may test with dummy records on any server, as demonstrated at soul-trade.com/cspractice. Once you begin entering real patient data, ensure your server meets the security requirements below β HTTPS enabled, field encryption turned on (Setup β Security), and config.php backed up securely. With these in place, an internet-accessible shared hosting server is a perfectly valid live environment.
| Component | Minimum | Recommended |
|---|---|---|
| PHP | PHP 8.0+ | PHP 8.2 or 8.3 |
| Database | MySQL 5.7+ or MariaDB 10.4+ | MySQL 8.0+ |
| Web server | Apache 2.4 with mod_rewrite | Apache 2.4 or Nginx |
| SSL certificate | Required for any live use | Let's Encrypt (free) or commercial cert |
| Hosting | Private intranet or dedicated server | Self-hosted on practice premises or UK-based private server |
| Backups | Daily automated database backup | Daily backup with off-site copy, tested monthly |
An intranet installation runs on a server that is only accessible from within your practice network (or via VPN). Patient data never leaves your building. This is the recommended approach for any practice holding real patient records. This can be as simple as using an older computer (e.g. a Raspberry Pi 4 β around Β£55 new, silent, pocket-sized, uses 3W of power and runs 24/7 β an old Mac or Windows laptop, or NAS device running Linux) and simply copy/pasting the commands shown in the π« Raspberry Pi installation guide, Apple Mac installation guide or the Windows installation guide β all written for non-technical practitioners.
An internet installation is accessible from anywhere β convenient for multi-site practices, but requires stronger security measures: strong passwords, regular security updates, firewall rules, and ideally IP whitelisting.
Patient health data is special category data under UK GDPR (Article 9). As a data controller you are required to:
The GOsC, GCC, CNHC and other UK regulatory bodies all require members to comply with data protection law as a condition of registration. Your indemnity insurance provider may also have specific requirements around clinical record keeping and data storage.
Each patient record has an Attachments tab for storing scanned documents, X-ray reports, GP letters, referral notes, insurance forms and any other files relating to that patient.
PDF, JPG, PNG, GIF and WebP. Maximum file size 10MB per file. For larger files (e.g. high-resolution X-rays) reduce the scan resolution before uploading.
Open the patient record, click the Attachments tab, and use the upload form. You can:
Uploaded files appear as a card grid. PDFs show a document icon, images show a thumbnail preview. Click Open to view the file in a new browser tab. PDFs open directly in the browser; images display inline.
Emails don't need a separate attachment mechanism β copy and paste the relevant content into the patient's yellow notes field or save it as a letter record. For emails with important attached documents, save the attachment as a PDF and upload it here.
Attachments are stored in a folder called cs_attachments located
one level above the web root β outside publicly accessible directories. This must
be created manually and the path configured in config.php:
define('ATTACH_PATH', '/full/path/to/cs_attachments');
See the Mac or Windows installation guide for the correct path for your setup.
cs_attachments folder β it is outside the web root and may not be
included in standard web backups automatically.
All logged-in users can view attachments. Only Medium Level and above can upload or delete files.
The Audit page is accessed from the main navigation. It provides a cross-tab query builder that searches across all clinical fields simultaneously β demographics, conditions, examination findings, medicines, treatments, practice details and dates. This is the feature that makes structured data entry pay off.
The left panel is the query builder. Start with one empty row β choose a field from the dropdown, the input type changes automatically to match:
Click + Add criterion to add more rows. All criteria are combined with AND β every condition must be met. Click Search to run.
| Group | Fields |
|---|---|
| Demographics | Sex, Age range, Postcode, Employment type |
| Condition | Primary condition, Secondary conditions, Therapy type, State (acute/chronic), New condition, Maintenance, Nerve radiation |
| History | PMH/Cranial, Past medical history, Patient notes (yellow), Accident/RTA, Condition duration |
| Examination | Exam findings, Better, Worse, Smoker, Improvement %, SLR left, SLR right |
| Clinical (P3) | Diagnosis, Prognosis, Treatment history, Medicine history, Movement/Emotion, Five Element |
| Sessions | Session treatment, Session condition, Session notes, Session medicine |
| Practice | Practice location, Referral source, Practitioner |
| Dates | Last seen range, First contact range, Date of birth range, Date added range |
Results show Name, Age, Sex, Primary condition, Location, Last seen, Treatment, Improvement and Practitioner. Click any name to open that patient record. Results are limited to 500 β if your search returns the limit, refine your criteria.
Once you have a results list, click π· Tag cohort to reveal the colour picker. Select a colour and click Apply Tag β all matching patients are tagged with that colour simultaneously. You can then filter the Patients list by that colour to work with the cohort.
Colours carry no fixed meaning β you decide what each colour represents for a given audit project. Clear the colour when your analysis is complete.
SoftTissue not
Soft Tissue. This is already enforced in the treatment value list.
At the top of the Search Criteria panel is a free-text search box. Type any word or phrase and it searches across all major text fields simultaneously β name, address, notes, precautions, condition, treatment history, diagnosis, session notes and treatment plan titles and goals. Useful for "I know it's in there somewhere" searches.
After running a search, a Save this search panel appears below the query builder. Give it a name, an optional description, and optionally tick Share with all users to make it available to all practitioners. Saved searches appear in the Saved Searches panel and can be run again with one click.
The Statistics page is accessed from the main navigation. It has three tabs β Practice Dashboard, Clinical, and Cohort β filtered by year and practitioner.
Summary cards at the top show sessions this month, sessions this year, sessions all time, income this month, income this year, new patients and active patients. Below these are four charts:
Deeper clinical analysis for the selected year:
Select a colour-tagged patient cohort to analyse. Colour-tagged cohorts are created on the Audit page β search for patients, then tag the results with a colour. The cohort tab then shows:
This is the research view β tag a cohort on the Audit page, then come here to see the statistical breakdown of that specific group.
Year and practitioner dropdowns at the top apply across all three tabs. Select a specific practitioner to see their individual statistics, or leave on All practitioners for the whole practice.
The Case History page is the detailed clinical intake record β accessed via the π Case History button on any patient record. It has four tabs, each saving independently so you can fill them in stages without losing work.
Throughout Page 2, input works on the mosaic principle β choose a value from the dropdown, click the β arrow, and it appends to the yellow text field below on a new line. You can then type freely in the text field to add your own words. Come back and add more at any time. Type the first letter of a value to jump to that part of the list.
The yellow text field is what gets saved β it becomes a cumulative, readable clinical record that also feeds the audit search engine.
Seven satellite dropdowns (Structural, CV/Resp, Abdominal, Neurological, Smell, Eyes/Skin, Bowels/Tongue) each feed into one central yellow findings text box. Choose a finding from any satellite, click β, and it appends to the findings record.
A mosaic snapshot of the patient's lifestyle and emotional context β one of the most clinically useful fields in the system. "Dog, gardening, recently divorced, fragile, needs holiday" tells you more about a patient in five seconds than a structured questionnaire.
The value list covers exercise, hobbies, mobility, social situation, emotional state, beliefs and lifestyle. All values are editable in Setup β Value Lists β Movement & Emotion.
The Five Elements dropdown (Wood / Fire / Earth / Metal / Water) sets a colour indicator and shows the associated organ systems, season, emotion and characteristics. Links to the Five Elements & Pulse History page (coming soon).
All the dropdown lists in Page 2 are editable in Setup β Value Lists. The page shows an index at the top β click any list name to jump to it. Add new values with the + Add button. Remove values with the β button. Changes take effect immediately. Other editable value lists are in Contacts (GPs and therapists), Medicines and in Setup where you can add practice locations (and practitioners who are the Users)
Page 3 is accessed via the π Rx button on any patient record. It records the prescribing and treatment picture β diagnosis, prognosis, medicines prescribed and treatments given β all using the mosaic append pattern.
The page is divided into four quadrants:
Five separate dropdown lists each feed the same central medicine history text box:
Select from any list, click β to append to the medicine history. Type the first letter to jump to that part of the list. The text box is fully editable β add dosages, frequencies and notes freely.
The treatment list covers the full range of techniques used across therapy types:
GOT Β· AK Β· Meridian Β· Mobilize Β· Recommend Β· TreatmentIncluded Β· HVT Β· Cranial Β· Facial Β· SoftTissue Β· Hydrotherapy Β· StrainCounterStrain Β· MET Β· Naturopathic Β· Osteopathy Β· Acupuncture Β· Chiropractic Β· Physiotherapy Β· Chiropody Β· Counselling Β· Reiki Β· Herbalism Β· Aromatherapy Β· Reflexology
The π Date button inserts today's date as a divider β useful for building a chronological treatment record across multiple visits.
Choose from the diagnosis value list (Musculoskeletal, Neurological, Visceral, Cranial, Naturopathic etc.) and append to the diagnosis text box. Add your own clinical detail freely in the text box.
Excellent / Good / Fair / Guarded / Poor / Refer β append and annotate as the clinical picture evolves.
The standard medicine, supplement, herbal and homeopathic lists are large reference lists. They can be managed via Setup β Value Lists. A dedicated medicines management interface with search and pagination will be added in a future version for easier management of the full lists.
The Treatment Plan is accessed via the π Plan button on any patient record. It records a structured plan of up to 5 clinic-based and 5 home-based goals, tracks achievement, and produces a printable summary to show the patient.
Up to 5 practitioner-led goals β techniques, referrals or clinical objectives. Choose from the dropdown list or type your own. Goals show in red when still to do. Click the checkbox when a goal is achieved β it turns green with strikethrough. A positive image for both patient and practitioner.
Up to 5 patient-led goals β exercise, lifestyle, self-care. Same layout and colour coding as Milestone 1. The same goal list is available for both milestones.
Shows both milestones side by side with a progress bar (e.g. 3/5 achieved) and achievement dates. The Print / Show Patient button opens a clean printable page β red for still to do, green strikethrough for achieved. This can be printed and given to the patient or displayed on screen during the consultation.
The Treatment Plan Goals list is editable in Setup β Value Lists β Treatment Plan Goals. Add your own goals, remove ones you don't use. Both milestones share the same list.
The Podiatry page is accessed via the π£ Podiatry button which sits to the left of the Edit Baseline button at the top right of the Examination Findings card on the patient's Examination tab.
| Group | Example findings |
|---|---|
| General | Verrucae, Diabetes, Flat foot, Orthotics, Gait |
| Forefoot | Bunions, Morton's neuroma, Metatarsalgia, Hallux Rigidus |
| Toe | Hammer toe, Ingrown toenails, Dorsal corns |
| Ankle | Achilles tendonitis, Ankle sprain, Peroneal tendon injury |
| Midfoot | Plantar fasciitis, Lisfranc's injury, Cuboid compression |
| Hindfoot | Haglund's deformity, Tarsal tunnel syndrome, Heel spur |
Select Left, Right or Both at the top. Choose a finding from any dropdown and click β to append to the yellow notes field as:
Left Β· Forefoot Β· Bunions
Type the first letter in any dropdown to jump to that part of the list. The notes field is fully editable β add your own observations freely.
Podiatry notes appear as a read-only yellow card at the bottom of the Examination tab on the patient record, with an Edit link back to Page 6. They are stored separately from the baseline examination findings.
All six podiatry finding lists are editable in Setup β Value Lists β look for the six Podiatry entries in the index. Add new conditions, remove ones you don't need.
Page 4 is accessed via the π©» Imaging button on any patient record. It provides a dedicated store for imaging records β X-rays, MRI, CT scans, ultrasound and other investigations β separate from the general attachments system.
Each imaging record captures:
Saved records appear as cards showing a thumbnail of the image. Click a thumbnail to open it full-screen in a lightbox viewer. PDF reports open in a new tab. Finding tags (disc degeneration, osteophytes etc.) are shown as small pills on each card.
Images are stored in the attachments/[patient_id]/imaging/ folder on the server β separate from general attachments. Make sure this folder is writable by the web server. Supported formats: JPG, PNG, WebP, GIF and PDF.
Page 5 is accessed via the β― Elements button on any patient record. It requires a Date of Birth to be recorded for the astrological calculations. It has five tabs.
An interactive pentagon showing the five elements in their generating cycle. Click any element in the pentagon to make it central β all text panels, the organ line, the pulse dropdown and the colour scheme update instantly to reflect that element.
The same five elements component with the panels repositioned β direction text on the left, pentagon in the centre, personality text on the right. The same click-to-recentre interaction applies.
A structured pulse recording tool. Set a date, select quality and value for each of the 6 positions (3 left hand, 3 right hand), then click the β arrow to append a timestamped entry to the pulse history record:
02/10/2024 * +5 +4 +3 +5 +4 +3 * floating sinking rapid hesitant slow hesitant
The history accumulates over time, providing a longitudinal pulse record for comparison across visits. Left hand positions shown in red/green/blue, right hand in green/yellow/red.
Western β sun sign calculated automatically from DOB. Shows the sign symbol, dates, element, modality and ruling planet. Below are the full sign description (yellow), sign group text (blue) and modality text (red). The sign can be overridden via dropdown if needed.
Chinese β zodiac animal, element and yin/yang calculated from birth year, with character description. Note: simplified calculation β for births in January or February check the exact Chinese New Year date.
Indian β a reference table showing the correspondence between Western signs, Indian (Vedic) signs and Chinese signs with their elements. The current patient's sign is highlighted.
Step-by-step instructions for building a complete five elements and astrological profile for a patient. Explains the workflow from DOB entry through to syndrome identification.
Before adding patients, configure the system in Setup:
Go to Setup β Password. You'll need to enter your current password before setting a new one. Minimum 8 characters.
The welcome page serves two purposes β a public-facing introduction to CrystalSolutions for visitors who aren't logged in, and a daily practice dashboard for logged-in users. The two views are different: the public view shows the feature overview; the logged-in view shows live practice data.
The logged-in dashboard shows up to six collapsible panes β each only appears if there is data to show:
Each pane has a small hide / show link in the top right. Click hide to collapse a pane β it stays collapsed on that device until you show it again. This is stored in your browser's local storage, so each device remembers its own settings independently.
The Modules section (the feature cards β Patients, Sessions, Audit etc.) also has a single hide/show toggle. Once you know the system, hide the modules to keep the dashboard clean.
The Design Philosophy card at the top has its own hide/show. New users should read it; experienced practitioners can hide it permanently.
If you'd prefer to go straight to the patient list after login rather than seeing the dashboard, go to Setup β Practice and uncheck Welcome screen on/off. You'll land on the Patients list every time instead.
When someone visits the CrystalSolutions URL without being logged in, they see the public version of the welcome page β the feature overview, design philosophy and pricing. This is intentional: the URL can be shared as a product overview. The clinical dashboard is only visible after login.
Click + New Patient from the Patients list. The only required field is Surname β all other fields can be filled in later. After saving you'll be taken directly to the patient record.
The search bar on the Patients list searches across: surname, forename, phone, mobile, email and postcode. You can also filter by status (New, Existing, Regular etc.) and by practice location.
Click any column header to sort the patient list by that column β click again to reverse the order. An arrow (β β) shows the current sort. Available sorts:
If a review period is set in Setup β Practice, a π clock icon appears next to the Last Seen date for any patient who hasn't been seen within that period. Hovering shows "Due for review". The same patients appear in the Due for Review pane on the welcome dashboard and in Audit β Quick Searches.
The coloured strip at the top of every patient record shows the key clinical facts at a glance:
| Type | Appearance | Purpose |
|---|---|---|
| Yellow notes | Yellow background, black text | Per-patient narrative notepad. Informal, free text. Record secondary conditions, memorable details, date-stamped observations. "Great guitarist β came in with neck pain after long recording session." |
| Precautions | Bold red text | Safety-critical information β latex allergy, pacemaker, anticoagulants, contrast media reactions. Shown prominently on all views. |
| Practice notes | Small turquoise text | Practice-wide noticeboard β the same text appears on every patient record. Use for admin reminders relevant to all staff: "Buy couch roll", "Parking suspended 15th-17th". |
The colour dots in the patient top strip are a temporary grouping tool for audit work, not a permanent clinical indicator. For example:
Colours available: Green, Yellow, Red, Blue, Grey and Clear. They carry no fixed clinical meaning β you decide what each colour represents for a given project.
The Primary Condition on the patient record is the original presenting complaint β it's set once at first contact and reflects why this person became your patient. It doesn't change when they come in with something different one week.
Each Session records its own primary and secondary condition for that visit. Secondary conditions and evolving presentations are captured in the yellow notes and per-session records.
Both the new session and edit session forms have a Save Session button in the page header β right next to the patient name. No need to scroll to the bottom of a long form just to save, especially useful on mobile or when you only need to update a few fields.
The Examination Findings and Fee cards each have a small hide/show link in their title bar. If you rarely use examination findings in sessions, hide that section β it stays hidden on that device until you show it again (stored in browser local storage). This keeps the form compact for quick end-of-day data entry.
Sessions are individual treatment appointments. Add a new session from the patient record (+ Session button) or from the Sessions list. Sessions require Medium Level access or above β reception staff can view sessions but cannot add or edit them.
The Therapy Type field on a new session pre-fills automatically from the practice default set in Setup β Practice. You can override it for any individual session. This saves time for single-discipline practices where every session is the same therapy type.
The Examination Findings card on the session form has a π£ Podiatry button in the top right. This opens the patient's podiatry page in a new tab so you can record podiatry findings alongside the session β without losing your place in the session form.
The session form includes all 7 examination tabs. You only need to record what has changed from the baseline β the baseline findings are shown as hints (blue dots). If nothing has changed neurologically, leave the Neurological tab blank.
The session view shows changed findings highlighted in blue with a "new" badge, making it easy to see what was different at that visit compared to the patient's baseline.
Examination findings work on a two-tier system:
| Tab | What it covers |
|---|---|
| π§ Neurological | Cranial nerves IβXII individually, Valsalva, reflexes |
| 𦴠Structural / Orthopaedic | FP, SLR, ADAMS, KEMPS, percussion, compression, distraction, ROM restrictions, Tinnels, sacroiliac |
| π« Abdominal | Tenderness, guarding, quadrant locations, hernia, aortic pulse, organ enlargement |
| π Bowels / Tongue | Bowel habit, IBS, colitis, blood/fatty stools, tongue appearance |
| π Eyes / Skin | BP signs, pupils, skin conditions, jaundice, cyanosis |
| π« CV / Respiratory | SOB, pulse quality, oedema, breath sounds, cough type |
| π Smell / Hearing | Characteristic smells, halitosis, hearing changes, tinnitus |
The patient examination page shows the full history of session-level changes with dates, each linking back to the original session record. This provides a longitudinal record of how the clinical picture has evolved over time.
The Examination tab on the patient record also shows a read-only summary of the Page 2 case history fields β secondary conditions, condition duration, accident/RTA, PMH & cranial text, and the examination findings mosaic. The pain map (front and back body diagram) appears as a compact thumbnail alongside these fields, with only the painted zones coloured. All fields link back to Page 2 for editing.
The Examination tab has a π£ Podiatry button in the top right of the baseline findings card. This opens a dedicated podiatry page with six finding groups β General, Forefoot, Toe, Ankle, Midfoot and Hindfoot β each with a dropdown value list. Select Left / Right / Both, choose a finding and click β to append to the podiatry notes field. Podiatry notes are stored separately from the baseline examination findings and shown in their own card at the bottom of the Examination tab when recorded.
Click any empty time slot or the + New Appointment button. The booking form lets you set:
Use the practitioner dropdown at the top of the schedule to switch between diaries. Administrators can view all diaries. The Side by side button (admin only) shows all practitioners in columns simultaneously.
If you try to edit an appointment belonging to another practitioner, you will be asked to enter that practitioner's password. This prevents accidental changes to someone else's diary while still allowing reception staff to make bookings on behalf of practitioners.
Click an appointment to open the popup, then click β Attended to mark the patient as attended. This can be done by reception at the time of the appointment. Attended appointments are shown with reduced opacity.
Click β Diary Settings to configure your personal diary preferences:
Each practitioner has their own diary settings. Administrators can set settings for any user.
Records payments received from patients. Each receipt records: date, patient (optional), amount, payment method, status (stored/pending/void), practitioner and notes.
Income receipts can be added by reception staff (Low Level access). Only Medium Level and above can add expenditure or delete records.
Records business outgoings. Expense types include: courses, equipment, materials, postage, rent, software, stationery and more. Each expense records: date, type, recipient, amount, payment method, and optional tax rate.
The Debit / Credit field distinguishes outgoing payments from refunds received.
Filter by year and month. The summary bar at the top always shows the filtered totals for Income, Expenditure and Net β useful for monthly reconciliation and annual returns.
Cash, Cheque, Debit Card, Credit Card, BACS, Insurance, Trade, Unpaid, Gratis.
Open a patient record and click β Letter. Choose a template or start blank. The letter is pre-populated with patient and practice details via merge variables.
Templates use {{double curly braces}} for merge fields. Available variables:
| Variable | Fills with |
|---|---|
{{patient_name}} | Patient's full name |
{{patient_address}} | Patient's full address |
{{patient_dob}} | Patient's date of birth |
{{gp_name}} | Patient's GP name (from linked contact) |
{{gp_address}} | Patient's GP address |
{{practitioner}} | Logged-in practitioner's name |
{{practice_name}} | Practice name from Setup |
{{practice_address}} | Practice address from Setup |
{{letter_date}} | Today's date |
{{presenting_condition}} | Most recent session's primary condition |
{{treatments}} | Most recent session's treatments |
Every saved letter is stored against the patient record with the date, recipient, subject and the name of who wrote it. Letters appear in the Letters tab of the patient record and in the main Letters list.
The Documents module stores two types of document: Practice Documents (contracts, policies, GDPR notices β not linked to any patient) and Patient Documents (consent forms, insurance authorisations, GDPR sign-offs β stored directly against a patient record).
Open a patient record and click π Document in the quick-action strip. Choose a template or start blank. The document is pre-populated with patient and practice details via merge variables. Give it a name, optionally record a signed date, edit the body, and save.
Go to Documents in the main navigation, select the Practice Docs tab, and click + New Practice Document. Choose a template (e.g. Associate Contract, GDPR Privacy Notice) or start blank. Practice documents are not linked to any patient β they are available to all staff to view and print.
Templates use {{double curly braces}} for merge fields. Variables are
merged automatically when you choose a template. You can also click any variable chip
to insert it at the cursor position while editing.
| Variable | Fills with |
|---|---|
{{patient_name}} | Patient's full name |
{{patient_address}} | Patient's full address |
{{patient_dob}} | Patient's date of birth |
{{practitioner}} | Logged-in practitioner's name |
{{practice_name}} | Practice name from Setup |
{{practice_address}} | Practice address from Setup |
{{doc_date}} | Today's date |
{{presenting_condition}} | Most recent session's primary condition |
{{associate_name}} | Free text β fill in manually (contracts) |
{{associate_address}} | Free text β fill in manually (contracts) |
Patient documents have an optional Signed Date field. Once recorded, the date shows in green in the Documents tab β useful for tracking which patients have signed their consent form. Unsigned documents show a dash.
Open any document and click Print / PDF. The document renders with a practice letterhead (practice name and address from Setup) and prints cleanly β use your browser's "Save as PDF" option to generate a PDF copy.
The Documents page has three tabs:
| Action | Access required |
|---|---|
| View any document | All staff |
| Create / edit / delete documents | Medium Level |
| Create / edit / delete templates | Admin |
Each entry records: date, category, title, provider, hours, whether a certificate is held, notes and a reflection. The reflection field is required by most UK regulatory bodies for audit purposes.
Click Print / Export to open a clean print-ready version of your CPD log. This opens in a new tab and triggers the print dialog automatically. It includes all entries for the selected year, your reflection notes, and a total hours summary showing verified vs unverified hours.
Filter by year before printing to produce your annual CPD return. The GOsC and other regulatory bodies typically require a minimum of 30 hours per year.
Each practitioner sees only their own CPD log. Administrators can switch between practitioners using the dropdown at the top of the CPD page.
Contacts stores GPs, specialists, referrers, associates and other healthcare providers. A patient can have a GP linked to their record β when you write a GP referral letter, the GP's name and address auto-populate from this contact record.
GP, Specialist, Physiotherapist, Osteopath, Chiropractor, Acupuncturist, Herbalist, Homeopath, Naturopath, Counsellor, Podiatrist, Reflexologist, Aromatherapist, Insurer, Solicitor, Associate, Supplier, Staff, Reception, Other.
Each contact can have two addresses β typically a surgery/practice address (A) and a home address (B). The secondary address is hidden by default and expands when needed.
When viewing a GP contact record, all patients who have that GP linked to their record are listed at the bottom β useful for managing practice populations and referral relationships.
The stock module tracks dispensary products and practice supplies β quantities in stock, reorder levels, purchase and sale transactions, and supplier links. Low stock items appear as a warning on the welcome dashboard.
Products & Remedies β things you sell or dispense to patients: supplements, homeopathic remedies, herbal preparations, and other saleable items.
Practice Supplies β consumables you use but don't sell: couch roll, gloves, equipment, office supplies.
Click + Add Item on the relevant tab. Fill in the name, category, unit, cost price, sale price, and reorder level. Link a supplier if you have one set up in Contacts.
The Unit field should contain a word describing the unit of measure β not a quantity. For example:
bottlesrollsboxes or eachThere is no opening stock field on the product form β stock levels are built entirely from transactions. After adding a new product, set your opening balance like this:
This establishes your opening balance and appears correctly in the transaction history. The online demo has working examples of both a remedy (Arnica) and a practice supply (Couch rolls) if you want to see how it should look.
Click + Stock on any product card to record a transaction. Four types are available:
When editing a session, a Products Sold / Used card appears below Medications and above Fee. Select a product from the dropdown β it shows current stock levels β enter the quantity, and the price auto-fills from the product's sale price (which you can override). Stock decrements automatically when you save the session. If you edit and re-save, the stock is recalculated correctly.
Any active product whose stock quantity is at or below its reorder level appears in the amber β Low Stock pane on the welcome dashboard. Click Manage stock β to go directly to the stock page. The alert only fires if a reorder level greater than zero has been set.
Click History on any product card to see a full log of all stock movements β purchases, sales, adjustments and write-offs β with date, quantity, price and the patient if a session sale was linked. Use the From / To date filter to narrow to a period, then click Print / PDF to print or save as PDF from your browser. A totals row at the bottom shows units in, units out, net movement and total value for the filtered period.
Products you no longer stock can be deactivated (Administrator only) rather than deleted. Inactive products are hidden by default but their transaction history is preserved. Click Show inactive to view them.
Sets the practice name, address, default practitioner, therapy type, currency symbol, tax rate, date format, review period and the practice-wide noticeboard. Also controls hover tips and the welcome screen.
The π Practice Noticeboard field (in the Practice tab) shows its content on the welcome dashboard for all logged-in users. Use it for day-to-day practice reminders: "Order couch rolls", "Ring Blair re Thursday", "Parking suspended 15thβ17th". It's not patient-specific β it's a shared practice whiteboard visible the moment anyone logs in.
Two checkboxes sit side by side in the Practice tab:
Users who don't have access to certain Setup tabs (e.g. Medium Level users who can't access Locations, Value Lists etc.) still see those tabs in the Setup tab bar β but they're greyed out with a π lock icon. Hovering shows which access level is required. This lets lower-access users see what the system is capable of without being able to change restricted settings.
Set a default review period (e.g. 6 Months, 12 Months) to flag patients who haven't been seen within that time. Once set, a π review flag appears in four places:
The review message (optional) appears in the patient record banner β useful for a standard reminder such as "Consider booking a maintenance appointment."
Change your own login password. Requires your current password. Minimum 8 characters.
Add and manage practice locations. Each location has a full address, phone and email. The default location table at the bottom lets you set which location each user is based at β this pre-selects the location when adding patients and sessions.
Manage appointment types (name, default duration, colour) and treatment rooms/resources. Changes here affect all practitioners. The colour assigned to an appointment type is used in the diary grid.
Label each of the five audit colours to describe what cohort they currently represent. For example: Green = "Female patients, low back, under 45", Red = "Maintenance patients due review". Labels appear as tooltips on colour dots throughout the system β on patient records, the Audit page and Statistics. Clear the label when the audit project is complete.
Available to High Level and Administrator. Locations manages practice sites. Schedule manages appointment types and treatment rooms. Colour Labels sets the meaning of each audit colour tag.
Available to High Level and Administrator. Shows all dropdown lists used across the system with an index at the top. High Level users can add new values to any list. Only Administrators can delete values β this prevents one practitioner accidentally removing entries needed by another.
Administrator only. Create and manage user accounts, access levels and enabled status. You cannot delete your own account or reduce your own access level.
CrystalSolutions requires a licence key to operate without restrictions. Keys are in the format CS-XXXX-XXXX-XXXX-XXXX and are provided when you purchase the software.
Go to Setup β Licence (Administrator only). Enter your licence key, name and email address, then click Activate. The licence is stored in the database and applies to the whole installation β all users benefit from a single activation.
An unactivated installation works fully but is limited to 10 patient records β enough to verify the system works for your practice before committing to purchase. All existing records remain fully accessible and editable β the limit only prevents adding new patients beyond 10. A banner appears at the top of every page while in trial mode.
Licences are available at soul-trade.com/software.html β Β£85 one-off, no subscription. Once you have your key, go to Setup β Licence and activate it to unlock unlimited use.
Non-Administrator users see the Licence tab in Setup as a greyed-out π locked tab. This is expected β only Administrators can manage the licence. High Level and Medium Level users can see it exists but cannot access it.
Keys encode the product (CrystalSolutions or PraxisClinic), edition (Standard or Pro) and purchase date. They are cryptographically signed and verified offline β no internet connection is required for activation or verification.
Your licence key can be activated on any number of installations you own β there is no machine binding. If you move CrystalSolutions to a new server, simply activate the same key in Setup β Licence on the new installation.
Import/Export is in the main navigation. High Level access or above required.
Five CSV export buttons β Patients, Sessions, Income, Expenditure and Contacts. Each downloads a UTF-8 CSV file that opens correctly in Excel, Numbers or any spreadsheet. Exports include all fields including clinical data from Pages 2 and 3.
Import patients from any CSV file β FileMaker export, another practice management system, or a spreadsheet. Two steps:
Rows without a surname are skipped. All other validation errors are reported after the import with a count of imported vs skipped records.
Export a single patient's complete record as a printable document. Select the patient and which sections to include (contact details, clinical, Pages 2 and 3, sessions, letters, attachments). Opens as a clean print-ready page β use Print β Save as PDF in your browser to generate a PDF.
The π€ Export button on every patient record goes directly here. Useful for subject access requests, referrals, or patient handover.
| Level | Typical user | Key permissions |
|---|---|---|
| Low Level | Receptionist / admin | View patients and sessions, add patients, add income receipts, book appointments, view letters and contacts. Cannot add sessions, write letters, add expenditure, access CPD or Setup. |
| Medium Level | Practitioner | Everything Low Level can do, plus: add and edit sessions, write letters, add expenditure, log CPD, access Setup (Practice and Password tabs only). |
| High Level | Senior practitioner | Everything Medium Level can do, plus: view and edit all practitioners' sessions and records. Setup access including Locations, Schedule, Value Lists (add only β cannot delete) and Colour Labels. Import/Export access. |
| Administrator | Practice owner / manager | Full access including user management, delete any record, delete value list entries, side-by-side diary view. |
All access levels can view the schedule and book appointments. Editing another practitioner's existing appointment requires entering that practitioner's password β this prevents accidental changes while still allowing reception to manage bookings.
The Setup Wizard (setup_wizard.php) is included in every CrystalSolutions distribution. It installs the system in your browser in five steps β no command line, no manual file editing. The same wizard works identically on Synology NAS, Windows (XAMPP), Mac (MAMP), Raspberry Pi and Linux.
config.php as-is β the wizard will overwrite it with your settingsOpen a browser and go to http://[your-server]/cspractice/setup_wizard.php. The wizard walks through five steps:
config.php. A full installation log is shown.When the wizard completes you'll see a Go to CrystalSolutions β button. Click it and log in with the admin account you just created.
setup_wizard.php from your server immediately after installation. Leaving it in place is a security risk β anyone who can reach your server URL could run it again.
On some servers (particularly NAS devices with strict folder permissions), the wizard may not be able to write config.php automatically. If you see this error, create config.php manually β drag it into the web folder via Finder or File Station. The simple installer (cs_install.php) is often easier on NAS devices as it detects an existing config.php and skips the write step automatically.
A complete config.php requires all constants including APP_ROOT, DB_CHARSET, DATE_DISPLAY, DATE_SHORT, DATE_DB, DEMO_MODE and DEV_MODE β a partial file will cause a white page. See the installation guide for the full template.
The wizard is blocked if config.php already contains real database credentials β a security measure to prevent accidental reinstallation. To re-run it, replace config.php with the original placeholder version from the distribution zip.
Many small practices already have a Synology or QNAP NAS for file storage and backups. These devices run 24/7, consume very little power, and most modern models support PHP and MariaDB β making them ideal CrystalSolutions servers. No additional hardware needed.
Open Package Center β search for Web Station β Install. Web Station provides Apache/Nginx and PHP support on your NAS.
In Web Station β Script Language Settings β click your PHP 8.2 user defined profile β Extensions tab. Enable: pdo_mysql, mysqli, gd. These are the key ones needed for CrystalSolutions to run. (pdo, mbstring and fileinfo may not appear in the list β that's fine, they are built into Synology's PHP and don't need enabling separately. We couldn't add them and installation worked correctly without them.)
Package Center β search MariaDB 10 β Install. Set a strong root password when prompted β write it down. MariaDB is fully MySQL-compatible and works with CrystalSolutions without any changes.
Package Center β search phpMyAdmin β Install. Use this to create the database and user before running the setup wizard.
Open phpMyAdmin β log in as root β click New in the left panel β name the database crystalsolutions β select utf8mb4_unicode_ci collation β Create. Then create a database user with full privileges on that database.
In File Station, navigate to the web shared folder β create a new folder called cspractice. The full path will be /volume1/web/cspractice.
Web Station β Web Service Portal β Create β choose your PHP 8 profile β set Document Root to /volume1/web/cspractice. Note the port (usually 80 or 8080).
Use File Station or an FTP client (Fetch, Cyberduck, FileZilla) to copy all CrystalSolutions files into /volume1/web/cspractice.
From any browser on your network, open http://[nas-ip-address]/cspractice/setup_wizard.php. Follow the five steps. The base URL will typically be http://192.168.x.x/cspractice β check your NAS IP address in DSM β Control Panel β Network.
Delete setup_wizard.php from File Station. Then open http://[nas-ip]/cspractice and log in with the admin account you created.
If file attachments aren't working, the attachments/ folder may need write permissions. In File Station, right-click the attachments folder β Properties β Permissions β ensure the web server user (usually http) has read/write access.
Permissions greyed out? They are being inherited from the parent folder. Fix: File Station β right-click the folder β Properties β Permission β click Advanced Options β select Make inherited permissions explicit β click Save. The checkboxes will now be editable. This applies to both the attachments/ folder and the main cspractice/ folder if the installer cannot write config.php.
Use Hyper Backup (available in Package Center) to schedule nightly backups of the MariaDB database. Back up to a USB drive, another NAS, or a Synology C2 cloud destination. Include the cspractice web folder to back up attachments.
The check_db.php script verifies your database connection, checks all tables are present and reports on PHP extensions and licence status. Upload it to your cspractice/ folder, visit it in a browser, then delete it after use.
If MySQL gives a 1451 error when dropping tables, run the following as a single block in phpMyAdmin SQL tab (select all, paste, click Go):
SET FOREIGN_KEY_CHECKS = 0; DROP TABLE IF EXISTS sessions; DROP TABLE IF EXISTS appointments; DROP TABLE IF EXISTS letters; DROP TABLE IF EXISTS attachments; DROP TABLE IF EXISTS treatment_plans; DROP TABLE IF EXISTS treatment_plan_items; DROP TABLE IF EXISTS cpd_entries; DROP TABLE IF EXISTS diary_settings; DROP TABLE IF EXISTS accounts_income; DROP TABLE IF EXISTS accounts_expenditure; DROP TABLE IF EXISTS value_lists; DROP TABLE IF EXISTS processed_txns; DROP TABLE IF EXISTS contacts; DROP TABLE IF EXISTS patients; DROP TABLE IF EXISTS practices; DROP TABLE IF EXISTS users; DROP TABLE IF EXISTS settings; SET FOREIGN_KEY_CHECKS = 1;
Or simpler: phpMyAdmin β Operations tab β Drop database, then recreate it fresh.
QNAP NAS: The process is very similar β use Web Server and phpMyAdmin from the QNAP App Center, and MySQL/MariaDB for the database. The setup wizard runs identically once files are in place.A Raspberry Pi 4 or Pi 5 is the ideal practice server for CrystalSolutions:
On any computer, download the Raspberry Pi Imager from raspberrypi.com/software. Insert your MicroSD card, open the Imager, choose Raspberry Pi OS Lite (64-bit) as the operating system, select your MicroSD card, and click Write.
Before writing, click the β settings icon to:
cspractice)Insert the MicroSD into the Pi, connect power and Ethernet, and wait 2 minutes for first boot. From any other computer on the same network, open Terminal (Mac) or Command Prompt (Windows) and type:
ssh pi@cspractice.local
Enter your password when prompted. You are now connected to the Pi.
Copy and paste these commands one at a time. Wait for each to finish before running the next:
sudo apt update && sudo apt upgrade -y sudo apt install -y apache2 php php-mysql php-mbstring mysql-server sudo systemctl enable apache2 mysql sudo systemctl start apache2 mysql
sudo mysql_secure_installation
Answer Yes to all questions and set a root password. Then:
sudo mysql -u root -p CREATE DATABASE crystalsolutions CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE USER 'csuser'@'localhost' IDENTIFIED BY 'choose-a-strong-password'; GRANT ALL PRIVILEGES ON crystalsolutions.* TO 'csuser'@'localhost'; FLUSH PRIVILEGES; EXIT;
sudo mkdir -p /var/www/html/cspractice sudo chown -R pi:pi /var/www/html/cspractice
Copy the CrystalSolutions files into /var/www/html/cspractice/
using a tool like FileZilla (SFTP, free) or the scp
command. Edit config.php with your database credentials.
sudo a2enmod rewrite sudo nano /etc/apache2/sites-available/000-default.conf
Find the <Directory /var/www/html> section and change
AllowOverride None to AllowOverride All. Save with
Ctrl+O, exit with Ctrl+X, then:
sudo systemctl restart apache2
From any browser on your network, open http://[pi-ip-address]/cspractice/setup_wizard.php and follow the five steps. The wizard creates the database tables, saves your practice settings, creates your admin user and writes config.php automatically. See the Setup Wizard section for full details.
If you prefer to run SQL migrations manually, install Adminer:
sudo wget -O /var/www/html/adminer.php https://www.adminer.org/latest.php
Visit http://[pi-ip]/adminer.php, log in and run the SQL files from the sql/ folder in order.
hostname -I
This shows your Pi's IP address (e.g. 192.168.1.50). Set it as a static IP in your router settings. CrystalSolutions is then accessible from any device on your network at:
http://192.168.1.50/cspractice
nano ~/backup-cs.sh
Paste this content:
#!/bin/bash DATE=$(date +%Y-%m-%d) BACKUP_DIR="/home/pi/backups" mkdir -p "$BACKUP_DIR" mysqldump -u csuser -p'your-password' crystalsolutions \ > "$BACKUP_DIR/crystalsolutions-$DATE.sql" find "$BACKUP_DIR" -name "*.sql" -mtime +30 -delete
chmod +x ~/backup-cs.sh crontab -e # Add this line: 0 2 * * * /home/pi/backup-cs.sh
curl -fsSL https://tailscale.com/install.sh | sh sudo tailscale up
Install Tailscale on the Pi and on each device that needs remote access. Sign in with the same account. The Pi gets a fixed Tailscale IP accessible from anywhere β perfect for home visits or a second site.
Any Mac Mini (2018 or later) makes an excellent practice server. The 2023 M2 Mini is ideal β fast, silent, uses only 6β12W, and will last many years. For a dedicated server, 8GB RAM and 256GB SSD is sufficient for a small practice.
Homebrew is the macOS package manager. Open Terminal (Applications β Utilities β Terminal) and paste:
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
Follow the prompts. On Apple Silicon Macs (M1/M2/M3) it installs to /opt/homebrew. On Intel Macs it installs to /usr/local.
brew install php mysql caddy
This installs PHP 8.3, MySQL 8, and Caddy (a modern web server that handles SSL automatically).
brew services start mysql mysql_secure_installation
Follow the prompts to set a root password. Choose Yes to all security questions.
mysql -u root -p CREATE DATABASE crystalsolutions CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE USER 'csuser'@'localhost' IDENTIFIED BY 'choose-a-strong-password'; GRANT ALL PRIVILEGES ON crystalsolutions.* TO 'csuser'@'localhost'; FLUSH PRIVILEGES; EXIT;
Create the web root folder and copy the CrystalSolutions files into it:
mkdir -p /Users/Shared/www/cspractice # Copy the CrystalSolutions files into /Users/Shared/www/cspractice/ # Edit config.php with your database credentials
Create a file called Caddyfile in your home folder:
:80 {
root * /Users/Shared/www
php_fastcgi unix//opt/homebrew/var/run/php-fpm.sock
file_server
encode gzip
}
Then start Caddy and PHP-FPM:
brew services start php brew services start caddy
Go to System Settings β Network β your WiFi connection β Details. Note the IP address (e.g. 192.168.1.50). Set it to be static in your router settings so it never changes.
CrystalSolutions is now accessible from any device on your network at:
http://192.168.1.50/cspractice
From any browser on your network, open http://[mac-ip-address]/cspractice/setup_wizard.php and follow the five steps. See the Setup Wizard section for full details. Delete the wizard file after installation.
To run SQL migrations manually instead, install Adminer:
curl -o /Users/Shared/www/adminer.php https://www.adminer.org/latest.php
Visit http://[mac-ip]/adminer.php, log in, select the crystalsolutions database, and run each SQL file from the sql/ folder in order.
The brew services command already configures PHP, MySQL and Caddy to start automatically when the Mac boots. Make sure the Mac Mini is set to restart automatically after a power failure: System Settings β Energy β Options β Start up automatically after a power failure.
To access the system from outside the practice (home visits, second site, working from home):
Create a backup script. Open Terminal and create the file:
nano ~/backup-cs.sh
Paste this content:
#!/bin/bash DATE=$(date +%Y-%m-%d) BACKUP_DIR="/Users/Shared/backups" mkdir -p "$BACKUP_DIR" /opt/homebrew/bin/mysqldump -u csuser -p'your-password' crystalsolutions \ > "$BACKUP_DIR/crystalsolutions-$DATE.sql" # Keep only last 30 days find "$BACKUP_DIR" -name "*.sql" -mtime +30 -delete
Make it executable and schedule it daily at 2am:
chmod +x ~/backup-cs.sh crontab -e # Add this line: 0 2 * * * /Users/your-username/backup-cs.sh
Time Machine will then back up these SQL dump files along with everything else. Test your backup by restoring a dump file to a test database.
If you want to try CrystalSolutions on your Mac before committing to a full installation, MAMP is much simpler β no Terminal, no Homebrew, no configuration files.
mamp.info β install and open/Applications/MAMP/htdocs/cspractice/http://localhost:8888/phpmyadmin β create database crystalsolutions with collation utf8mb4_unicode_cihttp://localhost:8888/cspractice/cs_install.php β use localhost as host, root as username, root as password (MAMP default)cs_install.php after installationhttp://localhost/cspractice/ instead.
MAMP is ideal for testing and development. For a permanent practice server, use the Homebrew/Caddy setup above β it runs as a proper background service and starts automatically on boot.
Any Windows PC or laptop with Windows 10 or 11 will work. For a dedicated practice server, a used mini-PC (Beelink, Intel NUC, or similar) is ideal β compact, quiet and power-efficient. Budget Β£100βΒ£200 for a used unit with 8GB RAM and an SSD.
XAMPP bundles Apache, PHP and MySQL into a single installer with a graphical control panel. It's the quickest way to get running.
1. Download and install XAMPP
Download from apachefriends.org β choose the PHP 8.3 version. Run the installer, accepting defaults. Install to C:\xampp.
2. Start Apache and MySQL
Open the XAMPP Control Panel (Start Menu β XAMPP Control Panel). Click Start next to Apache and MySQL. Set both to start automatically by clicking the checkbox on the left.
3. Create the database
Open a browser and go to http://localhost/phpmyadmin. Click New in the left panel, name the database crystalsolutions, set collation to utf8mb4_unicode_ci, and click Create.
Then go to User Accounts β Add user account. Create a user csuser with host localhost, set a strong password, and tick Grant all privileges on crystalsolutions.
4. Install CrystalSolutions
Copy the CrystalSolutions files into C:\xampp\htdocs\cspractice\. Leave config.php as-is β the Setup Wizard will configure it.
5. Run the Setup Wizard
Open a browser and go to http://localhost/cspractice/setup_wizard.php. Follow the five steps β the wizard creates all database tables, saves your practice settings, creates your admin user and writes config.php. See the Setup Wizard section for full details. Delete the wizard file after installation.
To run SQL migrations manually instead: in phpMyAdmin, select the crystalsolutions database β SQL tab β run each file from the sql/ folder in order.
6. Access from other devices
Find your local IP: open Command Prompt (Win+R β cmd) and type ipconfig. Note the IPv4 address (e.g. 192.168.1.60). Set it as a static IP in your router.
Windows Firewall may block access from other devices. Go to Windows Defender Firewall β Allow an app β allow Apache HTTP Server for private networks.
CrystalSolutions is then accessible at: http://192.168.1.60/cspractice
Laragon (laragon.dev) is a modern alternative to XAMPP β faster, cleaner, and easier to manage multiple PHP versions. Download the full version, install it, and follow the same steps as XAMPP above. The web root is C:\laragon\www\.
CrystalSolutions uses .htaccess for URL handling. In XAMPP, open C:\xampp\apache\conf\httpd.conf in Notepad, find the line #LoadModule rewrite_module and remove the #. Also find AllowOverride None for the htdocs directory and change it to AllowOverride All. Restart Apache.
Same as Mac β download Tailscale from tailscale.com, install on the server PC and on each device that needs remote access, sign in with the same account. The server gets a fixed Tailscale IP accessible from anywhere.
Create a batch file for daily backups. Open Notepad and save as backup-cs.bat:
@echo off SET DATE=%date:~10,4%-%date:~4,2%-%date:~7,2% SET BACKUP=C:\backups\crystalsolutions-%DATE%.sql IF NOT EXIST C:\backups mkdir C:\backups "C:\xampp\mysql\bin\mysqldump.exe" -u csuser -pyour-password crystalsolutions > %BACKUP%
Schedule it: open Task Scheduler (Start β Task Scheduler), create a Basic Task, set it to run daily at 2:00 AM, and point it to your batch file. Copy the backup folder to an external drive or cloud storage regularly.
If you want to try CrystalSolutions on your Mac before committing to a full installation, MAMP is much simpler β no Terminal, no Homebrew, no configuration files.
mamp.info β install and open/Applications/MAMP/htdocs/cspractice/http://localhost:8888/phpmyadmin β create database crystalsolutions with collation utf8mb4_unicode_cihttp://localhost:8888/cspractice/cs_install.php β use localhost as host, root as username, root as password (MAMP default)cs_install.php after installationhttp://localhost/cspractice/ instead.
MAMP is ideal for testing and development. For a permanent practice server, use the Homebrew/Caddy setup above β it runs as a proper background service and starts automatically on boot.
The primary condition dropdown covers the most common presenting complaints seen in musculoskeletal and naturopathic practice:
Head Β· Neck Β· Shoulder Β· Thoracic Ribs Β· Low Back Β· Knee Β· Stress Β· Naturopathic Β· General Β· O-A Β· Hip Β· Bowels Β· IHD Β· DVT Β· >BP Β· CD Junction Β· Skin Β· Anxious Β· Diabetes Β· Tiredness Β· Migraine Β· Baby Can't Sleep - Colic Β· Lupus Β· Peripheral Vascular Disease Β· Dizziness Β· Ankle/Feet Β· ME Β· PID Β· Reduced Sight Β· Thyroid Β· Coccyx Β· TMJ Β· Sinus Β· Elbow Β· Wrist/Hand Β· Bell's Palsy Β· Gen Cranial
Custom conditions not in this list can be noted in the yellow notes field or session treatment notes.
| Test | What it indicates |
|---|---|
| FP (Foraminal Pressure) | Cervical nerve root compression |
| SLR (Straight Leg Raise) | Lumbar nerve root irritation β record degrees L and R |
| ADAMS | Scoliosis screen β forward bend test |
| KEMPS | Lumbar facet joint involvement |
| +VE Percussion | Bony tenderness suggesting fracture or infection |
| Compression / Distraction | Disc vs facet differentiation in cervical spine |
| Tinnels Tap | Carpal tunnel / peripheral nerve entrapment |
| Valsalva | Space-occupying lesion β pain on increased intrathecal pressure |
The following should prompt consideration of urgent referral and use of the red flag field on the patient record:
Structural Β· Cranial Β· Nutritional Β· Herbal Β· Homeopathic Β· Visceral Β· Acupuncture Β· GOT Β· AK Β· Meridian Β· Mobilise
Go to Mileage in the nav. Log each practice journey with date, from/to locations, purpose, vehicle type, miles and an optional link to a patient or practice location.
The system automatically applies the current HMRC rates: 45p/mile for the first 10,000 miles per tax year, 25p/mile thereafter. Motorcycle: 24p/mile. Bicycle: 20p/mile.
Use the tax year selector to view any previous year. The total mileage claim feeds into the Self Assessment summary.
Download a CSV of all journeys in the selected tax year for your accountant.
Go to Tax in the nav (or Accounts β Tax Summary). Shows income, expenditure, mileage claim and net profit for any tax year.
The π MTD Quarterly Summary table shows Q1βQ4 with income, expenditure, net profit and the MTD submission due date for each quarter (7 Aug, 7 Nov, 7 Feb, 7 May).
Making Tax Digital for Income Tax is mandatory from April 2026 for income over Β£50,000 (Β£30,000 from April 2027). The summary shows a warning if your income exceeds the threshold.
Download a Self Assessment CSV for your accountant. Always verify figures with a qualified accountant before submitting your return.
Go to Backup in the nav. Click Download SQL backup to download a complete SQL dump of your database. Restore via phpMyAdmin β Import.
Click Download full backup for a zip containing the database, all application files and uploaded patient attachments. Use for migration or complete server restore.
Database backup weekly or after significant data entry. Full backup monthly or before any server changes or upgrades.
Store backups off this server β external drive or encrypted cloud storage. If field encryption is enabled, keep your ENCRYPTION_KEY from config.php alongside the backup. UK health records should be retained for 8 years.
Go to Setup β Security. CrystalSolutions can encrypt sensitive patient fields β email, phone, address, notes and case history β using AES-256. When enabled, a stolen database dump shows only unreadable ciphertext.
Both steps are needed. Doing only one leaves data inconsistent β either records show as ENC:... gibberish, or new saves are re-encrypted while old ones are plain text.
When encryption is enabled, address fields (address, town, county, postcode) are stored as ciphertext and cannot be searched in the Audit text search. To search by address, decrypt all records first, then re-encrypt when done. Name, condition, notes and treatment fields are not encrypted and remain searchable at all times.
Encrypted: email, phone, mobile, address, notes, case history. Not encrypted: patient name and date of birth (needed for search, display and age calculations). For most practices this is proportionate protection.
For full GDPR-compliant protection on shared hosting: enable HTTPS, set config.php permissions to 644, add Options -Indexes to your attachments/ folder, and create a restricted MySQL user (SELECT/INSERT/UPDATE/DELETE only). See Setup β Security for full details.
If you have a serial number for the MTD module, you can submit quarterly figures directly to HMRC from within CrystalSolutions.
Making Tax Digital for Income Tax is mandatory from April 2026 for practitioners with income over £50,000, and from April 2027 for income over £30,000.