Posify POS Documentation
๐Ÿ“ฆ CodeCanyon Premium Item

Posify POS

Complete Laravel-powered Point of Sale system for retail and food businesses โ€” POS terminal, inventory, suppliers, purchase orders, cash register shifts, customer loyalty, expense tracking, and reports.

โšก Laravel 12 ๐Ÿ”ท PHP 8.2+ ๐ŸŒŠ Livewire ๐Ÿ’จ Tailwind CSS v4 ๐Ÿ—„๏ธ MySQL
๐Ÿ“–

Introduction

Posify POS is a complete, single-application Point of Sale system built on Laravel 12. It covers every aspect of a retail or food business:

๐Ÿ–ฅ๏ธ

POS Terminal

Barcode scanning, split payments, thermal receipts, and cash register shifts.

๐Ÿ“ฆ

Inventory & Purchasing

Products, variants, warehouses, suppliers, and purchase orders with stock receiving.

๐Ÿ“ˆ

Reports & Admin

Sales, P&L, inventory valuation, expense, and product reports โ€” all CSV exportable.

Everything runs as one Laravel application โ€” no separate frontend server required, and the admin and POS work in a phone browser. An optional Flutter staff app is included as source in posify-app.zip if you want a native companion for the shop floor; it is not needed to run the POS. Follow this documentation to install and configure Posify POS on your server.

๐Ÿ—๏ธ

System Architecture

Posify POS is a monolithic Laravel application โ€” one codebase, one deployment. Livewire handles reactive UI components server-side, so no separate JS build server is needed in production.

Browser
โ† HTTP / WebSocket โ†’
โšก Laravel 12 + Livewire
โ† SQL โ†’
๐Ÿ—„๏ธ MySQL

What's Included

  • โœ“ Laravel 12 full source code
  • โœ“ Web installer wizard
  • โœ“ Pre-seeded demo data (optional)
  • โœ“ Documentation

Tech Stack

  • โ€ข PHP 8.2+ / Laravel 12
  • โ€ข Livewire 4 / Alpine.js
  • โ€ข Tailwind CSS v4
  • โ€ข MySQL 5.7+ / MariaDB
  • โ€ข Server-side barcode generation (picqer/php-barcode-generator)
๐Ÿ“‹

Changelog

v1.0.0 Initial Release โ€” 2026-07-15
  • โœ“ POS terminal โ€” products, inventory, orders, payments
  • โœ“ Customers, users, roles & permissions
  • โœ“ Multi-language, settings, REST API
  • โœ“ Web installer โ€” browser-based multi-step setup wizard (requirements, purchase verification, database, admin, finish)
  • โœ“ Suppliers & Purchase Orders โ€” supplier CRUD, PO with line items, stock receiving into inventory, supplier payments
  • โœ“ Cash register / shifts โ€” open & close register sessions, cash in/out movements, printable Z-Report
  • โœ“ Returns & refunds โ€” return items against an order with optional restock; payment status reflects partial/full refunds
  • โœ“ Customer accounts โ€” due/credit ledger, loyalty points (earn on sale, redeem for value), per-customer ledger view
  • โœ“ Expense management โ€” expense categories and expenses with date filtering
  • โœ“ Reports โ€” Sales, Product, Category, Profit & Loss, Inventory Valuation, and Expense reports โ€” each exportable to CSV
  • โœ“ Thermal receipts โ€” 80mm / 58mm auto-printing alongside the existing A4 PDF invoice
  • โœ“ Barcode in POS โ€” scan-to-search in the POS terminal, plus printable barcode label sheets (server-side SVG generation)
  • โœ“ Database backup & restore โ€” admin-initiated SQL dump/restore (no shell access required)
  • โœ“ Loyalty settings โ€” added to General Settings
  • โœ“ Help Desk & Customer Portal โ€” support tickets with categories, assignment, internal notes, attachments and canned replies, plus a customer portal and public help centre (optional dedicated subdomain)
  • โœ“ AI Assistant (optional) โ€” provider-agnostic AI (Anthropic Claude, OpenAI or Google Gemini) with an encrypted-at-rest API key: help-desk summarize/suggest/improve, automatic ticket category/priority/sentiment, and product SEO/content/image/inventory insights. See the AI Assistant guide
๐Ÿ–ฅ๏ธ

Server Requirements (VPS)

Minimum recommended specs for running Posify POS (Laravel + MySQL) on a VPS.

๐Ÿง 

CPU

