Cho lập trình viên
Build plugin. Không workaround.
AcelleMail là nền tảng email marketing trên Laravel 11+ ship kèm full PHP source không mã hoá — cộng với Hook system có kiểu rõ ràng để plugin của bạn thêm sending driver, payment gateway, AI, UI tuỳ chỉnh, kể cả REST API. Không cần fork core.
Plugin thực tế đang chạy hôm nay
Vì sao developer chọn AcelleMail
Xây trên framework bạn đã biết.
Mở rộng qua pattern bạn đã dùng.
PHP / Laravel full source
Toàn bộ PHP source không mã hoá đi kèm mọi license. Sửa bất kỳ class, override bất kỳ service, fork vào namespace của riêng bạn — code của bạn, luật của bạn. Build trên Laravel 11+ nên framework bạn đã biết sẽ gánh phần nặng.
Kiến trúc plugin
Thả một folder hình Composer vào storage/app/plugins/<vendor>/<name>/ và app tự autoload. ServiceProvider inject route, view, migration, hook — activate, deactivate, delete sạch sẽ.
REST API auth bằng token
Endpoint CRUD cho campaign, list, subscriber, template, automation. Webhook event cho mọi sự kiện domain-level. Drop-in cho SaaS frontend, mobile app, hoặc service Laravel khác. API mà plugin dùng cũng chính là API mà client ngoài dùng — không có endpoint hạng hai.
Self-hosted trên hạ tầng của bạn
Server của bạn, DB của bạn, dữ liệu subscriber của bạn. Không vendor lock-in. Trả tiền license một lần; chỉ trả chi phí SMTP nền (ví dụ Amazon SES $0.10/1K). Deploy ở bất cứ nơi nào PHP chạy — bare metal, Kubernetes, Forge, Laravel Vapor. Scale theo cách stack của bạn scale.
Plugin có thể build được gì
14 extension surface.
Mỗi cái đều có ví dụ production thực tế hôm nay.
Plugin là một package Laravel tự chứa nằm trên đĩa, có namespace riêng, table DB riêng, route, view, controller, model — và tích hợp với core thông qua Hook system có kiểu thay vì hack include.
Driver & tích hợp · 4
UI & trang · 5
Dữ liệu & vòng đời · 2
Hành vi & luồng · 3
Một plugin duy nhất có thể mix bất kỳ surface nào trong số này — acelle/ai dùng 7/14 trong một package.
Hook system
Bốn pattern extension có kiểu. Không override bất ngờ. Không xung đột im lặng.
Core không bao giờ import code plugin — chỉ khai báo điểm extension. Plugin lắng nghe và phản ứng. Bốn pattern, mỗi cái có vai trò rõ ràng. Xung đột throw ngay lập tức.
REGISTRY add() + collect()
Plugin đóng góp item vào một danh sách. Core hỏi "ai có sending driver?" và plugin của bạn nói "tôi có."
Hook::add('register_sending_server_driver', fn () => [
'type' => 'myvendor-foo',
'driver' => \MyVendor\Foo\Driver::class,
]);
$drivers = Hook::collect('register_sending_server_driver');
EVENT on() + fire()
Plugin phản ứng với một sự kiện xảy ra. Giá trị trả về bị bỏ.
Hook::on('customer_added', function ($customer) {
LoyaltyPoints::award($customer, 100, 'welcome');
});
Hook::fire('customer_added', [$customer]);
BEHAVIOR set() + perform()
Plugin thay thế hoàn toàn một mảnh logic của core. Chỉ một plugin được claim một behavior cho trước — xung đột throw ngay lập tức.
Hook::set('dispatch_list_import_job',
fn ($list, $f) => new MyFasterImportJob($list, $f));
Hook::setIfEmpty('dispatch_list_import_job',
fn ($list, $f) => new DefaultImportJob($list, $f));
$job = Hook::perform('dispatch_list_import_job', [$list, $f]);
dispatch($job);
FILTER modify() + filter()
Plugin biến đổi một giá trị qua chuỗi callback. Mỗi callback nhận giá trị hiện tại, trả về giá trị đã sửa.
Hook::modify('sidebar-menu-items', function (array $items) {
$items[] = [
'label' => 'Loyalty',
'url' => route('lp.dashboard'),
];
return $items;
});
$menu = Hook::filter('sidebar-menu-items', $defaultMenu);
Hello World trong 5 phút
Một plugin chạy được từ con số không trong tám lệnh.
Scaffold tạo mọi thứ — metadata Composer, ServiceProvider, model mẫu, migration mẫu, route mẫu, view mẫu. Từ đó là phần của bạn để phát triển.
-
1
Scaffold plugin
Tạo layout folder chuẩn + một row DB inactive.
-
2
Sửa composer.json
Khai báo namespace và ServiceProvider cho Composer.
-
3
Viết migration
Table riêng cho plugin, tên có vendor-prefix. Chạy khi activate, rollback khi delete.
-
4
Định nghĩa model
Model Eloquent chuẩn trong namespace của riêng bạn.
-
5
Thêm controller và view
Controller Laravel thuần — namespace view chính là tên plugin của bạn.
-
6
Khai báo route
Cùng Route::group bạn đã quen dùng. Load bởi ServiceProvider::boot().
-
7
Ráp tất cả trong ServiceProvider::boot()
Load view + route; hook vào
activate_plugin_…để migrate khi activate. -
8
Activate từ admin
Vào
/rui/admin/plugins. Migration tự chạy. Plugin sống tại prefix của nó.
Giờ bạn đã có một plugin chạy được. Thêm bao nhiêu model, controller, hook tuỳ feature yêu cầu. Test sống trong tests/; chạy chúng với php artisan test --testsuite='Plugin: myvendor/loyalty'. Tham khảo contract chính thức trong knowledge base.
Vòng đời plugin
Bốn trạng thái. Chuyển tiếp dự đoán được. Không có chuyện "nó có chạy không?".
Mỗi plugin sống ở đúng một trong bốn trạng thái. Trạng thái bạn đang ở quyết định hook nào fire, migration nào đã chạy, và điều gì xảy ra ở chuyển tiếp kế tiếp. Tham chiếu nguồn tại docs/plugin/SOURCE_OF_TRUTH.md.
Đã khám phá, chưa chạy
Folder plugin tồn tại, index.json đã index, row DB ghi inactive. register() của ServiceProvider đã chạy, nhưng các hook trong boot() bị gate cho tới khi bạn nhấn Activate.
Live, hook đang fire
Lần activation đầu tiên fire activate_plugin_<name> một lần — đây là chỗ migration chạy. Sau đó mọi hook REGISTRY / EVENT / FILTER / BEHAVIOR đều live cho tới khi deactivate.
Tạm dừng, data còn nguyên
Route unmount, hook gate off, nhưng folder + table DB còn. Re-activate không chạy lại migration hoặc hook activate — an toàn để toggle trong production.
Đã gỡ sạch sẽ
Folder đã xoá, row DB không còn. Nếu $keepData = false, migration của plugin rollback — table có vendor-prefix bị drop. Table core không bao giờ bị động đến.
Plugin showcase thực tế
acelle/ai — toàn bộ AI subsystem trong một folder plugin.
Plugin acelle/ai ship một layer AI assistant hoàn chỉnh: chatbox agent trên mọi trang, ✨ sparkle viết lại text trên rich-text field, persona coach grounded theo KB (Deliverability, Segments, Campaigns, Forms), và một admin observability surface trải 5 route. Mount qua 3 layout hook. Zero thay đổi core.
Nó ship gì
- → Chatbox nổi — chế độ support thuần + chế độ agent opt-in gọi được tool
- → Sparkle popover — rewrite / expand / simplify một click trên mọi rich-text field
- → Coach persona — LLM helper nhận biết domain, scope theo từng màn hình
- → Admin observability — usage, audit, conversation, feedback, self-improve
- → Engine linh hoạt — BYO OpenAI, Anthropic, hoặc Ollama local
- → Trang landing plugin tại
/plugins/acelle/ai/dashboard
Bằng con số
Mount thế nào — 3 hook
3 hook REGISTRY layout — vậy thôi. Cộng inject theo từng trang, listener event vòng đời, và một REST API riêng namespace tại /api/v1/ai/*. Zero thay đổi core; folder plugin là drop-in deploy được.
REST API
Endpoint auth bằng token. Cùng API mà plugin dùng.
Dùng REST API để tích hợp AcelleMail vào SaaS frontend, mobile app, hoặc service Laravel của bạn. API mà plugin dùng cũng chính là API mà client ngoài dùng — không có endpoint hạng hai.
Resource
- List —
GET/POST/PATCH/DELETE /api/v1/lists[/:uid] - Subscriber —
/api/v1/subscribers· tag · sub/unsub - Campaign —
/api/v1/campaigns[/:uid]· run/pause/resume · CSV log - Automation —
/api/v1/automations[/:uid]· execute · api/call - Sending server —
/api/v1/sending_servers[/:uid] - Customer (admin) —
/api/v1/customers[/:uid]· assign/change-plan · enable/disable - Subscription (admin) —
/api/v1/subscriptions[/:uid]
Sự kiện webhook
Vòng đời (cấu hình ở Admin → Webhooks): new_customer, new_subscription, change_plan, cancel_subscription, terminate_subscription, automation_webhook.
Tracking theo recipient (theo campaign): open, click, unsubscribe.
# Create a list
$ curl -X POST \
https://your-acelle.example.com/api/v1/lists \
-H "Authorization: Bearer $ACELLE_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "Newsletter",
"from_email": "hi@example.com",
"from_name": "Hi Team",
"subject": "Weekly digest"
}'
# Add a subscriber
$ curl -X POST \
.../api/v1/lists/:uid/subscribers \
-H "Authorization: Bearer $ACELLE_TOKEN" \
-d '{"EMAIL":"alice@example.com"}'
# Send a campaign
$ curl -X POST \
.../api/v1/campaigns/:uid/send \
-H "Authorization: Bearer $ACELLE_TOKEN"
# Receive a webhook
POST /your-webhook-endpoint
{
"event": "campaign.sent",
"campaign_uid": "abc123",
"list_uid": "xyz789",
"sent_at": "2026-05-06T12:34:56Z"
}
Tinh thần open-source
Code của bạn, mãi mãi. Không hộp đen, không phí định kỳ, không squat namespace.
Source không mã hoá
Từng dòng PHP chạy trên server của bạn. Không ionCube, không SourceGuardian, không obfuscation. git diff bản tuỳ chỉnh của bạn. grep để tìm bất cứ thứ gì.
Update trọn đời
Mọi release của AcelleMail từ 2016 đều có trong lịch sử download CodeCanyon của bạn. Pull cái bạn muốn khi bạn muốn. Không áp lực subscription.
Namespace của bạn, mãi mãi
Plugin sống dưới MyVendor\MyPlugin\ — cô lập hoàn toàn khỏi core Acelle\*. Có thể phân phối qua Composer tới team hoặc marketplace của bạn.
License một lần
Trả 1.950.000 ₫ (Regular) hoặc 4.900.000 ₫ (Extended cho SaaS). Không subscription, không tính per-subscriber, không tính per-email. Phép toán không đổi khi bạn lớn.
Tài nguyên & cộng đồng
Docs, plugin mẫu, và một đường dây trực tiếp tới support.
Tài liệu developer đầy đủ
Mười một deep-dive grounded theo source. Nhảy thẳng vào trang bạn cần:
Hướng dẫn phát triển plugin
Năm file phía host, luồng boot-and-load, bốn trạng thái vòng đời, hai layer injection — mô hình tinh thần mà phần docs còn lại giả định.
/developers/plugin-architecture →Tham chiếu REST API
Authentication, danh mục endpoint, payload webhook, shape lỗi — trang landing native kèm ví dụ.
/api →Hook system — bốn pattern
REGISTRY / EVENT / BEHAVIOR / FILTER — bốn dạng extension plugin dùng, kèm call-site thực tế grep từ core, ngữ nghĩa xung đột và sáu anti-pattern.
/developers/hook-system →Sending driver — pattern plugin đầy đủ
Ship một MTA backend mới hoàn toàn mà không fork core. Contract register_sending_server_driver, chín capability marker, và năm pitfall của plugin Postal.
Showcase plugin — acelle/ai
Plugin phức tạp chuẩn mực được dắt đi từ đầu đến cuối. Tám model, mười bốn migration, mười tám locale, mọi hook surface, UI chatbox, cộng với công thức học bốn bước.
/developers/showcase →Hỗ trợ developer
Bí ở contract hook hoặc câu hỏi vòng đời plugin? Email cho chúng tôi — phản hồi điển hình trong 24h.
support@acellemail.com →Duyệt toàn bộ 11 deep-dive →
Nền tảng, Xây dựng, Chất lượng, Tham chiếu — mọi trang ở một chỗ, grounded theo storage/app/plugins/acelle/ai/ và docs plugin chính thức.
FAQ cho developer
Những câu developer thực sự hỏi trước khi mua.
Tôi có thể sửa core source code mà không mất update không? +
Có, nhưng pattern sạch nhất là plugin. Plugin sống ngoài namespace core và tự survive mọi upgrade. Sửa trực tiếp core thì được nhưng phải merge thủ công thay đổi upstream mỗi release. Hệ thống plugin tồn tại đúng là để tránh cái khổ đó.
Plugin có survive được khi upgrade AcelleMail không? +
Có, theo thiết kế. Core khai báo hook point; plugin phản ứng. Miễn là tên hook và signature ổn định (và chúng tôi version-stamp những thay đổi breaking), plugin của bạn vẫn chạy. Chúng tôi test plugin AI (acelle/ai) trên mỗi release.
Tôi có thể bán plugin thương mại không? +
Có. Extended License cho phép bạn phân phối plugin của riêng mình dưới license của riêng bạn. Plugin sống trong namespace riêng; bạn sở hữu code đó 100%. Vài team chạy marketplace riêng tư cho hệ sinh thái plugin nội bộ của họ.
Hệ thống plugin xử lý xung đột thế nào? +
Hook REGISTRY merge (mọi plugin đều đóng góp); hook EVENT đều fire (không thể xung đột); chuỗi FILTER tích luỹ; BEHAVIOR là pattern "exclusive" duy nhất — nếu hai plugin cùng cố claim một behavior, exception throw ngay. Không có chuyện override im lặng bất ngờ.
Các plugin có nói chuyện với nhau được không? +
Có, qua cùng Hook system. Plugin A có thể fire event cho Plugin B lắng nghe. Hoặc expose một class public — MyVendor\PluginA\Service là class PHP thông thường, import như bất kỳ class nào khác. Plugin acelle/ai expose hook để plugin khác đăng ký AI tool tuỳ chỉnh.
Khác biệt giữa Regular và Extended đối với developer là gì? +
Regular (1.950.000 ₫) bao quát use riêng của bạn trên một domain. Extended (4.900.000 ₫) thêm quyền tính phí end-user (resell dưới dạng SaaS), phân phối bản clone white-label, và bán plugin của riêng bạn. Cả hai ship cùng source code.
Migration plugin có chạm vào DB chính không? +
Chúng ghi vào cùng database, nhưng ở table có prefix tên vendor của bạn (ví dụ myvendor_loyalty_accounts). Migration chạy khi activate plugin, rollback khi delete plugin với $keepData = false. Zero rủi ro cho table core.
Tôi có thể viết plugin bằng ngôn ngữ khác PHP không? +
Runtime plugin là PHP/Laravel. Nhưng plugin của bạn có thể shell out tới bất cứ thứ gì — service Node, Python ML, binary Go, HTTP API ngoài. Vài team ship plugin wrap tool ngoài. Plugin là shell tích hợp; phần nặng có thể sống ở bất cứ đâu.
Plugin tương tác với AI subsystem thế nào? +
acelle/ai expose hook để plugin khác có thể dùng để đăng ký AI tool tuỳ chỉnh, swap engine, hoặc hook vào layer observability. Đọc source plugin AI để biết contract. Plugin của bạn cũng có thể fire event mà AI agent nhặt làm context.
Có marketplace plugin không? +
Chưa. Hôm nay, plugin phân phối qua bán trực tiếp, GitHub, hoặc registry riêng tư của bạn. Marketplace cộng đồng nằm trong roadmap khi đủ plugin bên thứ ba để làm cho nó đáng.
Ship plugin đầu tiên của bạn ngay chiều nay.
Toàn bộ PHP source code. Update trọn đời. Hook system. Ví dụ production thực tế để copy. Một lần 4.900.000 ₫ cho Extended License (redistribute plugin thương mại + dùng SaaS).