So sánh phần mềm lập hóa đơn self-hosted trên VPS
So sánh Invoice Ninja, InvoiceShelf, InvoicePlane, Kimai và ERPNext trên một VPS về hóa đơn định kỳ, thuế, cổng khách hàng, payment gateway và licence.
Nên chọn phần mềm lập hóa đơn self-hosted nào?
Phần mềm lập hóa đơn self-hosted trên một VPS thực tế chỉ có 5 lựa chọn, và chúng không thể thay thế tương đương cho nhau. Invoice Ninja là sản phẩm hoàn thiện nhất: hóa đơn định kỳ, cổng khách hàng, payment gateway và các định dạng hóa đơn điện tử đều hoạt động ngay sau khi cài đặt. InvoiceShelf là lựa chọn nhẹ hơn và hoàn toàn open source. InvoicePlane là một ứng dụng PHP đơn giản, không cần điều phối nhiều thành phần. Kimai lập hóa đơn dựa trên số giờ đã ghi nhận thay vì các dòng mục hàng. ERPNext là một hệ thống kế toán đầy đủ, đồng thời có thể in hóa đơn.
Hai vấn đề thường làm hỏng một hệ thống lập hóa đơn self-hosted hơn nhiều so với việc thiếu một tính năng. Vấn đề đầu tiên là email. Một hóa đơn nằm trong thư mục spam cũng là một hóa đơn chưa được thanh toán, nhưng không có cơ chế nào báo cho bạn biết điều đó. Vấn đề thứ hai là backup. Đây là cơ sở dữ liệu self-hosted duy nhất mà việc mất dữ liệu có thể trở thành vấn đề về thuế thay vì chỉ là một bất tiện.
Hãy đọc licence trước khi xem danh sách tính năng. Trong 5 lựa chọn này, 3 lựa chọn dùng copyleft, 1 lựa chọn dùng licence permissive, và 1 lựa chọn cung cấp source code nhưng áp đặt các giới hạn thực tế đối với những gì bạn được phép làm với phần mềm.
Năm lựa chọn và đối tượng phù hợp với từng lựa chọn
Invoice Ninja
Một ứng dụng Laravel, hiện thuộc dòng v5. Tự host được miễn phí và không bị khóa tính năng: hỗ trợ hóa đơn định kỳ, báo giá, dự án, theo dõi thời gian, chi phí, cổng khách hàng và các payment gateway như Stripe và PayPal. Dự án tự mô tả là “ứng dụng lập hóa đơn, báo giá, quản lý dự án và theo dõi thời gian được xây dựng bằng Laravel, với mã nguồn khả dụng”. Tính năng trả phí duy nhất là loại bỏ branding. Theo thông tin của chính dự án: “Chúng tôi cung cấp license white-label với giá $40 mỗi năm để xóa branding Invoice Ninja khỏi các phần của ứng dụng hiển thị cho khách hàng”. Mức giá này được cập nhật vào August 2026.
Chọn ứng dụng này nếu bạn muốn sản phẩm đầy đủ tính năng nhất và chấp nhận vận hành stack lớn nhất.
InvoiceShelf
Một fork của Crater, phát hành theo GNU Affero General Public License version 3 (AGPL-3.0). Ứng dụng hỗ trợ hóa đơn, báo giá, billing định kỳ, chi phí, thuế, nhiều loại tiền tệ, cổng khách hàng và nhiều công ty. Tính năng thanh toán và white-label được cung cấp trong các repository module chính thức riêng biệt. Cả hai đều dùng AGPL-3.0 và đều miễn phí. Thanh toán bằng thẻ thông qua Stripe checkout.
Chọn ứng dụng này nếu bạn muốn một ứng dụng nhỏ, hoàn toàn open source và không cần đến ba mươi gateway.
InvoicePlane
Một ứng dụng PHP chạy trên CodeIgniter, phát hành theo MIT licence và là lựa chọn duy nhất ở đây có thể cài bằng cách giải nén file vào web root. Không cần Docker và không có bước build Node. PDF được tạo bằng mPDF, nên template sử dụng HTML và CSS. Khách hàng nhận được một guest link để xem và thanh toán hóa đơn.
Điểm hạn chế là thanh toán. Tài liệu nêu rõ InvoicePlane 1.6 mặc định chỉ hỗ trợ Stripe và các provider khác đã bị gỡ trong phiên bản đó. Yêu cầu được công bố cho dòng 1.6 là PHP 8.0 đến 8.1 cùng với MySQL 5.5 hoặc phiên bản MariaDB tương ứng. Hãy đọc ghi chú của release bạn tải xuống, vì dòng 1.7 vẫn đang được phát triển.
Chọn ứng dụng này nếu bạn dùng shared hosting hoặc một VPS 512 MB.
Kimai
Một ứng dụng theo dõi thời gian dùng AGPL-3.0, có thể tạo hóa đơn từ timesheet. Đây là lựa chọn phù hợp nếu bạn tính phí theo số giờ. Template hóa đơn được upload dưới dạng file DOCX, ODS hoặc XLSX. Tài liệu xác nhận đây là các định dạng duy nhất được chấp nhận, sau đó template được render thành PDF hoặc HTML. Bạn thiết kế hóa đơn trong word processor thay vì viết CSS, cách này thường dễ hơn.
Kimai không có cổng khách hàng và payment gateway, nên bạn phải gửi PDF qua email. Tính năng e-invoicing có cấu trúc là một paid store plugin tên E-Invoice Plus. Tính đến August 2026, plugin này có giá 99 EUR mỗi năm, chưa bao gồm VAT, cho bản cài self-hosted và hỗ trợ các profile EN16931, XRechnung, ZUGFeRD, Factur-X và Peppol.
Chọn ứng dụng này nếu hóa đơn là kết quả của việc theo dõi thời gian.
ERPNext
GPL-3.0 và thuộc một nhóm phần mềm khác. Hóa đơn bán hàng chỉ là một loại chứng từ trong một hệ thống accounting đầy đủ, có chart of accounts, bút toán nhật ký, quản lý hàng tồn kho và payroll. Đây là lựa chọn phù hợp khi công việc không còn chỉ là lập hóa đơn. Với một freelancer có tám khách hàng, hệ thống này có quá nhiều tính năng không cần thiết. Việc triển khai ERPNext là một dự án riêng, được hướng dẫn trong chạy ERPNext trên VPS.
Hóa đơn định kỳ phụ thuộc vào scheduler mà bạn không nhìn thấy
Invoice Ninja, InvoiceShelf, InvoicePlane và ERPNext đều có thể tạo hóa đơn định kỳ. Kimai không có tính năng hóa đơn định kỳ trong core, vì hóa đơn trong đó được tạo từ các mục chấm công trong một khoảng thời gian.
Cách lỗi xảy ra giống nhau ở mọi ứng dụng dựa trên Laravel, và thường không có dấu hiệu rõ ràng. Một scheduled task, php artisan schedule:run, tạo hóa đơn định kỳ. Một thành phần bên ngoài ứng dụng phải gọi task này mỗi phút. Nếu không có thành phần nào gọi, danh sách hóa đơn định kỳ vẫn hiển thị ngày gửi tiếp theo, và ngày đó cứ trôi qua. Không có hóa đơn nào xuất hiện. Cũng không có lỗi nào được ghi vào log, vì không có code nào chạy.
Sau khi tạo hóa đơn định kỳ đầu tiên, hãy đặt ngày gửi tiếp theo cách hiện tại vài phút rồi chờ. Nếu không có hóa đơn nào đến, scheduler chưa chạy. Trong Docker, nguyên nhân thường là service cron hoặc scheduler trong file compose chưa khởi động hoặc đã thoát.
docker compose ps
docker compose logs --tail 50Mọi service trong file phải báo trạng thái running. Service đang ở trạng thái exited là service bạn cần đọc log.
Đa tiền tệ và thuế: cần kiểm tra gì trước khi quyết định
Danh sách tính năng ghi “đa tiền tệ” nhưng ý nghĩa thực tế có thể rất khác nhau. Hãy thực hiện 4 kiểm tra này trên một instance demo, dùng số liệu thực từ doanh nghiệp của bạn. Nếu có sai sót, kế toán của bạn sẽ phát hiện ra trước bạn.
- Hóa đơn có lưu tỷ giá áp dụng vào ngày phát hành không? Bắt buộc phải có. Nếu ứng dụng tính lại tổng tiền theo tỷ giá hiện tại, báo cáo của quý trước sẽ thay đổi mỗi lần bạn mở, và sổ sách sẽ không còn khớp với hồ sơ bạn đã nộp.
- Thuế được áp dụng theo từng dòng hàng, theo toàn bộ hóa đơn, hay cả hai? Một mức thuế áp dụng cho toàn bộ hóa đơn chỉ phù hợp cho đến khi có một dòng hàng được áp dụng thuế suất 0%.
- Bạn có thể nhập giá đã gồm thuế và giá chưa gồm thuế không? Việc chuyển đổi sau đó có thể tạo chênh lệch làm tròn một cent trên mỗi dòng, và các khoản chênh lệch này sẽ cộng dồn trong cả năm.
- Chứng từ hiển thị gì khi khách hàng ở quốc gia khác không phải trả VAT? Bạn cần in ghi chú miễn thuế trên hóa đơn, không chỉ hiển thị số 0 trong cột thuế.
Invoice Ninja và ERPNext xử lý được cả 4 trường hợp. InvoiceShelf liệt kê thuế và đa tiền tệ trong các tính năng của mình. InvoicePlane và Kimai đơn giản hơn, vì vậy hãy kiểm thử chúng bằng hóa đơn phức tạp nhất của bạn thay vì hóa đơn dễ xử lý nhất.
Cổng khách hàng và payment gateway
Cổng khách hàng là trang nơi khách hàng xem hóa đơn, tải PDF và thanh toán. Phần này quan trọng hơn bạn nghĩ, vì việc gửi email nhắc thanh toán tốn nhiều thời gian hơn cả việc lập hóa đơn.
Invoice Ninja mạnh nhất ở phần này, với portal đầy đủ, nhiều gateway, phương thức thanh toán được lưu và tự động lập hóa đơn cho các hóa đơn định kỳ. InvoiceShelf có customer portal và bổ sung Stripe checkout thông qua module payments. InvoicePlane tạo guest link cho từng hóa đơn và hỗ trợ Stripe. Kimai không có cả hai tính năng này, nên PDF phải được gửi dưới dạng file đính kèm.
Có một điểm thường xuyên bị hiểu nhầm. Tự host ứng dụng lập hóa đơn không có nghĩa là bạn lưu số thẻ. Với Stripe checkout, khách hàng được chuyển hướng đến Stripe, nhập thông tin thẻ tại đó, còn VPS của bạn không bao giờ thấy số thẻ. Phạm vi PCI (payment card industry) của bạn vẫn nhỏ chính vì bạn không tự xây dựng form thanh toán. Nếu sau này bạn cần nhiều hơn một payment processor hoặc muốn định tuyến thanh toán theo quốc gia, hãy đặt phần đó ở một layer riêng, chẳng hạn như điều phối thanh toán self-hosted với Hyperswitch.
Chất lượng PDF và template bạn sẽ chỉnh sửa
Bạn sẽ chỉnh sửa template. Mọi giá trị mặc định ở đây đều đặt địa chỉ của bạn sai vị trí tại quốc gia của bạn.
Invoice Ninja render template HTML và CSS thành PDF bằng headless Chromium được tích hợp trong image, nên container có kích thước lớn. Hãy dự trù bộ nhớ cho thành phần này: headless browser là tiến trình sử dụng nhiều tài nguyên nhất trong stack, vì vậy VPS 1 GB sẽ khá chật. InvoicePlane dùng mPDF, một thư viện thuần PHP và nhẹ, nhưng phải đánh đổi bằng việc bỏ qua một số CSS hiện đại. Kimai đi theo hướng ngược lại và yêu cầu bạn upload file DOCX hoặc ODS, nên layout được thực hiện trong LibreOffice hoặc Word bởi người chưa từng viết stylesheet.
Nếu invoice được thiết kế đẹp là điều quan trọng với bạn còn CSS thì không, cách làm của Kimai phù hợp hơn. Nếu bạn muốn lưu template trong version control và có thể diff, HTML phù hợp hơn.
Giấy phép có cho phép sử dụng thương mại không?
Cả năm phần mềm đều cho phép bạn xuất hóa đơn cho khách hàng của mình. Khác biệt xuất hiện khi bạn làm thêm những việc khác.
Invoice Ninja sử dụng Elastic License 2.0. Có 2 điều khoản đáng chú ý.
Bạn không được cung cấp phần mềm cho bên thứ ba dưới dạng dịch vụ được host hoặc quản lý, nếu dịch vụ đó cho phép người dùng truy cập một tập hợp đáng kể các tính năng hoặc chức năng của phần mềm.
Bạn không được di chuyển, thay đổi, vô hiệu hóa hoặc né tránh chức năng license key trong phần mềm.
Vì vậy, chạy phần mềm cho doanh nghiệp của bạn là được phép, còn chạy các instance cho khách hàng như một sản phẩm thì không. Điều khoản thứ hai là lý do việc gỡ branding có giá $40 license, thay vì chỉ cần sửa source.
InvoiceShelf, Kimai và Crater sử dụng AGPL-3.0. Bạn được phép sử dụng thương mại miễn phí và không có tier cao hơn áp dụng cho bạn. Nghĩa vụ nằm ở điều 13: nếu bạn sửa code rồi cho người khác sử dụng phiên bản đã sửa qua network, bạn phải cung cấp source của các thay đổi đó cho họ. Một instance không sửa đổi đã được source công khai của upstream bao phủ, nên hầu hết self-hoster không bao giờ phải xử lý việc này.
InvoicePlane sử dụng MIT, là license có ít nghĩa vụ nhất trong nhóm này, mặc dù README nêu rõ tên và logo vẫn thuộc về project.
ERPNext sử dụng GPL-3.0. Các bản sửa đổi mà bạn phân phối phải được chia sẻ, còn việc chạy riêng tư không tạo ra nghĩa vụ nào.
Đây là phần mô tả nội dung license, không phải tư vấn pháp lý.
Dự án còn được duy trì không? Hãy kiểm tra commit log
Crater từng là ứng dụng lập hóa đơn open source phổ biến trong nhiều năm, và nhiều hướng dẫn vẫn khuyến nghị dùng nó. Nhánh mặc định của dự án đã không có commit nào trong 741 ngày.
The data behind this chart
[
{
"label": "ERPNext",
"commit_gap": 0
},
{
"label": "Invoice Ninja",
"commit_gap": 1
},
{
"label": "Kimai",
"commit_gap": 1
},
{
"label": "InvoicePlane",
"commit_gap": 3
},
{
"label": "InvoiceShelf",
"commit_gap": 4
},
{
"label": "Crater",
"commit_gap": 741
}
]Trong số 6 dự án ở khối đó, có 5 dự án đã có commit trong tuần qua. InvoiceShelf là fork tiếp tục phát triển từ Crater, sử dụng cùng giấy phép AGPL-3.0 và cùng data model, nên việc chuyển sang không phải viết lại mà là migration dữ liệu. Hãy cài InvoiceShelf, không cài Crater.
Cài đặt từng ứng dụng trên một VPS
Ngoại trừ InvoicePlane, các ứng dụng này dễ chạy nhất bằng Docker Compose. Nếu bạn chưa quen với Docker Compose, hãy bắt đầu bằng stack Docker Compose đầu tiên trên một VPS rồi quay lại đây.
Invoice Ninja cung cấp repository compose riêng.
git clone https://github.com/invoiceninja/dockerfiles.git
cd dockerfiles
docker run --rm -it invoiceninja/invoiceninja php artisan key:generate --showChép key đó vào file env trong repository, cùng với APP_URL thật của bạn. Sau đó đặt ownership theo yêu cầu của image và khởi động ứng dụng.
chmod 755 docker/app/public
sudo chown -R 1500:1500 docker/app
docker compose up -dOwnership 1500:1500 khớp với user bên trong image. Nếu bỏ qua bước này, ứng dụng không thể ghi cache hoặc các file PDF được tạo. Trong setup wizard, nhập db làm database host vì đó là tên service trên compose network. localhost tại đó trỏ đến chính application container.
InvoiceShelf cung cấp các file compose sẵn, mỗi file dành cho một database engine.
curl -fLO https://raw.githubusercontent.com/InvoiceShelf/docker/master/docker-compose.mysql.yml
mv docker-compose.mysql.yml docker-compose.ymlMở file đó trước khi khởi động. Mọi password trong file đều là placeholder và các comment trong file cũng ghi rõ điều này. APP_URL, SESSION_DOMAIN và SANCTUM_STATEFUL_DOMAINS đều mặc định là localhost; bạn phải đặt hostname thật của mình cho cả 3 trước lần đăng nhập đầu tiên. Sau đó khởi động stack.
docker compose up -dỨng dụng publish port 8090 trên host và serve port 8080 bên trong container. Hãy đặt một reverse proxy có TLS (transport layer security) phía trước nó trước khi cho bất kỳ client nào truy cập.
File compose production của Kimai, theo tài liệu của project
services:
sqldb:
image: mysql:8.3
volumes:
- mysql:/var/lib/mysql
environment:
- MYSQL_DATABASE=kimai
- MYSQL_USER=kimaiuser
- MYSQL_PASSWORD=kimaipassword
- MYSQL_ROOT_PASSWORD=changemeplease
command: --default-storage-engine innodb
restart: unless-stopped
healthcheck:
test: mysqladmin -uroot -p$$MYSQL_ROOT_PASSWORD ping -h 127.0.0.1 --silent
interval: 10s
timeout: 5s
retries: 12
start_period: 30s
kimai:
image: kimai/kimai2:stable
depends_on:
sqldb:
condition: service_healthy
restart: true
volumes:
- data:/opt/kimai/var/data
- plugins:/opt/kimai/var/plugins
ports:
- 8001:8001
environment:
- APP_SECRET=your-fantastic-long-random-and-ultra-secure-secret
- TRUSTED_HOSTS=kimai.example.com
- ADMINMAIL=admin@example.com
- ADMINPASS=changemeplease
- DATABASE_URL=mysql://kimaiuser:kimaipassword@sqldb/kimai?charset=utf8mb4&serverVersion=8.3.0
restart: unless-stopped
volumes:
data:
mysql:
plugins:Đặt APP_SECRET thành một chuỗi ngẫu nhiên dài do bạn tự tạo và đặt TRUSTED_HOSTS thành domain bạn sẽ sử dụng thực tế. ADMINMAIL và ADMINPASS tạo administrator đầu tiên trong lần boot đầu, vì vậy hãy đổi password đó trong giao diện sau đó và xóa nó khỏi file.
InvoicePlane không có container. Trước tiên, hãy tạo một database trống.
sudo mysql -e "CREATE DATABASE invoiceplane CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"Tải archive từ trang releases của project, giải nén vào web root, chép ipconfig.php.example thành ipconfig.php, rồi đặt URL của bạn trong đó theo các comment có sẵn. Sau đó mở https://your-domain.example/index.php/setup và thực hiện lần lượt các bước trong installer.
Vì sao email hóa đơn của bạn vào thư mục spam
Đây là lỗi khiến bạn mất tiền, trong khi ứng dụng vẫn sẽ báo hóa đơn đã được gửi.
Không gửi email hóa đơn từ chính địa chỉ IP của VPS. IP mới của VPS chưa có lịch sử gửi mail, và các nhà cung cấp email lớn mặc định xem message đầu tiên từ một địa chỉ không xác định trong dải IP hosting là đáng ngờ. Hãy gửi qua một SMTP (simple mail transfer protocol) relay trên domain mà bạn đã xác thực. Cấu hình đầy đủ quy trình này là một hướng dẫn riêng; gửi mail ổn định từ ứng dụng tự host trình bày về relay, các bản ghi DNS và cách kiểm tra.
Địa chỉ From là nơi hầu hết cấu hình gửi hóa đơn bị sai. Địa chỉ này phải thuộc domain do bạn kiểm soát và phải là domain mà relay của bạn ký bằng DKIM (domainkeys identified mail). Đặt địa chỉ của chính khách hàng vào From có vẻ lịch sự nhưng sẽ làm hỏng khả năng gửi mail, vì mail server nhận sẽ kiểm tra xem domain trong From có khớp với domain đã xác thực message hay không. Gmail sẽ từ chối ngay khi hai domain không khớp:
550 5.7.1 Unauthenticated email from example.com is not accepted due to domain's DMARC policyGiữ địa chỉ của bạn trong From và đặt địa chỉ khách hàng vào Reply-To. Kiểm tra các bản ghi đã publish trước khi gửi hóa đơn thật.
dig +short TXT example.com
dig +short TXT _dmarc.example.com
dig +short TXT selector1._domainkey.example.comLệnh đầu tiên phải trả về một bản ghi SPF (sender policy framework) có tên relay của bạn. Lệnh thứ hai phải trả về một policy DMARC (domain-based message authentication, reporting and conformance). Lệnh thứ ba phụ thuộc vào selector do relay cung cấp. Kết quả trống nghĩa là bản ghi DKIM bị thiếu hoặc được publish dưới sai tên. Khi đó, mọi message bạn gửi đều sẽ fail bước kiểm tra chữ ký.
Sau đó gửi một hóa đơn thật đến tài khoản do bạn sở hữu tại một nhà cung cấp lớn và đọc raw headers. dkim=pass và spf=pass trong header Authentication-Results là bằng chứng duy nhất có giá trị. Cờ "sent" của ứng dụng chỉ có nghĩa là ứng dụng đã chuyển message cho relay.
Bản backup: cơ sở dữ liệu không được phép mất
Mất một media server chỉ có nghĩa là phải tải lại các file. Mất database lập hóa đơn nghĩa là bạn không thể chứng minh đã lập hóa đơn những gì, đã được thanh toán bao nhiêu, hoặc còn phải thu bao nhiêu. Hãy xử lý database này tương xứng.
Hãy backup 4 thứ. Database. Storage volume chứa logo, PDF đã tạo và biên lai chi phí. File môi trường của ứng dụng. Và các PDF đã render được lưu dưới dạng file thông thường, vì một file PDF vẫn mở được sau 10 năm mà không cần ứng dụng đã tạo ra nó.
File môi trường quan trọng hơn nhiều người nghĩ. Laravel dùng APP_KEY trong file này để mã hóa các giá trị nhạy cảm được lưu trữ, bao gồm credential của payment gateway. Nếu khôi phục database cùng một key mới tạo, các giá trị đó sẽ không giải mã được. Toàn bộ invoice vẫn còn, nhưng các thiết lập gateway không thể đọc được.
Dump từ stack InvoiceShelf có dạng như sau. Database service của nó chạy mariadb:10, nên tool bên trong container là mariadb-dump.
docker compose exec -T database mariadb-dump \
--user=root --password=YOUR_ROOT_PASSWORD \
--single-transaction --databases invoiceshelf > invoiceshelf.sql--single-transaction tạo snapshot nhất quán của các bảng InnoDB mà không khóa chúng, nên ứng dụng vẫn phục vụ request trong khi dump chạy. -T ngăn Docker cấp terminal, vì terminal này có thể làm hỏng output được redirect và tạo ra một dump file không thể import.
Theo lịch, hãy gửi bản backup ra khỏi server bằng restic backup được mã hóa đến storage ngoài site, đồng thời đặt thời gian retention đủ dài để bao phủ khoảng thời gian mà kế toán yêu cầu.
Sau đó hãy restore thử. Khởi chạy dump trong một container tạm, đăng nhập và mở invoice của tháng trước. Nếu chưa làm việc này ít nhất một lần, bạn chưa biết backup có hoạt động hay không.
Những gì kế toán sẽ yêu cầu
Không nên nhận tư vấn thuế từ một tutorial. Phần dưới đây mô tả những gì phần mềm này có thể tạo ra, để bạn có thể đưa danh sách này cho người tư vấn thuế hoặc kế toán của mình.
Dữ liệu có thể export. Bạn có thể export invoice và khoản thanh toán sang CSV từ giao diện, không cần database client và không cần mở support ticket. SQL dump là bản backup, không phải bản export, vì kế toán không thể mở nó.
Đánh số bất biến. Số invoice phải chạy tuần tự, không được dùng lại và không có khoảng trống. Xóa một invoice sẽ tạo khoảng trống, sau đó bạn phải giải thích khoảng trống này. Thay vào đó, hãy hủy invoice hoặc lập credit note; mọi ứng dụng trong danh sách này đều hỗ trợ. Việc có bắt buộc đánh số không có khoảng trống hay không phụ thuộc vào nơi bạn đăng ký kinh doanh, nên hỏi sớm.
Lưu trữ. Giữ database dump và PDF đã render trong thời gian theo quy định áp dụng cho bạn. PDF là tài liệu đã thực sự được gửi, và đó là artefact quan trọng nếu invoice bị tranh chấp.
Lịch sử thay đổi. Có thể cho biết ai đã chỉnh sửa invoice và chỉnh sửa khi nào là một tính năng đáng có. Mức hỗ trợ tính năng này khác nhau nhiều nhất giữa các ứng dụng này. Invoice Ninja lưu activity log theo từng record.
E-invoice có cấu trúc đã trở thành yêu cầu thực tế thay vì tính năng bổ sung ở một số khu vực thuộc EU. Invoice Ninja tạo được các format phổ biến, gồm ZUGFeRD và XRechnung, Facturae, FatturaPA và EN16931 generic. Việc gửi qua mạng Peppol từ một instance tự host được thực hiện thông qua access point riêng của Invoice Ninja: bạn đăng ký entity với họ và mua credit cho từng lần gửi, nên đây là dịch vụ trả phí tính đến tháng 8 năm 2026. Kimai hỗ trợ các format tương tự thông qua paid plugin. Ba ứng dụng còn lại hiện không tạo được structured e-invoice nào, và đây là lý do thuyết phục nhất để chọn Invoice Ninja nếu bạn xuất invoice trong EU.
FAQ
Tôi nên cài Crater hay InvoiceShelf?
InvoiceShelf. Nhánh mặc định của Crater đã không có commit nào trong 741 ngày tính đến 21 August 2026, và issue tracker của chính dự án hướng người dùng sang fork này. InvoiceShelf vẫn dùng giấy phép AGPL-3.0 và cùng data model, nên chuyển đổi giữa hai phần mềm là một lần migration database chứ không phải viết lại. Mọi hướng dẫn vẫn khuyến nghị Crater đều được viết trước khi dự án ngừng hoạt động.
Tôi có thể dùng Invoice Ninja cho doanh nghiệp của mình mà không phải trả phí không?
Có. Invoice Ninja self-host hoàn chỉnh và không mất phí theo Elastic License 2.0, bao gồm recurring invoice, client portal và payment gateway. Có 2 hạng mục phải trả tiền. Xóa branding Invoice Ninja khỏi các trang hiển thị cho client cần white-label licence, có giá "$40 per year" theo thông tin của chính dự án tính đến August 2026. Gửi e-invoice qua mạng Peppol được tính phí riêng theo mức sử dụng. Điều licence không cho phép là chạy phần mềm dưới dạng hosted service cho người khác.
Tại sao email hóa đơn của tôi lại vào thư mục spam?
Gần như luôn là vì message chưa được xác thực cho domain trong địa chỉ From. Gửi qua SMTP relay thay vì gửi trực tiếp từ VPS, sau đó publish record SPF và DMARC cho domain của bạn, đồng thời thêm record DKIM dưới selector do relay cung cấp. Giữ địa chỉ của bạn trong From và đặt địa chỉ client vào Reply-To. Đặt địa chỉ client làm sender khiến Gmail từ chối message với 550 5.7.1 Unauthenticated email from example.com is not accepted due to domain's DMARC policy. Xác nhận đã sửa bằng cách tìm dkim=pass và spf=pass trong header Authentication-Results của một message thử nghiệm.
Tôi nên chọn phần mềm nào nếu tính phí theo giờ?
Kimai. Đây trước hết là time tracker, nên invoice được tạo từ các timesheet entry đã được duyệt và line item là phần công việc bạn đã ghi nhận. Template là các file DOCX, ODS hoặc XLSX được thiết kế trong word processor, dễ hơn chỉnh CSS. Đổi lại, Kimai không có client portal và payment gateway, nên bạn gửi PDF qua email và nhận tiền bằng chuyển khoản. Invoice Ninja cũng theo dõi thời gian và có portal, vì vậy hãy chọn phần mềm đó nếu thanh toán thẻ online quan trọng với bạn hơn chi tiết timesheet.
Cụ thể tôi cần backup những gì?
Database, storage volume chứa logo và PDF đã tạo, environment file, cùng các PDF đã render được lưu dưới dạng file thông thường. Environment file là thứ mọi người thường bỏ sót: các ứng dụng Laravel như Invoice Ninja và InvoiceShelf mã hóa credential đã lưu bằng APP_KEY, nên khi restore database cùng một key mới được tạo, các thiết lập payment gateway sẽ không thể đọc được. Hãy restore toàn bộ vào một instance tạm thời một lần và mở một invoice cũ, vì đó là cách duy nhất để biết backup hoạt động.