# Customer Account Screen Hooks

https://dev.wisecp.com/es/client-account-screen-hooks

The twenty-nine placement points of the dashboard, the account pages and invoices.

## Overview

The placement points on the screens a signed-in customer sees live here: the dashboard, the account pages, the balance, subscriptions, the partner programme and invoices.

Two points fall outside that pattern: the invoice detail and the licence transfer result can open for somebody **not signed in**. Your output there must not depend on a session.

## Reference

### The top of the dashboard

uiclient.dashboard.top

`website/account` no parameters

Appears at the very top of the customer dashboard.

Parameters 0

—It takes no parameters.

Return 1

string|nullThe **HTML you return appears**. With several listeners the outputs are appended one after another in priority order. Empty text, `null` and `false` are skipped, so return `null` when you have nothing to add. The output enters the page unescaped — clean anything coming from outside yourself.

Listener PHP

```php
Hook::add('ui:client.dashboard.top', 10, function () {
    return '<div class="alert alert-info">Acme</div>';
});
```

### After the dashboard panels

uiclient.dashboard.panels.after

`website/account` no parameters

Appears after the panels on the dashboard.

Parameters 0

—It takes no parameters.

Return 1

string|nullThe **HTML you return appears**. With several listeners the outputs are appended one after another in priority order. Empty text, `null` and `false` are skipped, so return `null` when you have nothing to add. The output enters the page unescaped — clean anything coming from outside yourself.

Listener PHP

```php
Hook::add('ui:client.dashboard.panels.after', 10, function () {
    return '<div class="alert alert-info">Acme</div>';
});
```

### The bottom of the dashboard

uiclient.dashboard.bottom

`website/account` no parameters

Appears at the very bottom of the dashboard.

Parameters 0

—It takes no parameters.

Return 1

string|nullThe **HTML you return appears**. With several listeners the outputs are appended one after another in priority order. Empty text, `null` and `false` are skipped, so return `null` when you have nothing to add. The output enters the page unescaped — clean anything coming from outside yourself.

Listener PHP

```php
Hook::add('ui:client.dashboard.bottom', 10, function () {
    return '<div class="alert alert-info">Acme</div>';
});
```

### After the account tabs

uiclient.account.tabs.after

`website/account` no parameters

Appears after the tab bar on the account page.

Parameters 0

—It takes no parameters.

Return 1

string|nullThe **HTML you return appears**. With several listeners the outputs are appended one after another in priority order. Empty text, `null` and `false` are skipped, so return `null` when you have nothing to add. The output enters the page unescaped — clean anything coming from outside yourself.

Listener PHP

```php
Hook::add('ui:client.account.tabs.after', 10, function () {
    return '<div class="alert alert-info">Acme</div>';
});
```

### After the account cards

uiclient.account.cards.after

`website/account` no parameters

Appears after the account summary cards.

Parameters 0

—It takes no parameters.

Return 1

string|nullThe **HTML you return appears**. With several listeners the outputs are appended one after another in priority order. Empty text, `null` and `false` are skipped, so return `null` when you have nothing to add. The output enters the page unescaped — clean anything coming from outside yourself.

Listener PHP

```php
Hook::add('ui:client.account.cards.after', 10, function () {
    return '<div class="alert alert-info">Acme</div>';
});
```

### The bottom of the profile form

uiclient.account.profile.form.bottom

`website/account` no parameters

Appears below the profile form. If you add a field, **you must wire up its saving too**.

Parameters 0

—It takes no parameters.

Return 1

string|nullThe **HTML you return appears**. With several listeners the outputs are appended one after another in priority order. Empty text, `null` and `false` are skipped, so return `null` when you have nothing to add. The output enters the page unescaped — clean anything coming from outside yourself.

Listener PHP

```php
Hook::add('ui:client.account.profile.form.bottom', 10, function () {
    return '<div class="alert alert-info">Acme</div>';
});
```

### After the security section

uiclient.account.security.after

`website/account` no parameters

Appears after the account security section.

Parameters 0

—It takes no parameters.

Return 1

string|nullThe **HTML you return appears**. With several listeners the outputs are appended one after another in priority order. Empty text, `null` and `false` are skipped, so return `null` when you have nothing to add. The output enters the page unescaped — clean anything coming from outside yourself.

Listener PHP

```php
Hook::add('ui:client.account.security.after', 10, function () {
    return '<div class="alert alert-info">Acme</div>';
});
```

### After the settings

uiclient.account.settings.after

