EAC Email Filing
Filing Activity Capture emails on the right Opportunity
For business users, Salesforce admins and project stakeholders. Technical detail for developers is in the appendix.
At a glance
Activity Capture saves customer emails in Salesforce automatically. EAC Email Filing makes sure each one lands on the deal it is actually about.
The problem
Einstein Activity Capture often files a synced email on the wrong Opportunity. It happens most when one contact works on several deals at once, for example a developer building three Hyatt hotels. The email then shows on the wrong deal's timeline and the right deal's history has a gap.
What it does
Every time a new email is saved on an Opportunity, the solution looks at the contact's open deals, works out which one the email is about, and files it there. When it can't tell, it leaves the email alone and records why, so a person can decide.
Results from 30 October 2026, after the fixes went live in the trial org. “With the agreed decisions” means a few expected answers in the original test pack were changed by the business owner (for example: when the subject and body name different hotels, the body wins). Against the pack exactly as first written, 116 of 128 match.
Key ideas in one minute
- Rules first, AI last. Most emails (107 of 128 in testing) are settled by simple rules in a fraction of a second. Only unclear emails go to the AI.
- It never guesses wildly. It only ever chooses among the contact's own open deals, and the AI's answer is used only if it is confident and the email backs it up.
- Nothing is lost. The email is always saved, even if the filing logic fails.
- Everything is explained. Each email gets one log entry saying what was decided and why.
- People stay in charge. If a rep re-files an email by hand later, the solution never overrides it.
How it decides
Each new email goes through the same checks, cheapest first. The first check that gives a clear answer wins.
The decision at a glance
Follow an email from the top. Steps 1–6 never use the AI: they are instant rules, and the email record itself is filed. Only an email still unclear after step 6 goes to the AI (steps 7–9), and the AI's pick is used only if it passes every check.
Each step in detail
Why “before” and “after” matter. Steps 1–6 happen while the email is being saved, so the email record itself shows the right deal. The AI step happens a few seconds later. By then Salesforce no longer lets anyone change which deal an email record belongs to, so the solution moves the email's Activity timeline entry instead. On the deal's timeline it looks the same; the email record keeps its original “Related To”.
What “names a property” means
| The email says | What happens |
|---|---|
| “Latest plan for Hyatt Studios Winder” | Filed on Winder |
| “Following up on the Brookhaven site” (deal has no brand) | Filed on Brookhaven |
| “The Winder financing review is complete” (brand missing) | Goes to the AI |
| “Plans for Nashville” (two Nashville deals) | Goes to the AI |
| “Updates on Sugarloaf Mills and Winder?” | Left for review |
| Subject names Sugarloaf Mills, body says “details are for the Brookhaven site” | Filed on Brookhaven body wins |
A few more rules keep it careful: quoted history in replies (“On Monday, Ana wrote…”) is ignored because it talks about where the thread used to be; accents don't matter (“Queretaro” matches “Querétaro”); a hotel name made of ordinary words, like “Union Station”, only counts when all its words appear; and the brand list (38 Hyatt and partner brands) can be edited by an admin without a release.
What each log status means
Every email the solution looks at gets one EAC Match Log entry. Its status tells you what happened and whether you need to do anything.
| Status | What happened | What you should do |
|---|---|---|
| Filed automatically | ||
| Auto-Corrected (Single Open Deal) | The contact has only one open deal and the email arrived somewhere else. Filed on that deal, before save. | Nothing. |
| Auto-Corrected (Formula Match) | The email named exactly one of the contact's properties. Filed there, before save. | Nothing. (If the reasoning says “decided by the rules after save”, only the timeline entry moved.) |
| Applied From Thread Memory | A vague reply. Filed on the deal its conversation was already about, before save. | Nothing. |
| Auto-Corrected (Prompt Match) | The AI was confident and the email backs up its choice. The timeline entry moved; the email record keeps its original Related To. | Nothing. Spot-check now and then. |
| Already in the right place | ||
| Already Correct | The contact has one open deal and the email is already on it. | Nothing. |
| Confirmed Correct (Formula Match) | The email names one property and is already filed on it. | Nothing. |
| Confirmed Correct (Thread Memory) | A vague reply, already on its conversation's deal. | Nothing. |
| Left for a person | ||
| Needs Review (Multiple Properties Named) | The email names two or more properties. | Open the email and file it on the right deal if needed. |
| Needs Review (Prompt Abstained) | The AI wasn't confident, or picked something that isn't one of the contact's open deals. | Review and re-file if needed. |
| Needs Review (Prompt Answer Not In Email) | The AI was confident, but nothing in the email mentions the deal it picked. Treated as unsafe. | Review; the AI's guess is in the reasoning. |
| Needs Review (Instructions In Email) | The email contains text aimed at an AI (a record Id, “ignore the rules”, a “note to the AI”). It was not sent to the AI. | Review. If it looks deliberate, tell your admin. |
| Needs Review (Skipped: Limits) | The save was close to Salesforce's processing limits, so filing stopped to make sure the email saved. | Review. Many of these: tell your admin. |
| Ambiguous Contact | Two or more contacts share the address (or an outbound email went to several customers). | Review and file by hand. |
| Nothing to file | ||
| No Contact Match | No contact has this email address. | Nothing, unless the sender should be a contact. |
| No Open Candidates | The contact has no open deals. | Nothing. |
| Problem | ||
| System Error | Something failed (for example the AI was unavailable). The email is still saved where it arrived; the reason is in the log. | Tell your admin. Review the email. |
You may also see a few old entries with Pending Review (Escalate Phase 2). They were written by the previous version (a Flow) between 9 and 15 October 2026 and are no longer produced.
Where to see it in Salesforce
The everyday checks, step by step. Start from the App Launcher (the 9-dot grid, top left) or Setup (the gear, top right).
Before you start: ask your admin to give you the EAC Filing Admin permission set. It lets you read the logs and the thread memory. The solution doesn't add a tab for the logs: if App Launcher search finds nothing, add /lightning/o/EAC_Match_Log__c/list?filterName=All after your org's address, or ask your admin to create a tab.
A. See the latest filing decisions
Everyone- Open the list view All.
- Gear icon (List View Controls) › Select Fields to Display: add Status, Email Message Id, Old What Id, New What Id, Score Confidence, Match Timestamp, Created Date. Save.
- Sort by Created Date, newest first.
B. Understand one decision
Everyone- Click the row whose Email Message Id matches the email (the Id is in the email's web address).
- Read Status and Reasoning: the rule that applied, or the AI's explanation.
- Old What Id is where Activity Capture put the email. New What Id is where it is now (blank if it was left alone).
C. Check where an email ended up
Everyone- Open the email from the contact's Activity tab and read Related To.
- Click Related To to open the deal, then its Activity tab: the email should be on the timeline.
- Open the other deals for the same contact and check the email is not on them.
D. See what each conversation remembers
Admins- Show the columns Thread Id, Correct Opportunity Id, Last Modified Date.
E. Confirm it's switched on correctly
Admins- Status should be Active.
- This is the previous version. It must not be active (otherwise every email is logged twice).
- A version should be marked Active (version 6 in the trial org). If none is active, every AI case logs System Error.
- Turn on Einstein should be On, and the user that saves synced emails should be allowed to use prompt templates.
- 38 brand records (Hyatt Place, Hyatt Studios, Caption by Hyatt, …). Add a record here to teach it a new brand; no release needed.
- Filter on the AI job class (EmailPromptFilingQueueable) if AI cases never get a log row.
F. Give someone access to the logs
Admins- Click Add Assignment, pick the users who triage email filing, and save.
Testing
The solution was tested by the developer, then independently by a QA review, then re-tested after every fix. On 2 November 2026 a person-run set of 16 hands-on scenarios was added and run end to end; verifying it used 2 AI requests (scenarios 05 and 06).
How it was tested
Developer testing
114 automated tests check each rule, case by case, and run in the org after every release. A pack of 128 realistic sample emails, each with a known right answer, is sent through the real system one at a time and graded automatically.
Independent QA review
A separate QA pass wrote 153 test cases across 15 areas: rules, threads, volume, the AI step, security, error handling and the documentation itself. It found 21 issues (none blocking). All were fixed and re-tested.
Results after the fixes (30 October 2026)
| Measure | Result |
|---|---|
| Sample emails filed correctly | 128 of 128 with the agreed decisions (116 of 128 as first written) |
| System errors / emails left without a deal / duplicate logs | 0 / 0 / 0 |
| Automated tests | 114 of 114 pass; every part at 91% coverage or more |
| Speed | Rule decisions logged in about 0.3 seconds; AI decisions in about 5–16 seconds |
| Change versus before the fixes | Same filing result for every one of the 128 emails |
Who made the decision (128 sample emails)
| Decided by | Emails | Where it happens |
|---|---|---|
| Property named | 102 | Before save |
| Thread memory | 5 | Before save |
| AI, confident and backed by the email | 6 | After save (timeline entry moved) |
| AI not sure, left for review | 12 | After save |
| Two or more properties, left for review | 3 | Before save (AI not asked) |
The 15 emails left for review were expected to be: they are genuinely unclear (“Thanks, that works for us” with no earlier email in the thread) or name several hotels. Only two emails (207 and 208) can differ between runs: 207 mentions a second hotel in passing, and the AI sometimes picks either one.
The test plan in five parts
| Part | What it proves | Time |
|---|---|---|
| 1. Pre-flight checks | The right things are installed and switched on | 10 min |
| 2. Automated tests | Each rule behaves as designed | 5 min |
| 3. 128-email test pack | A realistic set of emails is filed correctly | 15 min |
| 4. Live Activity Capture tests | It works on real synced mail without fighting Activity Capture | 1–2 hrs |
| 5. Safety and rollback | A failure never loses an email, and it can be switched off | 20 min |
Still to do before production: Part 4 in a Hyatt sandbox. Everything so far used synthetic emails in a trial org. Part 4 sends real emails through a mailbox that Activity Capture syncs, and confirms three things the design depends on: Activity Capture files emails on Opportunities; replies keep the same conversation identifier; and Activity Capture doesn't move a corrected email back (checked again after 24 hours).
Hands-on test scenarios
A kit for one person to try every main filing case in the trial org: a set of demo deals, one sample email per case, a script that “delivers” each email, and what to look for afterwards. The script saves the email exactly as an Activity Capture sync would, so the real solution runs. Nothing is faked and nothing is rolled back, and the scripts never change the solution itself.
Your test records
These demo records are already in the org (created 2 November 2026). Every one is tagged EAC-DEMO, so the clean-up never touches anything else. The rep in the sample emails, Jordan (rep@eacdemo-hotels.example.com), is not a contact; he is only the other side of the conversation.
| Contact | Deals (Opportunities) and why they matter | Account |
|---|---|---|
| Dana Reyes | Four open deals: Hyatt Place Tampa Westshore, Hyatt Studios Lakeland, Orlando Hotel Development (no brand; its description mentions the Lake Nona campus) and Union Station Hotel Development (no brand, two property words). Plus Hyatt Studios Brandon, which is Closed Lost and never a candidate. | Bayside Hospitality Group |
| Marcus Lee | Exactly one open deal: Hyatt Place Sarasota Downtown. | Bayside Hospitality Group |
| Priya Shah and Owen Shah | Share one email address (a shared desk), so the solution can't tell who wrote. | Gulf Coast Partners |
| Carla Nguyen | Her only deal, Hyatt Studios Ocala, is Closed Won. | Gulf Coast Partners |
Both Accounts are named with an “EAC-DEMO” prefix (for example “EAC-DEMO Bayside Hospitality Group”). Deal names have no prefix on purpose, because the rules read every word of a deal name. Record Ids and addresses are in the appendix.
How to run a scenario
Run the script
From the project folder, with the Salesforce CLI logged in to the trial org:
sf apex run --file scripts/manual_tests/NN_x.apex
Wait
Rule decisions are instant. The AI scenarios (05, 06) and the safety check 07 are logged by a background job: wait about 20 seconds (10 for 07).
Check it in Salesforce
Open the newest log row (path A and B in section 4), then the deal's Activity timeline (path C). For scenario 03, also the thread memory (path D).
Unless a card says otherwise, every email arrives on Hyatt Place Tampa Westshore, standing in for Activity Capture's guess, so a correct move shows the email leaving Tampa. Run the scenarios in order; 03a must come before 03b, the others are independent. Each script also prints a one-line result, and check_latest.apex prints the full log row for the newest demo email.
The email names one property
Auto-Corrected (Formula Match)The email names the deal it arrived on
Confirmed Correct (Formula Match)Thread memory: a vague reply follows its conversation
Applied From Thread MemoryNo deal named; the AI finds it from a landmark
Auto-Corrected (Prompt Match)The contact has only one open deal
Auto-Corrected (Single Open Deal)Same email, already on the right deal
Already CorrectThe same email as 08, from Marcus Lee.
An email the rep sent: the contact comes from To
Auto-Corrected (Formula Match)The email names two properties
Needs Review (Multiple Properties Named)A vague email with no thread
Needs Review (Prompt Abstained)Two contacts share the sender's address
Ambiguous ContactThe sender isn't a contact
No Contact MatchThe contact's only deal is closed
No Open CandidatesThe email tries to instruct the AI
Needs Review (Instructions In Email)“Labor union” doesn't name Union Station
Auto-Corrected (Formula Match)An email filed on an Account is left alone
No log rowResults on 2 November 2026
Every scenario was run once in the trial org with the sample emails exactly as above. All passed first time.
| # | Scenario | Expected | Actual | Result |
|---|---|---|---|---|
| 01 | One property named | Auto-Corrected (Formula Match) | Same, score 1; on Lakeland | Pass |
| 02 | Names the deal it arrived on | Confirmed Correct (Formula Match) | Same, score 2; stayed on Tampa | Pass |
| 03a | Thread, first email | Auto-Corrected (Formula Match) | Same; memory row → Lakeland | Pass |
| 03b | Thread, vague reply | Applied From Thread Memory | Same; on Lakeland | Pass |
| 04 | Two properties named | Needs Review (Multiple Properties Named) | Same, score 2; stayed on Tampa | Pass |
| 05 | Landmark only (AI) | Auto-Corrected (Prompt Match) | Same, High; timeline entry on Orlando | Pass |
| 06 | Vague, no thread (AI) | Needs Review (Prompt Abstained) | Same, Low; stayed on Tampa | Pass |
| 07 | Instructions aimed at the AI | Needs Review (Instructions In Email) | Same; stayed on Tampa | Pass |
| 08 | One open deal, arrived elsewhere | Auto-Corrected (Single Open Deal) | Same; on Sarasota | Pass |
| 09 | One open deal, arrived on it | Already Correct | Same; stayed on Sarasota | Pass |
| 10 | Shared address | Ambiguous Contact | Same; stayed on Tampa | Pass |
| 11 | Unknown sender | No Contact Match | Same; stayed on Tampa | Pass |
| 12 | Only deal closed | No Open Candidates | Same; stayed on Ocala | Pass |
| 13 | Sent by the rep | Auto-Corrected (Formula Match) | Same; on Lakeland | Pass |
| 14 | Filed on an Account | No log row | No log row; stayed on the Account | Pass |
| 15 | “Labor union” | Auto-Corrected (Formula Match) | Same, score 1; on Lakeland | Pass |
Testing through the Salesforce screens
What was checked on 2 November 2026, and what wasn't:
| Question | Finding |
|---|---|
| Is the org set to send system email only? | No. The org allows user email (checked without sending anything). |
| Does sending an email from a deal's Activity › Email composer go through the filing? | Not verified. No email was sent from the composer during the check. From the design you would expect it to behave like scenario 13, because a composer email is sent by the rep. |
| Can a tester start a thread or receive a customer email from the screens? | No. The composer has no conversation identifier field, and customer-to-rep emails need Activity Capture or Email-to-Salesforce. Scenario 03 and all inbound scenarios need the scripts (or real Activity Capture, test plan Part 4). |
Resetting between runs and cleaning up
Between runs
Run cleanup_demo.apex. It removes the demo emails, their timeline entries, their log rows and the demo thread memory, and keeps the demo Accounts, Contacts and Deals. Then run leftover_check.apex: it should report 0 emails, tasks, logs and thread memory, with 2 Accounts, 5 Contacts and 7 Deals kept. Always clean up before repeating scenario 03, or 03a starts with memory from the last run.
Removing everything
To also delete the demo records, set DELETE_DEMO_RECORDS = true at the top of cleanup_demo.apex, run it, then set it back. seed_demo.apex re-creates them; it is safe to re-run. The clean-up only touches records tagged EAC-DEMO.
Quality review & fixes
The QA review found 21 issues: 0 blocking, 5 major, 13 minor and 3 documentation. All 21 were fixed, released on 30 October 2026 and re-tested. The most important ones:
Large batches of long emails could fail to save
MajorWhen many long emails arrived at once, the filing logic used up Salesforce's processing limits and the whole batch of emails failed to save.
HTML-only emails were logged as fixed when they weren't
MajorMany Outlook and Gmail emails have only a formatted (HTML) body. The rules couldn't read it in time, so nothing moved, yet the log said “corrected”.
An email could talk the AI into a filing
MajorQA sent an email containing a hidden “note to the AI” that told it which deal to choose. The AI obeyed.
One ordinary word could file an email on the wrong deal
Major“Our labor union reviewed the terms” was filed on Union Station Hotel Development.
Error handling wasn't tested well enough
MajorOne part of the code was below Salesforce's 75% test coverage bar, which could block a production release. The untested lines were the error paths.
A contact with only one open deal still went to the AI
Minor · business decisionIf the contact has a single open deal, there is nothing to choose. Decided with the business owner on 30 October 2026.
Other fixes, in brief
- Accents no longer matter (“Zoetry” matches the “Zoëtry” brand).
- Replies in other languages (“AW:”, “SV:”, “Antw:”) are recognised as replies.
- Two brands on the same site (Hyatt Place and Hyatt House Austin Airport) are told apart by the brand.
- A reply saved together with the first email of its conversation now follows it.
- The AI is never given a closed deal as a hint; its answers are read more reliably.
- A failure in the background AI job now logs an error for every affected email instead of losing them.
- New EAC Filing Admin permission set, so admins can see where an email first arrived.
- Test tools can now clean up a single test run; documentation corrected throughout.
Known limits
These are understood and accepted, or outside what this solution can control.
Only the first 5,000 characters are read
The rules read the subject and the first 5,000 characters of the new message (quoted history removed). If the hotel is only named further down, the email goes to the AI instead. Accepted by the business owner; real emails usually name the hotel early. The AI still sees the whole email.
Some influence over the AI remains
A sender can still nudge the AI among deals their email itself mentions, for example by naming a city two deals share. That is the same influence anyone has by naming a hotel, and it is limited to the contact's own open deals.
Other automation can still hit limits
The solution keeps its own processing in check, but other flows or triggers on emails and tasks (including Activity Capture itself) can still push a save over Salesforce's limits.
AI decisions only move the timeline entry
After save, Salesforce won't let an email record change deal. The timeline is right; the email record's Related To still shows where it arrived.
Only emails filed on an Opportunity are handled
If Activity Capture files an email on an Account or Contact, or on nothing, it is skipped with no log entry.
Some emails will always need a person
A lone “Thanks, that works” with no earlier email in the thread, or an outbound email to several customers, is left for review. AI answers can vary on borderline emails.
Short hotel names that are ordinary words
A one-word unbranded name such as “Gateway” still matches on that word alone.
Live mailbox test not yet done
Part 4 of the test plan (real synced mail in a Hyatt sandbox) is the go-live gate and hasn't been run yet.
Safety & rollback
Designed so that the worst case is “an email stays where Activity Capture put it”.
The email is always saved
If any part of the filing fails, the email is still saved where it arrived and the problem is logged as System Error.
It only acts on new emails
It looks at each email once, when it's first saved. A rep's later manual re-filing is never overridden.
It stays within the contact's open deals
An email can only be moved to one of that contact's open Opportunities. Closed deals and other contacts' deals are never used.
When unsure, it does nothing
Unclear emails are left alone and logged for review rather than guessed.
How to switch it off
- Deactivate the trigger EmailMessageTrigger. In a sandbox: Setup › Apex Triggers › Edit › untick Is Active. In production this is done through a small release that sets it to Inactive.
- Optional: bring back the previous behaviour by activating version 8 of the old Flow (EAC Auto Correct EmailMessage RelatedTo), which is kept for this purpose.
- Never have both on at once. Every email would be logged twice and the two could disagree.
Turning it off doesn't undo anything already filed; it only stops new emails being filed. Copies of the code from before the QA fixes, and the original Flow, are kept in the project.
Before production
- Run the full test plan in a Hyatt sandbox with Activity Capture syncing a real mailbox, especially Part 4.
- Release to production and deactivate the old Flow in the same window.
- Give the EAC Filing Admin permission set to the admins who triage email filing.
Appendix: technical reference
For admins and developers. The full technical write-up is EmailAutoCorrect.md in the project folder.
Components
| Component | Type | Purpose |
|---|---|---|
EmailMessageTrigger | Apex trigger | Entry point (before and after insert) |
EmailFilingDecider | Apex class | The decision rules, shared by every stage |
EmailPreSaveFiler | Apex class | Before save: sets the email's Related To |
EmailFilingRecorder | Apex class | After save: writes log rows and thread memory, queues AI cases |
EmailPromptFilingQueueable | Apex class (Queueable) | Calls Prompt Builder, moves the Task, logs the result (20 emails per job) |
EmailFilingLog | Apex class | Builds and saves log rows; upserts thread memory |
EmailFilingText | Apex class | Bounded text the rules read; reply prefixes; flags instruction-like text |
EmailOppMatchScorer | Apex class | Brand + property scorer |
EmailRecipientSplitter | Apex class | Splits multi-recipient To addresses |
EmailPromptOutputParser | Apex class | Parses the AI's answer |
Opportunity_Email_Matching | Prompt template (v6 active) | AI decision for unclear emails |
EAC_Brand__mdt (38 records) | Custom metadata type | Brand phrase list, editable in Setup |
EAC_Match_Log__c | Custom object | One log row per decision |
Email_Thread_Correction__c | Custom object | Thread memory, one row per thread (Thread_Id__c unique) |
EmailMessage.EAC_Original_RelatedToId__c | Custom field | Where the email arrived, when moved before save |
EAC_Filing_Admin | Permission set | Read on the log, thread memory and the field above |
EAC_Auto_Correct_EmailMessage_RelatedTo | Flow | Previous version; kept for rollback, must stay inactive |
8 *Test classes, EacTestDataFactory | Apex tests | 114 tests |
Settings worth knowing
| Setting | Value | How to change |
|---|---|---|
| Brand list | 38 records | Setup › Custom Metadata Types › EAC Brand (no release) |
| AI confidence accepted | High, Medium | Code change |
| Text the rules read | Subject ≤ 1,000; body ≤ 5,000 chars | Code change (EmailFilingText) |
| Limit budget before filing stops | 60% of CPU and heap | Code change (EmailFilingDecider) |
| Emails per background AI job | 20 | Code change |
Org and deploy history
Org: “agentforce for sales” (00Daj00000tZc9BEAS), an Enterprise Edition trial expiring 27 April 2027. Not production. This org skips Apex tests during deploys, so tests are run straight after each deploy.
| Date | Deploy | What |
|---|---|---|
| 15 Oct 2026 | 0Afaj00000nrqsKCAQ0Afaj00000nsRgYCAU | Flow versions 7 and 8 (brand scorer, body-first rule, thread memory fix) |
| 29 Oct 2026 | 0Afaj00000ped6wCAA | Apex version (trigger, classes, new field); Flow deactivated. 56/56 tests |
| 30 Oct 2026 | 0Afaj00000ppbucCAA (21 components) | QA fixes DEF-001 to DEF-021, EmailFilingText, permission set, prompt template v6 active. 114/114 tests; pack 128/128 with decisions |
Version history of results
| Version | Pack as written (120) | With decisions (120) | Thread emails (8) | Unlinked |
|---|---|---|---|---|
| Flow v6 (starting point) | 99 | 105 | not run | 13 |
| Flow v7 | 107 | 118 | 4 | 0 |
| Flow v8 | 108 | 120 | 8 | 0 |
| Apex, after QA fixes (live) | 108 | 120 | 8 | 0 |
Hands-on demo records (seeded 2 Nov 2026)
Tagged EAC-DEMO in Account Number, Contact Department and Opportunity Next Step. Open any record by adding /lightning/r/<Id>/view after the org address.
| Record | Id | Detail |
|---|---|---|
| EAC-DEMO Bayside Hospitality Group | 001aj00004E2hErAAJ | Account (Dana, Marcus) |
| EAC-DEMO Gulf Coast Partners | 001aj00004E2hEsAAJ | Account (Priya, Owen, Carla) |
| Dana Reyes | 003aj00002ZGe17AAD | eacdemo.dana.reyes@example.com |
| Marcus Lee | 003aj00002ZGe18AAD | eacdemo.marcus.lee@example.com |
| Priya Shah | 003aj00002ZGe19AAD | eacdemo.shared.desk@example.com |
| Owen Shah | 003aj00002ZGe1AAAT | eacdemo.shared.desk@example.com |
| Carla Nguyen | 003aj00002ZGe1BAAT | eacdemo.carla.nguyen@example.com |
| Hyatt Place Tampa Westshore | 006aj00000gKWunAAG | Qualification · Dana |
| Hyatt Studios Lakeland | 006aj00000gKWuoAAG | Discovery · Dana |
| Orlando Hotel Development | 006aj00000gKWupAAG | Qualification · Dana |
| Union Station Hotel Development | 006aj00000gKWuqAAG | Qualification · Dana |
| Hyatt Studios Brandon | 006aj00000gKWurAAG | Closed Lost · Dana |
| Hyatt Place Sarasota Downtown | 006aj00000gKWusAAG | Proposal/Quote · Marcus |
| Hyatt Studios Ocala | 006aj00000gKWutAAG | Closed Won · Carla |
File locations (project folder)
| Path | Contents |
|---|---|
EmailAutoCorrect.md | Full technical design |
TESTING_GUIDE.md | Test plan, Parts 1–5, with commands and pass criteria |
qa/QA_REPORT.md, qa/DEFECTS.md | QA findings and the 21 defects |
qa/DEV_FIX_REPORT.md | How each defect was fixed and re-tested |
qa/CLICK_PATHS.md, qa/TEST_CASES.md | Manual click paths; 153-case test matrix |
force-app/main/default/ | Salesforce metadata (classes, trigger, objects, template, permission set) |
scripts/eac_test/ | Test pack harness (run_eac_test.py) and offline scorer |
qa/MANUAL_TEST_GUIDE.md | Hands-on scenario guide (16 runs, verified 2 Nov 2026), with record links and pass/fail criteria |
scripts/manual_tests/ | 01_*.apex … 15_*.apex (one sample email each; variables at the top), seed_demo.apex, check_latest.apex, cleanup_demo.apex, leftover_check.apex |
test-data/ | Synthetic Opportunities, contacts, the 128 sample emails, results; demo_ids.json (hands-on demo record Ids) |
.backup/ | Code and docs as they were before the QA fixes |