1 vCPU minimum. 2 vCPUs recommended for production.

๐Ÿ’พ

RAM

1 GB minimum. 2 GB recommended.

๐Ÿง

OS

Ubuntu 22.04 LTS (recommended) or Debian 12.

Stack installed: Nginx ยท PHP 8.3 ยท MySQL 8 ยท Composer ยท Certbot
โš ๏ธ

Important Server Documentation

Follow these notes when the application shows a server error.

500 Internal Server Error โ€” Common Fix

The most common cause is a missing .env file or missing Laravel app key:

# 1. Generate .env from the example file
cp .env.example .env
# 2. Generate the application key
php artisan key:generate

Then update .env with your database credentials before continuing.

Storage Permissions

File uploads and cache will fail if storage folder permissions are wrong:

chmod -R 775 storage bootstrap/cache
chown -R www-data:www-data storage bootstrap/cache
๐ŸŒ

Install & Configure Nginx

1. Install Nginx

sudo apt update
sudo apt install -y nginx
sudo systemctl enable nginx
sudo systemctl start nginx

2. Virtual host โ€” /etc/nginx/sites-available/yourdomain.com

server {
    listen 80;
    server_name yourdomain.com www.yourdomain.com;
    root /var/www/posify-pos/public;
    index index.php;

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-Content-Type-Options "nosniff";

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php8.3-fpm.sock;
    }

    location ~ /\.ht { deny all; }
}

3. Enable site & reload

sudo ln -s /etc/nginx/sites-available/yourdomain.com /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
๐Ÿ—„๏ธ

Install & Configure MySQL

1. Install MySQL 8

sudo apt install -y mysql-server
sudo systemctl enable mysql
sudo mysql_secure_installation

2. Create database & user

sudo mysql -u root -p

CREATE DATABASE posify CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'posify_user'@'localhost' IDENTIFIED BY 'StrongPassword!';
GRANT ALL PRIVILEGES ON posify.* TO 'posify_user'@'localhost';
FLUSH PRIVILEGES;
EXIT;

3. Update Laravel .env

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=posify
DB_USERNAME=posify_user
DB_PASSWORD=StrongPassword!
๐Ÿ˜

Install PHP & Extensions

Posify POS requires PHP 8.2 or higher. The commands below install PHP 8.3 (recommended) with all required extensions.

sudo apt install -y software-properties-common
sudo add-apt-repository ppa:ondrej/php
sudo apt update
sudo apt install -y php8.3 php8.3-fpm php8.3-mysql php8.3-mbstring \
  php8.3-xml php8.3-bcmath php8.3-curl php8.3-zip php8.3-gd php8.3-intl

sudo systemctl enable php8.3-fpm
sudo systemctl start php8.3-fpm
Verify: php -v should show PHP 8.3.x
๐ŸŽผ

Install Composer

curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer
composer --version

Then inside your project directory:

cd /var/www/posify-pos
composer install --optimize-autoloader --no-dev
๐ŸŒ

Domain & DNS Configuration

Point your domain to the VPS IP via your registrar's DNS panel.

Type Name / Host Value TTL
A @ YOUR_VPS_IP Auto
A www YOUR_VPS_IP Auto
DNS propagation can take up to 48 hours. Check with dig yourdomain.com.
๐Ÿ”’

SSL Setup with Certbot (HTTPS)

1. Install Certbot

sudo apt install -y certbot python3-certbot-nginx

2. Obtain certificate

sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com

3. Verify & test auto-renewal

sudo nginx -t && sudo systemctl reload nginx
sudo certbot renew --dry-run
After SSL: Update APP_URL=https://yourdomain.com in your Laravel .env and clear cache: php artisan config:clear
Shared Hosting โ€” cPanel
โœ…

Shared Hosting Requirements

Confirm your cPanel environment supports the following before deploying.

Laravel / Posify POS

  • โœ“ PHP 8.2+ via MultiPHP or PHP Selector
  • โœ“ MySQL 5.7+ or MariaDB
  • โœ“ Composer (SSH Terminal)
  • โœ“ SSH Terminal access (cPanel โ†’ Terminal)
  • โœ“ Addon Domain / Subdomain creation
  • โœ“ File Manager or FTP access
  • โœ“ AutoSSL / Let's Encrypt SSL
โšก

Laravel Setup on cPanel

Deploy Posify POS on shared hosting step by step.

1

Create Domain & Point to public/

