Domain 1: Describe Business Central
- Business Central is a three-tier application: the client renders pages, SQL Server persists data, and the Business Central Server hosts the service tier that compiles and executes AL, enforces permissions and manages caching.
- A tenant corresponds to a Microsoft Entra directory and can hold several environments. Each environment is an isolated instance with its own database, its own companies and its own installed extensions, which is why a per-tenant extension published to a sandbox is not present in production.
- The application stack layers upward: platform, System Application (stable public APIs for email, storage, cryptography), Business Foundation (shared non-industry building blocks), base application (the ERP functionality), localization apps, then partner extensions.
- The extension model prevents direct modification of base application source. Extensions attach through tableextension, pageextension, reportextension and enumextension objects plus event subscribers, which is what allows automatic updates without a code merge.
- A per-tenant extension is published into one customer's environment and is not validated by Microsoft. An AppSource app passes technical validation through Partner Center, carries a reserved name affix and a centrally assigned object ID range, and is installable by any tenant.
- Business Central online ships two major updates a year plus monthly minor updates. Administrators set an update window and can shift the date within a permitted range, but updates cannot be declined indefinitely, so testing against the preview matters.
- The admin center manages environment lifecycle: create, copy, rename and delete environments, set the update window and target version, restore to a point in time within the retention window, view telemetry and support requests, and manage installed apps across the tenant.
- Extension Management inside the client lists installed apps and supports install, uninstall, refresh from AppSource and uploading a per-tenant .app file. Uninstalling retains schema and data by default so a reinstall finds them intact.
- app.json is the manifest: id, name, publisher, version, brief, the minimum application and platform versions, dependencies (identified by GUID), the object ID ranges the compiler enforces, the runtime version and optional features.
- Permission sets grant rights over an extension's objects; entitlements map licence types such as Essential, Premium and Team Member to those sets; profiles bind a role to a Role Center and page customizations. All three are AL objects.
- Identity comes from Microsoft Entra ID. Users sign in there and Business Central validates the token; a background service uses service-to-service authentication with a registered application. Basic authentication and web service access keys have been retired online.
- Isolated storage is a key-value store scoped to the extension and optionally to a company, user or module, suited to secrets and small configuration. Extension fields added to a base table live in a companion table the platform joins transparently.
- Multiple environments belong to one tenant but do not share data. Companies within one environment share the installed extensions, while most application data is company-specific unless a table sets DataPerCompany to false.
Domain 2: Install, develop, and deploy for Business Central
- The AL Language extension for Visual Studio Code supplies the compiler, IntelliSense, snippets, the debugger and the publish commands. It needs a server to publish to: an online sandbox or a locally run Business Central container image.
- launch.json holds one or more configurations naming the server, instance, tenant, authentication type and startup object. Online environments use AAD authentication; UserPassword and Windows belong to containers and on-premises.
- Symbols are metadata-only packages describing the platform, System Application, base application and dependencies. They land in .alpackages, are excluded from source control, and must be downloaded before a fresh clone or a new dependency will compile.
- F5 publishes with the debugger attached; Ctrl+F5 publishes without it. Rapid Application Development republishes only what changed, shortening the edit-and-test loop on a large project.
- Snapshot debugging records a session, including a background one, into a file the developer replays later. It is the practical route for a defect that only reproduces in a customer environment or in a job queue session.
- Per-tenant extensions reach production by uploading the .app through Extension Management or the admin center. Publishing directly from Visual Studio Code targets sandboxes, which is a deliberate control on production deployment.
- Schema sync modes: Add is the safe default and blocks destructive changes; ForceSync applies them and discards the data, which suits only a throwaway development database. A field rename reads as a delete plus an add, which Add refuses.
- Removing a field or an object follows the obsolete path: ObsoleteState Pending with an ObsoleteReason naming the replacement and an ObsoleteTag recording when, ship that, then set Removed in a later version once dependants have migrated.
- Install codeunits (OnInstallAppPerCompany, OnInstallAppPerDatabase) seed setup and must be safe to rerun, since they also run on reinstall. Upgrade codeunits (OnUpgradePerCompany, OnUpgradePerDatabase) transform existing data and use upgrade tags so a step is never applied twice.
- Events: an IntegrationEvent publisher is an empty procedure the code calls; an EventSubscriber binds by object, event name and matching signature. Subscribers run synchronously in the publisher's call stack and transaction, and a var parameter such as IsHandled is how a subscriber returns information or suppresses default logic.
- Database events (OnBeforeInsertEvent, OnAfterInsertEvent and their modify, delete and rename counterparts) are raised by the platform for every table without the owner publishing anything, which is how an extension reacts to changes in base tables.
- Analyzers are enabled per project: CodeCop for style, UICop for interface rules, PerTenantExtensionCop for customer-specific apps, and AppSourceCop for marketplace rules including the affix and a baseline comparison that catches breaking changes.
- Tests live in a separate extension that declares a dependency on the app under test, so customers never receive test objects. AL-Go for GitHub supplies ready-made workflows that build, test in a container, sign and release.
Domain 3: Develop by using AL objects
- The first key declared on a table is its primary key; other keys are secondary, become SQL indexes and support sorting and filtering. SumIndexFields on a key enable maintained totals so a Sum FlowField is fast, at a cost on every write.
- FieldClass FlowField with a CalcFormula (Sum, Count, Lookup, Exist, Average, Min, Max) stores nothing and must be calculated with CalcFields before it is read. A FlowFilter holds a filter value that FlowField formulas reference.
- TableRelation validates a value against another table and gives the user a lookup; it is enforced by the application layer rather than as a SQL foreign key. LookupPageId and DrillDownPageId name the pages used for lookups and for drilling into a total.
- Enums replaced Option fields for anything extensible: values carry explicit ordinals and captions, and an enum declared Extensible accepts values contributed by an enumextension in another app.
- A tableextension adds fields numbered in the extension's own ID range, secondary keys, field groups and trigger code. It cannot change the primary key, an existing field's data type, or any base field's properties.
- Page types: Card for one record, List for many, Document for a header with a lines subpage, ListPart and CardPart for embedding, Worksheet for grid entry, RoleCenter for a landing page, NavigatePage for a wizard. A repeater renders one row per record.
- Every page control needs an ApplicationArea or it is invisible under the user's experience setting, and a ToolTip is expected on user-facing fields and actions. Actions are promoted with an actionref inside a promoted area rather than with the older properties.
- Page triggers: OnOpenPage runs once before records are read (the place to filter or populate a temporary source table), OnAfterGetRecord runs per record (the place to set a StyleExpr variable), and OnQueryClosePage can prevent the page closing.
- Record access: Get fetches by primary key ignoring filters; FindSet prepares a set for a repeat loop; IsEmpty answers existence without retrieving; SetLoadFields narrows the columns read; ModifyAll and DeleteAll are set-based and skip table triggers unless the Boolean argument asks for them.
- Reports are a dataset of dataitems and columns plus one or more layouts (RDLC, Word, Excel). DataItemLink filters a nested dataitem to the current parent, and its absence turns a linear read into a full scan per parent. ProcessingOnly turns a report into a batch job with a free request page.
- XMLports move data in XML, VariableText (delimited) and FixedText formats. tableelement iterates records; fieldelement and fieldattribute carry values; Direction restricts the flow; AutoSave, AutoUpdate and AutoReplace govern writing; FieldValidate runs the field's OnValidate trigger.
- Codeunit subtypes are Normal, Test, TestRunner, Install and Upgrade. A TryFunction catches errors and returns false, rolling back its own writes. Interfaces declare procedures that implementing codeunits provide, and an extensible enum bound to implementations is the usual selection mechanism.
- Queries join tables with SqlJoinType (InnerJoin, LeftOuterJoin, RightOuterJoin, FullOuterJoin, CrossJoin) and DataItemLink, aggregate with Method and MethodType, and are read-only. They are iterated with Open, Read and Close, and filtered before Open so the database does the work.
- Permission sets list objects and rights (Read, Insert, Modify, Delete, Execute), with tabledata governing the records and table governing the object. IncludedPermissionSets composes them, Assignable controls direct assignment, and permissionsetextension adds to another app's set.
Domain 4: Develop by using AL
- Data types matter: Decimal for amounts and quantities with explicit Round, Code for uppercased identifiers, Text for descriptive content with an enforced length, Date with a blank value of 0D, and DateFormula applied to a base date with CalcDate.
- Evaluate parses text into a typed value and returns false when it cannot, which must be checked for values arriving from a file or a service. Format goes the other way, and StrSubstNo composes a message from a template with numbered placeholders.
- User-facing text belongs in a Label so it is extracted into the XLIFF translation files, with a Comment giving translators the context. Concatenating sentence fragments cannot be translated correctly because word order differs between languages.
- Collections: List grows and is indexed from one, Dictionary maps keys to values, Array is fixed size, and TextBuilder appends efficiently. Variant carries a value whose type is unknown until run time, and RecordRef with FieldRef gives late-bound access to any table.
- JSON is handled with JsonObject, JsonArray, JsonToken and JsonValue; XML with the Xml types; outbound HTTP with HttpClient, HttpRequestMessage, HttpContent and HttpResponseMessage. DotNet interop is unavailable in the online service.
- Errors: Error aborts the operation and the platform rolls back its writes; ErrorInfo adds a title, detail, a link and corrective actions; collectible errors gather many problems and report them together. A subscriber's error rolls back the publisher's work.
- Commit closes the transaction, so a later failure no longer undoes earlier writes. It is occasionally necessary, for example before a long external call, but scattering it through business logic produces half-finished documents.
- Background sessions have no user interface, so code that may run in a job queue must check GuiAllowed before calling Confirm, Message or a Dialog. Page background tasks run read-only so the page stays responsive.
- Secrets belong in isolated storage or Azure Key Vault, never in a constant, a table field or app.json. SecretText carries a sensitive value in code without it becoming ordinary text or reaching a log.
- Development standards: descriptive singular object names carrying the publisher's affix, a tooltip on every user-facing control, no magic numbers, named procedures rather than section comments, and a consistent format so diffs show real changes.
- The public surface is a contract. Anything public may be depended on by another app, so internals are marked internal or local, internalsVisibleTo grants the test app access, and AppSourceCop compares against a baseline to catch breaking changes.
- Onboarding: an assisted setup guide built as a NavigatePage and registered with the framework, a checklist item registered so its completion is tracked, teaching tips that point at a control on first encounter, and tooltips for continuous guidance.
- Profiles bind a role to a Role Center and page customizations that apply to everyone with that profile. Personalization applies to one user, and a page extension applies to everyone, so the three differ in scope rather than in mechanism.
Domain 5: Work with development tools
- A test codeunit has Subtype Test and its procedures carry the Test attribute. A TestRunner codeunit executes them and controls isolation, which decides whether changes are rolled back after each test, after each codeunit, or not at all.
- The Assert codeunit supplies AreEqual, IsTrue and similar helpers that fail with the expected and actual values named. ASSERTERROR passes when the guarded statement raises an error, which is how a negative case is verified.
- A TestPage drives a page as a user would, running the validation and actions that writing to the table directly would skip. Handler functions declared in HandlerFunctions respond to confirmations, messages, modal pages and reports so a test runs unattended.
- Microsoft's test libraries provide helpers that create customers, items and documents with valid setup, so a partner's tests create their own fixtures rather than depending on demonstration data that varies between environments.
- Microsoft's standard tests can be added to a suite and run with the partner's extension installed, which is how a subscriber that has broken base application behaviour is discovered before a customer finds it.
- Code coverage shows which lines the tests executed, so it identifies gaps. It does not show whether the covered behaviour was verified, since a test that calls code without asserting counts the same as one that asserts thoroughly.
- Page Inspection shows a page's source table, the current record's values and which extensions contributed to it. The event recorder lists the events an operation actually raised, which is how the right publisher is found without reading the base source.
- The performance profiler records a call tree with durations, which identifies the expensive part of a slow operation. A database read inside a loop is the classic AL performance defect and shows up clearly.
- Environment telemetry is configured in the admin center with an Application Insights connection string and serves the customer. An extension can declare its own connection so the publisher receives that app's signals across every customer.
- Telemetry is queried with Kusto Query Language against the traces table, with the detail in customDimensions. Filter on the stable event id rather than the message text, which can be reworded.
- Useful signals include report execution and long-running SQL for performance, database locks for contention, job queue for scheduled work, web service requests for inbound calls, authorization, and feature telemetry for adoption.
- Custom telemetry uses stable event ids and structured dimensions so queries keep working, with verbosity set so a genuine failure is not lost among informational noise. Personal and business data must stay out of every signal.
- A pipeline creates a fresh container, compiles both apps with analyzers enabled, installs them, runs the suite through the test runner, and publishes only the product app as the release artifact.
Domain 6: Integrate Business Central with other applications
- Outbound calls use HttpClient with an HttpRequestMessage carrying the method, URI and headers, and HttpContent carrying the body. Content type is set on the content's own headers, not the request's, which is a common first stumble.
- The send call returns whether the service was reached, not whether it succeeded. The response's status code is checked separately, and the error body usually explains which value or rule was rejected.
- OAuth 2.0 is the expected authentication: acquire a token, cache it until it expires, and send it as a bearer header. The client secret lives in isolated storage or Azure Key Vault rather than in code or a table field.
- An outbound call inside a posting transaction holds locks for as long as the service takes to answer. Recording the intent and calling from a background process keeps the user's operation fast and gives the integration somewhere to retry from.
- An API page uses PageType API with APIPublisher, APIGroup, APIVersion, EntityName and EntitySetName. It is exposed automatically on install, supports create, read, update and delete, and applies the page's own validation to incoming values.
- Bound actions apply to one record (posting an invoice) and unbound actions to the entity set. They are how an API exposes an operation rather than encoding it as a magic field value that an ordinary update could trigger by accident.
- The entity tag returned with a record supports optimistic concurrency: sending it back on an update means the caller is told when the record changed in the meantime rather than silently overwriting.
- An API query is read-only and suits a joined or aggregated feed. Web service registration also accepts pages, codeunits and queries, giving OData and SOAP endpoints, but it is per environment and must be created in each one.
- Read Scale-Out routes read-only workloads to a replica, which takes reporting load off the primary. The replica may lag slightly, so it suits analysis rather than a read that immediately follows a write.
- Webhook subscriptions reverse the direction: an external system registers a callback and is notified that a resource changed, then reads the current state through the API. Subscriptions expire and must be renewed.
- Dataverse integration uses integration table mappings, record coupling and synchronization jobs rather than a custom copier. Power Automate reaches Business Central through its connector, which calls the standard and custom APIs underneath.
- Bulk loading belongs in a configuration package or a purpose-built XMLport import rather than record-by-record API calls, which multiply request overhead across the whole load.
- Integrations should be idempotent, record what has been sent, page large results, respect rate limits, encode URL values, send unambiguous date-times with an explicit offset, and surface failures to the customer and to the partner through different channels.
MB-820 exam tips
- Learn which object type solves which problem, because a large share of MB-820 questions reduce to that choice. A tableextension adds the field, a pageextension displays it, a reportextension adds a column and a layout, an enumextension adds a value, and a permissionsetextension grants rights over another app's set.
- Know what the extension model forbids as precisely as what it allows. You can add fields, keys, field groups and trigger code, and you can subscribe to any published or database event. You cannot edit base source, change an existing field's data type, replace a primary key, or rename a field without the platform treating it as a destructive change.
- Memorise the manifest. app.json carries the id, name, publisher, version, dependencies, object ID ranges, runtime and the minimum application and platform versions; launch.json carries the environment, authentication type and startup object. Questions about a project that will not compile are almost always about symbols, and questions about an app that will not install are almost always about a version or a dependency.
- For anything about data access, ask what the database is being made to do. FindSet before a loop, SetLoadFields to narrow the columns, IsEmpty instead of Count, filters before a query is opened, and a DataItemLink on every nested report dataitem. The wrong answers are usually the ones that read everything and then discard it.
- Remember that an event subscriber runs synchronously, inside the publisher's call stack and transaction. That single fact explains why a slow subscriber slows posting, why an error in a subscriber rolls back the publisher's work, and why a non-essential subscriber should handle its own failures.
- Distinguish the three obsolete states and the two upgrade triggers. Pending warns while the element still works, Removed breaks references, and the ObsoleteReason names the replacement. OnUpgradePerCompany runs once per company, OnUpgradePerDatabase once for the environment, and upgrade tags stop a step being applied twice.
- On integration questions, separate direction and intent. HttpClient calls out; API pages, published pages, codeunits and queries let others call in; webhooks push notifications outward so nobody has to poll. An API page writes with validation, a query only reads.
- Watch for answers that would work on-premises but not online: direct SQL access, server file paths, DotNet interop, basic authentication and web service access keys. If an option depends on the file system or the database directly, it is almost certainly the distractor.
Study guide FAQ
What is the MB-820 exam format and passing score?
MB-820 runs for 100 minutes with a passing score of 700 out of 1000. It is proctored, taken at a Pearson VUE test centre or online, and Microsoft notes that it may include interactive components. Microsoft does not publish a fixed question count for this exam, so treat any specific number you see quoted elsewhere as an estimate rather than an official figure.
What does the MB-820 skills outline cover, and how is it weighted?
Six areas, weighted as Microsoft published them on 10 June 2025: Describe Business Central (10-15%), Install, develop, and deploy for Business Central (10-15%), Develop by using AL objects (35-40%), Develop by using AL (15-20%), Work with development tools (10-15%), and Integrate Business Central with other applications (10-15%). Developing with AL objects is by far the largest area, so tables, pages, reports, XMLports, codeunits, queries and permission sets deserve most of your preparation time.
Do I need to know AL syntax by heart for MB-820?
You need to recognise and reason about AL rather than write it from memory. Questions test which object type, property, trigger or method solves a stated requirement, so knowing that a FlowField needs CalcFields, that DataItemLink filters a nested dataitem, or that a subscriber shares the publisher's transaction matters far more than reproducing exact syntax. Hands-on time in Visual Studio Code against a sandbox is still the fastest way to make that knowledge stick.
Is there a prerequisite for MB-820?
No exam or certification is required first. Microsoft's audience profile expects applied knowledge of Business Central and the AL language, the development environment and tools for building extensions, some knowledge of installing and upgrading the system, familiarity with AppSource and related technologies, and experience with application lifecycle management including source control and CI/CD.
Does MB-820 include labs or case studies?
Microsoft does not publish which exams contain labs, and the MB-820 study guide makes no mention of case studies. The exam page says only that it is proctored and may include interactive components. Its published 100-minute duration matches Microsoft's stated duration for associate exams without labs, which suggests none, but treat that as an inference rather than a confirmed fact.
How often does MB-820 change?
Microsoft revises role-based exams as the product evolves and prints the effective date on the study guide, currently 10 June 2025. The change log for that revision records only two adjustments, both within existing skill areas, with no change to the weightings. Check the study guide before you book, since Business Central itself ships two major updates a year and exam content follows.