Customer accounts
Signal ships seven account sections and the seven JSON templates that use them. They share one visual system — a narrow panel for the forms, a wide panel for the tables — and one stylesheet, so the account area reads as part of the store rather than as Shopify’s default furniture.
| Section | Template | Serves |
|---|---|---|
main-login | templates/customers/login.json | /account/login |
main-register | templates/customers/register.json | /account/register |
main-account | templates/customers/account.json | /account |
main-addresses | templates/customers/addresses.json | /account/addresses |
main-order | templates/customers/order.json | A single order |
main-activate-account | templates/customers/activate_account.json | The invite-activation link |
main-reset-password | templates/customers/reset_password.json | The password-reset link |
All seven templates are present and wired — each one references its section and nothing else. They are not dead code.
Settings
Section titled “Settings”Only two of the seven have any settings. Everything else is driven by Shopify’s own objects and the theme’s translations.
Log in (main-login)
Section titled “Log in (main-login)”| Setting | Type | Default | What it does |
|---|---|---|---|
| Heading | Text | Log in | The page heading |
| Subtext | Text | — | An optional line under it |
Create account (main-register)
Section titled “Create account (main-register)”| Setting | Type | Default | What it does |
|---|---|---|---|
| Heading | Text | Create an account | The page heading |
| Subtext | Text | Order history, saved addresses, and the drop list first. | A line under it |
main-account, main-addresses, main-order, main-activate-account and main-reset-password have no settings — their copy all comes from locales/en.default.json under customers.*, so it is translatable rather than per-theme-instance.
Log in
Section titled “Log in”Two panels in one section, switched by the #recover / #login fragment: the login form and the password-recovery form. Both are Shopify’s native forms (customer_login and recover_customer_password) and report Shopify’s own errors through default_errors.
Also rendered:
- a Forgot password link into the recovery panel, and a cancel link back
- a Create account link to the register page
- guest checkout login, but only when
shop.checkout.guest_loginis true — Shopify’sguest_loginform, submitted as a plain link-styled button
Create account
Section titled “Create account”Shopify’s create_customer form: first name, last name, email and password, with correct autocomplete attributes throughout and the email and password required. Field values are re-populated from the form object after a validation failure, so a rejected submission does not clear what was typed.
Account
Section titled “Account”The signed-in home: a welcome line with the customer’s email, a log-out link, and two panels.
Orders is a real table — order number (linking to the order), date, payment status, fulfilment status and total — paginated at 12 per page with the theme’s standard pager. paid and fulfilled statuses are given the accent treatment so the common case is scannable. With no orders, an empty state offers a link to the all-products collection.
Details shows the default address through format_address (so it is formatted correctly per country) plus a link to the address book carrying the address count.
Addresses
Section titled “Addresses”A grid of cards, paginated at 6. The first card is always the add new form; each existing address renders its formatted address plus an Edit <details> containing a pre-filled form.
The fields themselves come from one shared set of address fields used by both forms: first and last name, company, two address lines, city, postal code, country, province, phone, and a “set as default” checkbox. The snippet takes a uid parameter — the address id when editing, New when adding — so two forms on one page never collide on element ids.
Province is populated from Shopify’s own country data by the theme’s shared country/province wiring, and the whole field is hidden for countries that have no provinces. The same code drives the cart page’s shipping estimator.
Delete uses a confirm dialog, then builds and submits a form with _method=delete — rather than Shopify’s legacy inline-onclick helper, which no longer belongs in a modern theme.
A full order view: title and date, a cancellation notice with its reason when the order was cancelled, then a line-item table.
Each line shows the title (linked when the product still exists), the selling plan name on a subscription line, unit pricing when applicable, and tracking — the tracking number, as a link when the carrier supplied a URL.
The table’s footer builds the real total: subtotal, each cart-level discount, each shipping method with its price, each tax line with its rate, and the order total. Below it, the shipping and billing addresses through format_address, plus the payment and fulfilment status labels.
Activate account
Section titled “Activate account”Shopify’s activate_customer_password form — a password and its confirmation — plus a Decline submit, which is what Shopify expects to let an invited customer refuse the invitation.
Reset password
Section titled “Reset password”Shopify’s reset_customer_password form: a new password and its confirmation. Reached only from the link in Shopify’s reset email.
Shared behaviour
Section titled “Shared behaviour”- Every field has a real
<label>, visible in the account area rather than hidden, and the correctautocompletevalue so password managers behave. - Errors use
form.errors | default_errors, so the messages are Shopify’s own and already translated. - Tables are wrapped in a horizontal scroll container, so an order with long product names does not break the layout on a phone.
- Pagination reuses the theme’s
s-pgnpager, so it looks identical to the collection and blog pagers.