In cPanel โ†’ Domains, add your domain and set its Document Root to the project's public/ folder:

/home/yourusername/posify-pos/public
2

Upload Project Files

Upload the ZIP via cPanel โ†’ File Manager then extract:

cd ~/posify-pos
unzip posify-pos.zip -d .
rm posify-pos.zip
3

Set PHP Version to 8.2+

In cPanel โ†’ MultiPHP Manager (or PHP Selector), select your domain and set PHP to 8.2 or newer. Enable extensions: pdo_mysql mbstring xml curl zip gd bcmath fileinfo.

4

Create MySQL Database

cPanel โ†’ MySQL Databases:

  • Create database: yourusername_posify
  • Create user with a strong password
  • Add user to database with All Privileges
5

Configure .env

Rename .env.example โ†’ .env and edit:

# App
APP_NAME="Posify POS"
APP_ENV=production
APP_DEBUG=false
APP_URL=https://yourdomain.com

# Database
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=yourusername_posify
DB_USERNAME=yourusername_dbuser
DB_PASSWORD=StrongPassword!

# Mail (optional)
MAIL_MAILER=smtp
MAIL_HOST=mail.yourdomain.com
MAIL_PORT=587
MAIL_USERNAME=no-reply@yourdomain.com
MAIL_PASSWORD=your_email_password
MAIL_FROM_ADDRESS=no-reply@yourdomain.com
6

Install Composer & Run Artisan

cd ~/posify-pos

curl -sS https://getcomposer.org/installer | php
php composer.phar install --optimize-autoloader --no-dev

php artisan key:generate
php artisan migrate --force
php artisan db:seed --force
php artisan storage:link
php artisan optimize
7

Set Permissions & Enable SSL

chmod -R 755 storage bootstrap/cache

Enable SSL via cPanel โ†’ SSL/TLS โ†’ AutoSSL or Let's Encrypt.

โœ“

Test the Installation

Visit your domain โ€” you should see the login page:

https://yourdomain.com
Posify POS โ€” Laravel
โœ…

Server Requirements

Verify your hosting environment before installation.

PHP & Extensions

  • โœ“ PHP 8.2 or higher
  • โœ“ OpenSSL
  • โœ“ PDO + PDO_MySQL Extension
  • โœ“ Mbstring Extension
  • โœ“ Tokenizer Extension
  • โœ“ XML Extension
  • โœ“ Ctype Extension
  • โœ“ cURL Extension
  • โœ“ JSON Extension
  • โœ“ BCMath Extension
  • โœ“ Fileinfo Extension
  • โœ“ ZIP Extension
  • โœ“ GD Extension

Database & Server

  • โœ“ MySQL 5.7+ or MariaDB
  • โœ“ Composer 2.x
  • โœ“ Apache or Nginx
  • โœ“ SSL Certificate (HTTPS)
  • โœ“ 512MB+ RAM
๐Ÿš€

Installation Guide

Deploy Posify POS on your VPS. You can use the web installer (no SSH needed for setup) or install manually via SSH.

1

Download from Envato

Log in to CodeCanyon โ†’ Downloads โ†’ Posify POS โ†’ Download All Files & Documentation. Extract the ZIP.

2

Upload Project to Server

Option A โ€” SCP / FTP

scp posify-pos.zip user@YOUR_VPS_IP:/var/www/
ssh user@YOUR_VPS_IP
cd /var/www && unzip posify-pos.zip -d posify-pos

Option B โ€” Git

sudo mkdir -p /var/www/posify-pos
cd /var/www/posify-pos
sudo git clone https://github.com/your-repo/posify-pos.git .
3

Configure .env & Choose Install Method

Option A โ€” Web Installer

Copy .env.example โ†’ .env, then visit the installer in your browser and follow the on-screen steps โ€” no SSH needed for the rest of the setup:

https://yourdomain.com/install

Installer Steps Preview

Step 1 โ€” System Requirements
Step 1 โ€” System Requirements
Step 2 โ€” Purchase & Database
Step 2 โ€” Purchase & Database
Step 3 โ€” Admin Account
Step 3 โ€” Admin Account
Step 4 โ€” Installation Complete
Step 4 โ€” Installation Complete
Option B โ€” Manual (SSH)

Copy and edit .env via SSH, then run artisan commands:

cd /var/www/posify-pos
cp .env.example .env
nano .env   # set APP_URL, DB_* values

composer install --optimize-autoloader --no-dev
php artisan key:generate
php artisan migrate --force
php artisan db:seed --force
php artisan storage:link
php artisan optimize
4

