Names are the first thing the next developer sees and the last thing anyone agrees on. The naming conventions we use for every AL project: objects, files, fields, procedures, variables, events and enums, with the reasons behind each one and the handful of rules that matter most.
Every per-tenant extension we inherit has at least three naming conventions in it, one per developer who worked on it, and none of them written down. The names are not wrong, exactly; they are inconsistent, and inconsistency is what makes code slow to read and easy to break. These are the conventions we use, which are close to Microsoft's own for the base application and to the community's accepted practice. Where there is a choice, we say why.
CONTRIBUTING.md with the conventions, and the analysers (CodeCop, PerTenantExtensionCop or AppSourceCop) switched on to enforce the ones they can. A convention that lives in someone's head is not a convention."Courier Shipment Sender" beats "CSS Mgt"."CON Courier Shipment") or suffix ("Courier Shipment CON"). Required for AppSource; strongly recommended for per-tenant extensions so that your objects are recognisable next to Microsoft's and ISVs' in the client and in a table extension. Pick prefix or suffix once; Microsoft's own convention and most of the community use prefix."CON Courier Shipment", not "Shipments". Setup tables end in Setup; entry tables end in Entry; line tables end in Line and header tables in Header, matching the base application.Card for a card, List for a list, Subform for a subpage, Setup for a setup page, FactBox, Lookup. "CON Courier Shipment Card", "CON Courier Shipments" (a list page is usually the plural noun, as Microsoft does: "Customers", "Sales Orders")."CON Courier Shipment Mgt." for the management codeunit of an entity (Microsoft's "Mgt." abbreviation is universal and worth keeping), "CON Courier API Client" for an integration, "CON Sales Event Subscribers" for a codeunit that only holds subscribers, "CON Install" and "CON Upgrade" for the install and upgrade codeunits, "CON Courier Shipment Tests" for tests."CON Despatch Label"."CON Shipment Status"; their values are PascalCase without the affix and with a caption: value(1; Despatched) { Caption = 'Despatched'; }. Interfaces start with I: "CON ICourier Provider"."CON Item" extends Item, "CON Item Card" extends the Item Card. Not "Item Ext" and not a description of what was added, because what was added will change."CON COURIER" style upper-case short names with a readable caption, one per feature area plus an "all" set.Microsoft's convention, enforced by the CodeCop rule and by most pipelines: <ObjectName>.<ObjectType>.al, with the name in PascalCase without spaces or the affix: CourierShipment.Table.al, CourierShipmentCard.Page.al, CourierShipmentMgt.Codeunit.al, Item.TableExt.al, ItemCard.PageExt.al, ShipmentStatus.Enum.al, CourierShipmentTests.Codeunit.al. One object per file, no exceptions. Folders match namespaces, one per functional area, not one per object type: a Codeunits folder with eighty files tells you nothing; a Courier folder with twelve tells you everything.
field(50100; "CON Pallet Configuration"; Code[30]). Field names must be unique across the table including other apps' extensions, and the affix is what guarantees it.Caption = 'Pallet Configuration';. The affix is for developers; users should not see it.ToolTip on every field on a page, in the form Microsoft uses: "Specifies the ..." The analyser will insist."CON Requires Pallet", not "Pallet Flag". Dates end in Date, date-times in DateTime, codes referencing another table are named for that table's primary key: "CON Courier Code".CalculatePrice, SendShipment, TryGetCourier.Try prefix for procedures that return a Boolean instead of erroring; Get for retrieval; Create, Update, Delete, Post, Validate as the base application uses them.local, or internal for sharing within the app.OnBeforeSendShipment, OnAfterSendShipment, with IsHandled on the before event. Subscriber procedure names say what they subscribe to: OnAfterValidateQuantityOnSalesLine.CourierShipment: Record "CON Courier Shipment"; SalesLine: Record "Sales Line". Temporary records prefixed Temp: TempSalesLine.CourierShipmentMgt: Codeunit "CON Courier Shipment Mgt.".IsHandled, HasLines, ShouldPost.Lbl for text, Err for errors, Msg for messages, Qst for confirms, Txt for general text, with the Comment property describing the placeholders: NoCourierErr: Label 'No courier is set up for %1.', Comment = '%1 = Shipping Agent Code';.Every object, field, action and enum value has a Caption, and TranslationFile is in app.json features so an XLIFF is generated. Even a UK-only business: the captions are what the user sees, and separating them from the names is what lets you rename a field for the user without a schema change.
Switch on CodeCop (style), UICop (tooltips, captions, page layout), and PerTenantExtensionCop or AppSourceCop (affixes, ID ranges, obsolete handling) in settings.json and in the pipeline, with warnings as errors. They cover file names, affixes, missing captions and tooltips, missing Comment on labels, and a long list of style rules. What they cannot enforce is whether the name means anything, which is the part the human does.
Do not rename everything in one go. Renaming objects is safe for data (the platform tracks by ID) but breaks every reference, including from other apps and from saved views, report layouts and web service names that users depend on. Adopt the conventions for new code immediately, fix names as you touch files, and plan any wholesale rename of user-visible objects as a release with communication. The analysers can be introduced with the existing warnings baselined so they catch new offences without demanding that the old ones are fixed first.
If you want a starting point, the conventions above are the ones in our repository template, together with the AL-Go pipeline that enforces them; and the AL code check will tell you how far an existing extension is from them.