Both let you add a clickable element to a record's UI but they perform different actions.
A Custom Link opens a URL — that's it. The URL can include merge fields (e.g., https://maps.google.com/?q={!Account.BillingCity}) so it's record-aware. Common uses: opening a third-party app prefilled with the record's data, jumping to a related document repository, opening Google Maps for an Address.
A Custom Button does more. It can open a URL too, but also:
- Execute JavaScript (in Salesforce Classic only — JavaScript Buttons are not supported in Lightning Experience).
- Call a Visualforce page that performs server-side logic.
- Be a list-view button — bulk action across selected records.
- Open in a sidebar / new tab / replace current page.
In Lightning Experience, Quick Actions have largely replaced Custom Buttons for declarative UI extensions — Quick Actions can launch flows, create records, send email, log calls, all without code. A team migrating from Classic to Lightning will need to convert most JavaScript Buttons to Flows or LWC actions.
Custom Links and the URL-only flavour of Custom Buttons still work fine in Lightning. JavaScript Custom Buttons do not.