Set Folder Permissions

chmod -R 775 storage bootstrap/cache
chown -R www-data:www-data storage bootstrap/cache
โœ“

Test the Installation

Open your browser and visit the admin panel โ€” you should see the login page.

https://yourdomain.com
โš ๏ธ

Before going live, verify:

  • APP_DEBUG=false
  • Storage symlink exists: ls -la public/storage
  • Folder permissions set on storage/ and bootstrap/cache/
  • SSL certificate active
โš™๏ธ

Configuration

Key settings available from Admin โ†’ Settings after installation.

General Settings

  • โ€ข Store name, logo, currency, timezone
  • โ€ข Tax rate and tax name
  • โ€ข Loyalty points rate (earn per sale amount) and redemption rate
  • โ€ข Receipt header / footer text
  • โ€ข Default language

Thermal Receipt Printer

Configure from Settings โ†’ Receipt Settings. Choose paper width (80mm or 58mm) and enable auto-print after POS sale.

Thermal printing uses the browser's print dialog. Connect your printer to the cashier's machine and set it as the default printer in the OS for seamless auto-print.

Mail (SMTP)

Set in your .env file:

MAIL_MAILER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=587
MAIL_USERNAME=your_username
MAIL_PASSWORD=your_password
MAIL_FROM_ADDRESS=no-reply@yourdomain.com
MAIL_FROM_NAME="Posify POS"
โฑ๏ธ

Queue Worker & Background Jobs

Posify POS ships with QUEUE_CONNECTION=sync in .env โ€” emails and notifications are sent immediately during the request, so everything works out of the box with no worker process and no extra setup.

When to change this: if sending mail makes checkout or other pages feel slow, switch to background sending. This is optional โ€” most shops can stay on sync.

1. Enable background sending

Set the queue driver to database in your .env, then clear the config cache:

QUEUE_CONNECTION=database
php artisan config:clear

Queued jobs are now stored in the database โ€” but they only run while a queue worker is running. Pick one of the options below.

2a. Recommended (VPS): Supervisor

Supervisor keeps the worker alive permanently and restarts it if it crashes:

sudo apt install -y supervisor
sudo nano /etc/supervisor/conf.d/posify-worker.conf
[program:posify-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/posify-pos/artisan queue:work database --sleep=3 --tries=3 --max-time=3600
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
user=www-data
numprocs=1
redirect_stderr=true
stdout_logfile=/var/www/posify-pos/storage/logs/worker.log
stopwaitsecs=3600
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start posify-worker:*

2b. Fallback (shared hosting): Cron

No Supervisor on shared hosting? Add a cron job (cPanel โ†’ Cron Jobs) that drains the queue every minute and exits when it's empty:

* * * * * php /home/yourusername/posify-pos/artisan queue:work --stop-when-empty

Adjust the path to your installation. Emails may be delayed by up to a minute โ€” acceptable for most stores.

Remember: after deploying code changes, restart the worker (sudo supervisorctl restart posify-worker:* or php artisan queue:restart) so it picks up the new code.
โœจ

Features

All modules available in Posify POS v1.0.0.

Dashboard
๐Ÿ“Š Overview

Dashboard

Real-time overview of store performance โ€” today's revenue, orders, top products, and low-stock alerts.

  • โœ“ Daily, weekly, and monthly revenue charts
  • โœ“ Total orders and top-selling products
  • โœ“ Low-stock product alerts
  • โœ“ Recent order activity feed
POS Terminal
๐Ÿ–ฅ๏ธ POS

POS Terminal

Fast checkout screen with barcode scan-to-add, split payments, discounts, and instant thermal receipt printing.

  • โœ“ Barcode scan-to-search (USB/Bluetooth scanner)
  • โœ“ Cash, card, and split payment support
  • โœ“ 80mm / 58mm thermal receipt + A4 PDF
  • โœ“ Redeem customer loyalty points at checkout
  • โœ“ Orders sync with inventory automatically
Products & Inventory
๐Ÿ“ฆ Inventory

Products & Inventory

Full product catalog with categories, brands, units, variants, and warehouse-level stock tracking.

  • โœ“ Products with variants, addons, and images
  • โœ“ Categories, brands, and units of measure
  • โœ“ Per-warehouse stock levels and movements
  • โœ“ Stock transfers between warehouses
  • โœ“ Printable barcode label sheets (server-side SVG)
Suppliers & Purchase Orders
๐Ÿšš Purchasing

Suppliers & Purchase Orders

Manage supplier relationships and purchase orders from order creation through stock receiving.

  • โœ“ Supplier CRUD with contact details
  • โœ“ Purchase orders with line items and costs
  • โœ“ Receive stock into inventory from POs
  • โœ“ Track supplier payments and balances
Cash Register & Returns
๐Ÿง Register

Cash Register & Returns

Full shift management with Z-Reports and a complete returns/refund flow with restock option.

  • โœ“ Open/close register sessions with opening cash
  • โœ“ Cash in/out movements during shift
  • โœ“ Printable Z-Report on close
  • โœ“ Return items against an order (with optional restock)
  • โœ“ Payment status auto-updates to partial/full refund
Roles & Permissions
๐Ÿ” Access

Roles & Permissions

Fine-grained role-based access control โ€” define exactly what each staff member can see and do.

  • โœ“ Unlimited custom roles (cashier, manager, admin)
  • โœ“ Toggle individual permissions per role
  • โœ“ Assign multiple roles to one user
  • โœ“ Activity log of all admin actions
Settings
โš™๏ธ Config

Settings & Utilities

Store settings, multi-language management, database backup/restore, and more โ€” all from the admin panel.

  • โœ“ Store info, currency, tax, and receipt settings
  • โœ“ Loyalty points earn/redeem rates
  • โœ“ Multi-language with admin-editable translations
  • โœ“ Database backup & restore (no shell needed)
๐Ÿค–

AI Assistant

Posify ships with an optional AI Assistant that adds a set of "magic" helpers across the help desk and the product catalog. It is provider-agnostic โ€” you bring your own API key for Anthropic Claude, OpenAI, or Google Gemini โ€” and it is configured entirely from the admin panel. No .env editing is required.

AI is strictly optional and additive. When it is turned off โ€” or no API key is set โ€” every AI control simply disappears and Posify works exactly as before. AI never blocks a sale, a ticket, or any other workflow.
๐ŸŽง

Help-desk assist

Summarize a ticket, draft a reply, or polish a draft you already wrote.

๐Ÿท๏ธ

Auto-triage

Category, priority and customer sentiment applied to tickets automatically.

๐Ÿ“ฆ

Product Insights

Score a product for SEO, content, images and inventory with fixes to apply.

๐Ÿ”‘

Setting Up the AI Assistant

Setup takes a couple of minutes. You will need an API key from one AI provider. AI is billed by that provider on a pay-as-you-go basis (bring-your-own-key) โ€” Posify does not resell or mark up usage.

AI Assistant settings page โ€” Admin โ†’ Settings โ†’ AI Assistant
Admin โ†’ Settings โ†’ AI Assistant โ€” choose a provider, add your encrypted API key, and toggle automatic features. Click to enlarge.

1 ยท Get an API key

Create a key with whichever provider you prefer:

Provider Where to get a key Default model
Anthropic Claude console.anthropic.com โ†’ API Keys claude-opus-4-8
OpenAI platform.openai.com โ†’ API keys gpt-4o-mini
Google Gemini aistudio.google.com โ†’ Get API key gemini-1.5-flash

2 ยท Enter it in Posify

  1. Go to Admin โ†’ Settings โ†’ AI Assistant.
  2. Turn on Enable AI features.
  3. Pick your Provider (Claude, OpenAI or Gemini).
  4. Model โ€” leave blank to use the provider default above, or type a specific model name (e.g. gpt-4o).
  5. Paste your API key and click Save settings.
๐Ÿ” Your API key is encrypted at rest in the database. The field shows a masked placeholder once a key is saved โ€” leave it blank on later edits to keep the existing key, or paste a new one to replace it. Saving other settings never wipes a stored key.

3 ยท (Optional) Turn on automatic triage

On the same settings page, the Automatic features card lets you enable hands-off help-desk triage. These run quietly in the background whenever a ticket is created or a customer replies:

  • โ€ข Auto-categorize โ€” files new tickets into the best-fitting category.
  • โ€ข Auto-priority โ€” sets new tickets to low / normal / high / urgent.
  • โ€ข Auto-sentiment โ€” reads the customer's tone (positive / neutral / negative / frustrated) and refreshes it on every new customer message.
Server requirement: the app server must be able to make outbound HTTPS requests to the provider's API (api.anthropic.com, api.openai.com or generativelanguage.googleapis.com). If your firewall blocks outbound traffic, whitelist the relevant host.
โœจ

What the AI Assistant Can Do

Once configured, three groups of AI features light up across the admin.

AI help-desk reply assist on a support ticket
AI help-desk assist on a ticket โ€” summarize the thread, draft the next reply, or polish your own draft. Click to enlarge.

๐ŸŽง Help-desk reply assist

On any support ticket, agents with the support-tickets_reply permission see three buttons:

  • โœ“ Summarize โ€” a 3โ€“5 bullet recap of the whole conversation, so an agent can catch up instantly.
  • โœ“ Suggest reply โ€” drafts the next reply to the customer; the agent reviews and edits before sending.
  • โœ“ Improve with AI โ€” takes a reply you've already typed and polishes grammar and tone while keeping every fact, name and number intact.

Nothing is ever sent automatically โ€” a human always reviews and clicks send. Staff-only internal notes are excluded from what the model sees.

๐Ÿท๏ธ Automatic ticket triage

When enabled in settings, these run in the background โ€” the agent never waits on the AI provider:

  • โœ“ Category chosen from your existing ticket categories (new tickets only, and only if not already set).
  • โœ“ Priority assigned as low / normal / high / urgent (new tickets).
  • โœ“ Sentiment badge on the ticket, refreshed each time the customer replies.

๐Ÿ“ฆ Product Insights

On a product's detail page, staff with products_edit can click Analyze to get a catalog-quality report:

  • โœ“ An overall score (0โ€“100) plus four scored dimensions: SEO, Content, Images, and Inventory & Pricing.
  • โœ“ Short, concrete, actionable feedback per dimension (e.g. "Add at least two more product photos").
  • โœ“ The report is cached on the product, so it stays visible until you re-analyze.
๐Ÿ”’

How It Works & Privacy

  • โ€ข What is sent. Only what's needed for the task โ€” a ticket transcript (subject + public replies) for help-desk features, or a product's fields (name, description, category, pricing, stock signals, image count) for Product Insights. The request goes over HTTPS to the provider you selected.
  • โ€ข What is never sent. Staff-only internal notes are stripped from ticket transcripts. Nothing at all leaves your server when AI is switched off or unconfigured.
  • โ€ข Your key stays yours. The API key is encrypted at rest and used only to authenticate your own requests to your chosen provider.
  • โ€ข Fails safe. Every AI request has a 45-second timeout, and any provider error is logged and swallowed โ€” the feature simply returns nothing rather than breaking the page. Automatic triage is best-effort and never blocks ticket creation or replies.
  • โ€ข Data handling beyond your server is governed by your chosen provider's terms โ€” review Anthropic's, OpenAI's or Google's data-usage policy before enabling AI on sensitive data.
Cost control. You pay the AI provider directly for usage. The on-demand features (summarize, suggest, improve, analyze) only cost when a user clicks the button. The automatic triage features make small background calls per ticket โ€” leave them off if you'd rather keep usage fully manual.
๐ŸŽง

Help Desk & Customer Portal

Posify includes a built-in support desk for your team plus a customer-facing portal and a public help centre. This is the module the AI Assistant's help-desk features plug into, but it works perfectly well on its own without AI.

๐Ÿ—‚๏ธ Agent inbox

  • โœ“ Tickets with categories, priority & status
  • โœ“ Assign tickets to team members
  • โœ“ Threaded replies, attachments & internal notes
  • โœ“ Shared & personal canned replies

๐ŸŒ Customer portal & help centre

  • โœ“ Customers raise & track their own tickets
  • โœ“ Public help centre anyone can browse
  • โœ“ Served at /portal & /help by default
  • โœ“ Optional dedicated subdomain

Optional: serve the portal from its own subdomain. By default the portal and help centre live under /portal and /help on your main domain. To serve them from a subdomain instead (e.g. support.example.com), set in .env:

PORTAL_DOMAIN=support.example.com
# For one shared login across the main app and the subdomain,
# also set SESSION_DOMAIN to the shared parent:
SESSION_DOMAIN=.example.com

Point that host at the same app in your web server, then run php artisan optimize:clear. Route names are identical either way, so links adapt automatically.

๐Ÿ”Œ

REST API

Posify ships a token-authenticated REST API under /api/v1, built on Laravel Sanctum. It is what the staff mobile app talks to, and it is available for your own integrations. No extra setup is needed โ€” it is enabled on every install.

Getting a token

curl -X POST https://yourdomain.com/api/v1/login \
  -H "Accept: application/json" \
  -d "email=you@example.com&password=your-password"

# -> { "token": "1|abcdef...", "user": { ... } }

Send it on every subsequent request:

curl https://yourdomain.com/api/v1/products \
  -H "Accept: application/json" \
  -H "Authorization: Bearer 1|abcdef..."

Endpoint groups

Group Auth What it covers
basic-info, categories, products, languagesNonePublic catalog and store settings
login, register, forgot-passwordNoneIssue a token (throttled 10/min)
profile, ordersBearerThe signed-in customer's own data only
staff/*Bearer + permissionStore-wide: inventory, customers, tickets. Each endpoint checks the caller's role permissions
Rate limits: 60 requests/minute on public and authenticated endpoints; 10/minute on login and register. List endpoints accept per_page (max 100).
Tokens do not expire. Treat them like passwords. A user's tokens are revoked when they log out via POST /api/v1/logout; you can also clear them from the database if a device is lost.

The full endpoint table, with every route and its description, is in README.md in the application root.

๐Ÿ“ฑ

Staff Mobile App

Your download includes posify-app.zip โ€” the full Flutter source for an optional staff companion app (Android and iOS). It gives staff product and price lookup, camera barcode scanning, customer and order lookup, inventory and low-stock views, and the support desk on the shop floor.

The app is entirely optional. Posify's admin and POS already work in a phone browser โ€” the app is there if you want a native experience with a faster camera scanner.

โœ… Requirements

๐Ÿ’ป Development machine
  • Flutter 3.29.x or later
  • Dart SDK >=3.11.0 <4.0.0
  • Android Studio or VS Code
  • Git
๐Ÿ“ฑ Platform SDKs
  • Android SDK (API 21+)
  • Xcode 15+ (macOS only, for iOS)
  • CocoaPods (iOS dependencies)
  • Your Posify server reachable over HTTPS

Verify your setup with flutter doctor โ€” every item should show a green checkmark before you start. Publishing also needs a Google Play and/or Apple Developer account.

๐Ÿš€ Installation

Extract posify-app.zip, open the folder, and install dependencies:

cd posify-app
flutter pub get

Set your base URL (next section), then run it on a connected device or emulator:

flutter run
flutter run -d android    # pick a target explicitly
flutter run -d ios

๐Ÿ”— Base URL setup

The app ships pointing at a placeholder and fails fast with a config error until you set your own domain. Open lib/utils/constants.dart and edit the ApiEndpoints class:

// lib/utils/constants.dart
class ApiEndpoints {
  static const String baseUrl = String.fromEnvironment(
    'API_BASE_URL',
    defaultValue: 'https://pos.your-domain.com/api/v1',  // replace this
  );

Or leave the file alone and pass it per build โ€” this wins over the default:

flutter run --dart-define=API_BASE_URL=https://pos.your-domain.com/api/v1
flutter build apk --release --dart-define=API_BASE_URL=https://pos.your-domain.com/api/v1
โš ๏ธ Include the /api/v1 prefix and use no trailing slash. Point it at the domain serving your Posify install.

To test against a backend on your own machine:

  • Android emulator โ†’ http://10.0.2.2:8000/api/v1
  • iOS simulator โ†’ http://127.0.0.1:8000/api/v1

Plain HTTP is allowed only for those two hosts; every other host must be HTTPS. A Herd/Valet .test domain will not work on the iOS simulator โ€” its self-signed certificate is untrusted.

โœ๏ธ Change the app name

// android/app/src/main/AndroidManifest.xml
android:label="YourAppName"

// ios/Runner/Info.plist
<key>CFBundleName</key>
<string>YourAppName</string>

๐Ÿ“ฆ Change the package name

The app ships as com.axify.posify. Change it to your own before publishing โ€” the store rejects a package ID you do not own. Android uses the Kotlin Gradle DSL:

// android/app/build.gradle.kts
android {
    namespace = "com.yourcompany.yourapp"
    defaultConfig {
        applicationId = "com.yourcompany.yourapp"
    }
}

Then find-and-replace com.axify.posify across the project (Ctrl+Shift+R, or โŒ˜+Shift+R on macOS) and check these landed:

  • android/app/build.gradle.kts
  • android/app/src/main/AndroidManifest.xml
  • android/app/src/main/kotlin/ โ€” the folder structure must mirror the new ID
  • iOS bundle identifier โ€” set in Xcode, see below
flutter clean && flutter pub get && flutter run

๐ŸŽจ Change the app icon

Replace assets/icons/posify-app-icon.png with your own square PNG โ€” 1024ร—1024, no transparency (iOS rejects an alpha channel). Then regenerate every size for both platforms:

dart run flutter_launcher_icons

No external icon generator needed โ€” flutter_launcher_icons is already set up under the flutter_launcher_icons: key in pubspec.yaml. Re-run it whenever you change the source image.

๐Ÿค– Build for Android

Step 1 โ€” Create a signing keystore. Back up the .jks file and its passwords somewhere safe and private: lose them and you cannot ship an update to an existing listing.

keytool -genkey -v -keystore ~/upload-keystore.jks \
  -storetype JKS -keyalg RSA -keysize 2048 -validity 10000 -alias upload

Step 2 โ€” Create android/key.properties by copying android/key.properties.example and filling it in:

storePassword=your_store_password
keyPassword=your_key_password
keyAlias=upload
storeFile=/absolute/path/to/upload-keystore.jks
โš ๏ธ A release build fails with a Gradle error if android/key.properties is missing. That is deliberate โ€” it stops a debug-signed build from ever reaching the Play Store, which Google would reject. Debug builds and flutter run are unaffected.

Step 3 โ€” Build. Use an AAB for the Play Store; an APK for direct install or sideloading:

# AAB โ€” Google Play Store
flutter build appbundle --release
# Output: build/app/outputs/bundle/release/app-release.aab

# APK โ€” direct install
flutter build apk --release
# Output: build/app/outputs/flutter-apk/app-release.apk

# Split APKs โ€” smaller download per device
flutter build apk --release --split-per-abi

๐ŸŽ Build for iOS

โš ๏ธ Requires a Mac with Xcode and an active Apple Developer account ($99/year).

Step 1 โ€” Install CocoaPods dependencies:

cd ios && pod install && cd ..

Step 2 โ€” Open the workspace (not the .xcodeproj):

open ios/Runner.xcworkspace

Step 3 โ€” Configure signing. Select the Runner target โ†’ Signing & Capabilities โ†’ set your Team, and change the Bundle Identifier to your own (e.g. com.yourcompany.posify).

Step 4 โ€” Archive and distribute:

flutter build ipa

Or from Xcode: set the scheme to Any iOS Device โ†’ Product โ†’ Archive โ†’ in Organizer, Distribute App โ†’ App Store Connect.

Staff sign in with their normal Posify accounts. Customer accounts are rejected โ€” the app is staff-only, and every screen is gated by the same role permissions as the web admin.

The same instructions, plus an API endpoint reference and security notes, are in README.md inside posify-app.zip.

โฌ†๏ธ

Updating to a New Version

Back up first, every time. Export your database (Admin โ†’ Backups, or mysqldump) and copy your .env file and storage/app folder somewhere safe before you overwrite anything.
  1. Download the new release ZIP from your CodeCanyon downloads page.
  2. Put the site into maintenance mode: php artisan down
  3. Replace the application files, but keep these: your .env, storage/ (uploads and logs), and public/storage if it is a real symlink.
  4. Reinstall dependencies: composer install --no-dev --optimize-autoloader
  5. Apply any new migrations: php artisan migrate --force
  6. Clear stale caches: php artisan optimize:clear
  7. Repair the uploads symlink if images 404: php artisan posify:install-assets
  8. Bring it back up: php artisan up
Do not delete storage/installed.lock. It is what tells Posify it is already set up. Removing it sends every visitor back to the installer.
If you customised any files, diff them against the new release before overwriting. Keeping your changes in a separate file or a git branch makes this far less painful next time.

If you run a queue worker, restart it after updating so it picks up the new code: php artisan queue:restart. See the Queue Worker section.

๐Ÿ“„

Third-Party Licenses

Posify POS bundles open-source libraries. Most use permissive MIT/BSD/Apache licenses; two are LGPL and worth knowing about:

dompdf (PDF invoice generation) is licensed under LGPL-2.1, and picqer/php-barcode-generator (barcode label sheets) under LGPL-3.0-or-later. Both are included unmodified as Composer dependencies; their license texts ship under vendor/ after composer install. Using them as-is places no obligation on your own code โ€” only modifying the libraries themselves would.

The full list of bundled third-party libraries and their licenses is in credits.txt in the application root.

Thank you for choosing Posify POS. For support, visit your CodeCanyon purchase page.