`website/account` no parameters

Appears after the account settings.

Parameters 0

—It takes no parameters.

Return 1

string|nullThe **HTML you return appears**. With several listeners the outputs are appended one after another in priority order. Empty text, `null` and `false` are skipped, so return `null` when you have nothing to add. The output enters the page unescaped — clean anything coming from outside yourself.

Listener PHP

```php
Hook::add('ui:client.account.settings.after', 10, function () {
    return '<div class="alert alert-info">Acme</div>';
});
```

### After the sub-account list

uiclient.sub_accounts.list.after

`website/account` no parameters

Appears after the sub-user list.

Parameters 0

—It takes no parameters.

Return 1

string|nullThe **HTML you return appears**. With several listeners the outputs are appended one after another in priority order. Empty text, `null` and `false` are skipped, so return `null` when you have nothing to add. The output enters the page unescaped — clean anything coming from outside yourself.

Listener PHP

```php
Hook::add('ui:client.sub_accounts.list.after', 10, function () {
    return '<div class="alert alert-info">Acme</div>';
});
```

### After the API keys

uiclient.api_credentials.after

`website/account` no parameters

Appears after the API key list.

Parameters 0

—It takes no parameters.

Return 1

string|nullThe **HTML you return appears**. With several listeners the outputs are appended one after another in priority order. Empty text, `null` and `false` are skipped, so return `null` when you have nothing to add. The output enters the page unescaped — clean anything coming from outside yourself.

Listener PHP

```php
Hook::add('ui:client.api_credentials.after', 10, function () {
    return '<div class="alert alert-info">Acme</div>';
});
```

### The bottom of the balance overview

uiclient.balance_overview.bottom

`website/account` no parameters

Appears below the balance overview.

Parameters 0

—It takes no parameters.

Return 1

string|nullThe **HTML you return appears**. With several listeners the outputs are appended one after another in priority order. Empty text, `null` and `false` are skipped, so return `null` when you have nothing to add. The output enters the page unescaped — clean anything coming from outside yourself.

Listener PHP

```php
Hook::add('ui:client.balance_overview.bottom', 10, function () {
    return '<div class="alert alert-info">Acme</div>';
});
```

### The top of the balance history

uiclient.balance_history.top

`website/account` no parameters

Appears above the balance movement list.

Parameters 0

—It takes no parameters.

Return 1

string|nullThe **HTML you return appears**. With several listeners the outputs are appended one after another in priority order. Empty text, `null` and `false` are skipped, so return `null` when you have nothing to add. The output enters the page unescaped — clean anything coming from outside yourself.

Listener PHP

```php
Hook::add('ui:client.balance_history.top', 10, function () {
    return '<div class="alert alert-info">Acme</div>';
});
```

### The bottom of the top-up form

uiclient.add_funds.bottom

`website/account` no parameters

Appears below the wallet top-up form.

Parameters 0

—It takes no parameters.

Return 1

string|nullThe **HTML you return appears**. With several listeners the outputs are appended one after another in priority order. Empty text, `null` and `false` are skipped, so return `null` when you have nothing to add. The output enters the page unescaped — clean anything coming from outside yourself.

Listener PHP

```php
Hook::add('ui:client.add_funds.bottom', 10, function () {
    return '<div class="alert alert-info">Acme</div>';
});
```

### The top of the subscriptions list

uiclient.subscriptions.top

`website/account` no parameters

Appears above the list of payment agreements.

Parameters 0

—It takes no parameters.

Return 1

string|nullThe **HTML you return appears**. With several listeners the outputs are appended one after another in priority order. Empty text, `null` and `false` are skipped, so return `null` when you have nothing to add. The output enters the page unescaped — clean anything coming from outside yourself.

Listener PHP

```php
Hook::add('ui:client.subscriptions.top', 10, function () {
    return '<div class="alert alert-info">Acme</div>';
});
```

### The top of the partner dashboard

uiclient.affiliate_dashboard.top

`website/account` no parameters

Appears at the top of the partner programme dashboard.

Parameters 0

—It takes no parameters.

Return 1

string|nullThe **HTML you return appears**. With several listeners the outputs are appended one after another in priority order. Empty text, `null` and `false` are skipped, so return `null` when you have nothing to add. The output enters the page unescaped — clean anything coming from outside yourself.

Listener PHP

```php
Hook::add('ui:client.affiliate_dashboard.top', 10, function () {
    return '<div class="alert alert-info">Acme</div>';
});
```

### After the partner statistics

uiclient.affiliate_stats.after

`website/account` no parameters

Appears after the partner statistics.

Parameters 0

—It takes no parameters.

Return 1

string|nullThe **HTML you return appears**. With several listeners the outputs are appended one after another in priority order. Empty text, `null` and `false` are skipped, so return `null` when you have nothing to add. The output enters the page unescaped — clean anything coming from outside yourself.

Listener PHP

```php
Hook::add('ui:client.affiliate_stats.after', 10, function () {
    return '<div class="alert alert-info">Acme</div>';
});
```

### The top of the reseller dashboard

uiclient.reseller_dashboard.top

`website/account` no parameters

Appears at the top of the reseller dashboard.

Parameters 0

—It takes no parameters.

Return 1

string|nullThe **HTML you return appears**. With several listeners the outputs are appended one after another in priority order. Empty text, `null` and `false` are skipped, so return `null` when you have nothing to add. The output enters the page unescaped — clean anything coming from outside yourself.

Listener PHP

```php
Hook::add('ui:client.reseller_dashboard.top', 10, function () {
    return '<div class="alert alert-info">Acme</div>';
});
```

### The certificate action area

uiclient.ssl_dashboard.actions

`website/account` no parameters

Appears in the action area of the certificate dashboard.

Parameters 0

—It takes no parameters.

Return 1

string|nullThe **HTML you return appears**. With several listeners the outputs are appended one after another in priority order. Empty text, `null` and `false` are skipped, so return `null` when you have nothing to add. The output enters the page unescaped — clean anything coming from outside yourself.

Listener PHP

```php
Hook::add('ui:client.ssl_dashboard.actions', 10, function () {
    return '<div class="alert alert-info">Acme</div>';
});
```

### The top of the message panel

uiclient.sms_panel.top

`website/account` no parameters

Appears at the top of the bulk message panel.

Parameters 0

—It takes no parameters.

Return 1

string|nullThe **HTML you return appears**. With several listeners the outputs are appended one after another in priority order. Empty text, `null` and `false` are skipped, so return `null` when you have nothing to add. The output enters the page unescaped — clean anything coming from outside yourself.

Listener PHP

```php
Hook::add('ui:client.sms_panel.top', 10, function () {
    return '<div class="alert alert-info">Acme</div>';
});
```

### The top of the message form

uiclient.sms_send.top

`website/account` no parameters

Appears above the message sending form. It suits a reminder that the charge is counted per part.

Parameters 0

—It takes no parameters.

Return 1

string|nullThe **HTML you return appears**. With several listeners the outputs are appended one after another in priority order. Empty text, `null` and `false` are skipped, so return `null` when you have nothing to add. The output enters the page unescaped — clean anything coming from outside yourself.

Listener PHP

```php
Hook::add('ui:client.sms_send.top', 10, function () {
    return '<div class="alert alert-info">Acme</div>';
});
```

### The bottom of the message form

uiclient.sms_send.bottom

`website/account` no parameters

Appears below the message sending form.

Parameters 0

—It takes no parameters.

Return 1

string|nullThe **HTML you return appears**. With several listeners the outputs are appended one after another in priority order. Empty text, `null` and `false` are skipped, so return `null` when you have nothing to add. The output enters the page unescaped — clean anything coming from outside yourself.

Listener PHP

```php
Hook::add('ui:client.sms_send.bottom', 10, function () {
    return '<div class="alert alert-info">Acme</div>';
});
```

### The top of the invoice page

uiclient.invoice_detail.top

`website/invoices` no parameters

Appears at the very top of the invoice detail. It runs on an invoice opened **through a share link** too, where the visitor may not be signed in.

Parameters 0

—It takes no parameters.

Return 1

string|nullThe **HTML you return appears**. With several listeners the outputs are appended one after another in priority order. Empty text, `null` and `false` are skipped, so return `null` when you have nothing to add. The output enters the page unescaped — clean anything coming from outside yourself.

Listener PHP

```php
Hook::add('ui:client.invoice_detail.top', 10, function () {
    return '<div class="alert alert-info">Acme</div>';
});
```

### After the invoice lines

uiclient.invoice_detail.items_after

`website/invoices` no parameters

Appears after the invoice lines.

Parameters 0

—It takes no parameters.

Return 1

string|nullThe **HTML you return appears**. With several listeners the outputs are appended one after another in priority order. Empty text, `null` and `false` are skipped, so return `null` when you have nothing to add. The output enters the page unescaped — clean anything coming from outside yourself.

Listener PHP

```php
Hook::add('ui:client.invoice_detail.items_after', 10, function () {
    return '<div class="alert alert-info">Acme</div>';
});
```

### After the transaction list

uiclient.invoice_detail.transactions.after

`website/invoices` no parameters

Appears after the payment movements.

Parameters 0

—It takes no parameters.

Return 1

string|nullThe **HTML you return appears**. With several listeners the outputs are appended one after another in priority order. Empty text, `null` and `false` are skipped, so return `null` when you have nothing to add. The output enters the page unescaped — clean anything coming from outside yourself.

Listener PHP

```php
Hook::add('ui:client.invoice_detail.transactions.after', 10, function () {
    return '<div class="alert alert-info">Acme</div>';
});
```

### The bottom of the invoice page

uiclient.invoice_detail.bottom

`website/invoices` no parameters

Appears at the very bottom of the invoice detail.

Parameters 0

—It takes no parameters.

Return 1

string|nullThe **HTML you return appears**. With several listeners the outputs are appended one after another in priority order. Empty text, `null` and `false` are skipped, so return `null` when you have nothing to add. The output enters the page unescaped — clean anything coming from outside yourself.

Listener PHP

```php
Hook::add('ui:client.invoice_detail.bottom', 10, function () {
    return '<div class="alert alert-info">Acme</div>';
});
```

### The top of the invoice list

uiclient.invoice_list.top

`website/invoices` no parameters

Appears above the invoice list.

Parameters 0

—It takes no parameters.

Return 1

string|nullThe **HTML you return appears**. With several listeners the outputs are appended one after another in priority order. Empty text, `null` and `false` are skipped, so return `null` when you have nothing to add. The output enters the page unescaped — clean anything coming from outside yourself.

Listener PHP

```php
Hook::add('ui:client.invoice_list.top', 10, function () {
    return '<div class="alert alert-info">Acme</div>';
});
```

### The invoice list toolbar

uiclient.invoice_list.toolbar

`website/invoices` no parameters

Appears in the toolbar of the invoice list.

Parameters 0

—It takes no parameters.

Return 1

string|nullThe **HTML you return appears**. With several listeners the outputs are appended one after another in priority order. Empty text, `null` and `false` are skipped, so return `null` when you have nothing to add. The output enters the page unescaped — clean anything coming from outside yourself.

Listener PHP

```php
Hook::add('ui:client.invoice_list.toolbar', 10, function () {
    return '<div class="alert alert-info">Acme</div>';
});
```

### The top of the bulk payment page

uiclient.bulk_pay.top

`website/invoices` no parameters

Appears above the screen for paying several invoices together.

Parameters 0

—It takes no parameters.

Return 1

string|nullThe **HTML you return appears**. With several listeners the outputs are appended one after another in priority order. Empty text, `null` and `false` are skipped, so return `null` when you have nothing to add. The output enters the page unescaped — clean anything coming from outside yourself.

Listener PHP

```php
Hook::add('ui:client.bulk_pay.top', 10, function () {
    return '<div class="alert alert-info">Acme</div>';
});
```

### Above the transfer result page

uiclient.license_transfer_result.before

`website/account` no parameters

Appears above the licence transfer result page. That page opens **through a link in an email**, so the visitor may not be signed in.

Parameters 0

—It takes no parameters.

Return 1

string|nullThe **HTML you return appears**. With several listeners the outputs are appended one after another in priority order. Empty text, `null` and `false` are skipped, so return `null` when you have nothing to add. The output enters the page unescaped — clean anything coming from outside yourself.

Listener PHP

```php
Hook::add('ui:client.license_transfer_result.before', 10, function () {
    return '<div class="alert alert-info">Acme</div>';
});
```

## Pitfalls

> **The invoice page can open without a sign-in**
> 
> The invoice detail also opens through a **share link**, where the visitor has no session. Output depending on one comes out empty there, and showing customer details opens them to somebody you cannot identify.

> **Adding a field to the profile form does not save it**
> 
> A field you put on the account form is **only visible**. For the value to be kept you must also hook into the profile update flow; otherwise the customer fills it in, saves, and it disappears.

## Related Articles

- [Customer Site Hooks](https://dev.wisecp.com/en/hooks-on-the-customer-site)
- [Customer Panel Data Hooks](https://dev.wisecp.com/en/client-panel-data-hooks)
- [Site Content Hooks](https://dev.wisecp.com/en/client-content-hooks)
