Skip to main content
SmartScan is New Expensify’s AI-powered receipt scanning technology that automatically extracts key information from receipt images. Simply take a photo or upload a receipt, and SmartScan handles the rest.

What is SmartScan?

SmartScan uses advanced optical character recognition (OCR) and machine learning to:
  • Extract merchant names
  • Identify expense amounts
  • Detect transaction dates
  • Recognize currency types
  • Pull tax information
  • Identify receipt details
SmartScan processes receipts in seconds, dramatically reducing manual data entry and minimizing errors.

How to Use SmartScan

Method 1: Camera Capture

  1. Open New Expensify and tap the green + button
  2. Select Submit expense or Track expense
  3. Choose the Scan tab
  4. Point your camera at the receipt
  5. Tap the shutter button to capture
  6. Wait for SmartScan to process the image
  7. Review the extracted details
  8. Submit the expense
const getScreenshot = useCallback(() => {
    if (!cameraRef.current) {
        requestCameraPermission();
        return;
    }

    // Start telemetry tracking
    startSpan(CONST.TELEMETRY.SPAN_RECEIPT_CAPTURE, {
        name: CONST.TELEMETRY.SPAN_RECEIPT_CAPTURE,
        op: CONST.TELEMETRY.SPAN_RECEIPT_CAPTURE,
        attributes: {[CONST.TELEMETRY.ATTRIBUTE_PLATFORM]: 'web'},
    });

    const imageBase64 = cameraRef.current.getScreenshot();
    const originalFileName = `receipt_${Date.now()}.png`;
    const originalFile = base64ToFile(imageBase64 ?? '', originalFileName);
    const imageObject: ImageObject = {
        file: originalFile,
        filename: originalFile.name,
        source: URL.createObjectURL(originalFile),
    };

    // Process and upload the receipt
    cropImageToAspectRatio(imageObject, viewfinderLayout.current?.width, viewfinderLayout.current?.height).then(({file, filename, source}) => {
        endSpan(CONST.TELEMETRY.SPAN_RECEIPT_CAPTURE);
        const transactionID = transaction?.transactionID ?? initialTransactionID;
        
        // Set receipt for SmartScan processing
        setMoneyRequestReceipt(transactionID, source, filename, !isEditing, file.type);
        
        if (!isEditing) {
            submitReceipts(newReceiptFiles);
        }
    });
}, [isMultiScanEnabled, submitReceipts]);

Method 2: Upload from Device

  1. Navigate to expense creation
  2. Select the Scan tab
  3. Click Choose file or Gallery icon
  4. Select a receipt image or PDF from your device
  5. SmartScan processes the file automatically
  6. Review and confirm the details

Method 3: Drag and Drop

On desktop:
  1. Drag a receipt image or PDF file
  2. Drop it onto the New Expensify window
  3. SmartScan begins processing immediately
  4. The expense is created with extracted details
Drag and drop multiple receipts at once to create several expenses quickly.

Supported Receipt Formats

SmartScan works with various file formats:

Image Formats

  • JPEG/JPG
  • PNG
  • GIF
  • BMP
  • WebP
  • SVG

Document Formats

  • PDF (single or multi-page)

File Size Limits

  • Maximum size: 10MB per file
  • Recommended: Under 5MB for faster processing
const API_ATTACHMENT_VALIDATIONS = {
    ALLOWED_RECEIPT_EXTENSIONS: [
        'jpg',
        'jpeg',
        'png',
        'pdf',
        'gif',
        'bmp',
        'svg',
        'webp',
    ],
    MAX_SIZE: 10485760, // 10MB in bytes
    MIN_SIZE: 1, // Minimum 1 byte
};

Receipt Quality Guidelines

For best SmartScan results:

Optimal Receipt Conditions

Ensure the receipt is well-lit without shadows or glare. Natural lighting works best.
Keep the receipt flat and aligned with the camera. Avoid wrinkles or folds.
Capture the entire receipt including all text and the merchant name.
Make sure the image is sharp and text is readable. Avoid blurry photos.
Position the receipt against a plain, contrasting background.

Common Issues to Avoid

  • Faded receipts: Thermal receipts fade over time—scan them immediately
  • Crumpled receipts: Smooth out receipts before scanning
  • Dark images: Increase lighting or use flash
  • Partial receipts: Ensure the entire receipt is visible
  • Multiple receipts: Scan one receipt at a time (or use Multi-Scan)

What SmartScan Extracts

SmartScan automatically identifies and extracts:

Primary Information

  • Merchant name: The business where the expense occurred
  • Amount: Total expense amount (including tax)
  • Date: Transaction date
  • Currency: The currency of the transaction

Additional Details

  • Tax amount: Sales tax or VAT
  • Payment method: Cash, card, or other
  • Transaction time: Time of day (when available)
  • Receipt number: Transaction or receipt ID
Not all receipts contain every detail. SmartScan extracts whatever information is present and readable.

SmartScan Processing States

1. Scanning

Immediate state after upload:
  • Receipt is being processed
  • AI is extracting information
  • Usually completes in 5-15 seconds
  • You can continue using the app
if (isScanning(transaction)) {
    return (
        <MoneyRequestHeaderStatusBar
            icon={<Icon src={ReceiptScan} />}
            description={translate('iou.receiptScanInProgressDescription')}
            shouldStyleFlexGrow={false}
        />
    );
}

2. Scan Complete

SmartScan successfully extracted details:
  • Expense fields are populated
  • Review and edit as needed
  • Submit when ready

3. Scan Failed

SmartScan couldn’t extract information:
  • May occur with poor image quality
  • Unusual receipt formats
  • Faded or damaged receipts
  • Non-standard languages
When scan fails:
const shouldShowSmartScanFailedError =
    transactionState === CONST.IOU.RECEIPT_STATE.SCAN_FAILED &&
    !hasRequiredFields(transaction);

if (shouldShowSmartScanFailedError && !hasSmartScanFailedError) {
    newTransactionViolations.push({
        name: CONST.VIOLATIONS.SMARTSCAN_FAILED,
        type: CONST.VIOLATION_TYPES.WARNING,
        showInReview: true,
    });
}
Resolution steps:
  1. Review the extracted fields
  2. Manually enter missing information
  3. Ensure all required fields are filled
  4. Submit the expense
You can replace the receipt and try scanning again by clicking the receipt image and selecting “Replace receipt.”

Multi-Scan Mode

Capture multiple receipts in a single session:

How Multi-Scan Works

  1. Enable Multi-Scan mode (mobile only)
  2. Capture multiple receipts one after another
  3. Review thumbnails of captured receipts
  4. Submit all receipts at once
  5. Each receipt creates a separate expense
const [isMultiScanEnabled, setIsMultiScanEnabled] = useState(false);

const toggleMultiScan = useCallback(() => {
    setIsMultiScanEnabled((prev) => !prev);
    if (!isMultiScanEnabled) {
        // Show educational popup for first-time users
        showMultiScanEducationalPopup();
    }
}, [isMultiScanEnabled]);

// Camera capture in multi-scan mode
if (isMultiScanEnabled) {
    showBlink(); // Visual feedback
    const newReceiptFiles = [...receiptFiles, {file, source, transactionID}];
    setReceiptFiles(newReceiptFiles);
    return; // Stay in camera mode
}

Multi-Scan Benefits

  • Batch processing: Handle multiple receipts efficiently
  • Time savings: No need to navigate back and forth
  • Visual confirmation: See all captured receipts before submitting
  • Easy removal: Delete any receipts you don’t want
Multi-Scan is currently available on mobile devices. Desktop users can drag and drop multiple files.

Camera Features

Flash/Torch Control

For low-light environments:
src/pages/iou/request/step/IOURequestStepScan/index.tsx
const [isFlashLightOn, toggleFlashlight] = useReducer((state) => !state, false);
const [isTorchAvailable, setIsTorchAvailable] = useState(false);

const capturePhoto = useCallback(() => {
    if (trackRef.current && isFlashLightOn) {
        trackRef.current.applyConstraints({
            advanced: [{torch: true}],
        }).then(() => {
            setTimeout(() => {
                getScreenshot();
                clearTorchConstraints();
            }, CONST.RECEIPT.FLASH_DELAY_MS);
        });
        return;
    }
    getScreenshot();
}, [isFlashLightOn, getScreenshot]);
  • Toggle flash on/off with the lightning bolt icon
  • Flash activates briefly during capture
  • Available on devices with flash support

Camera Permissions

First-time camera use requires permission:
  1. Click Continue when prompted
  2. Allow camera access in your browser/device
  3. Camera activates automatically
  4. Permission is remembered for future use
If camera access is denied, you’ll need to enable it in your device or browser settings.

Editing SmartScan Results

After SmartScan processes a receipt:

Review Extracted Data

  1. Check the amount is correct
  2. Verify the merchant name
  3. Confirm the date is accurate
  4. Review the currency

Edit Any Field

Click any field to modify it:
  • Amount: Tap to enter the correct amount
  • Merchant: Edit the merchant name
  • Date: Select the correct date
  • Category: Choose the appropriate category
  • Description: Add context or notes
SmartScan learns from corrections and improves over time.

SmartScan and Policy Compliance

SmartScan helps maintain policy compliance:

Automatic Validations

  • Receipt requirements: Checks if receipt is required
  • Amount limits: Validates against policy limits
  • Date ranges: Ensures date is within allowed period
  • Duplicate detection: Identifies potential duplicates

Violation Detection

SmartScan can detect:
  • Missing required fields
  • Out-of-policy amounts
  • Duplicate expenses
  • Invalid or expired receipts
function getReportWithMissingSmartscanFields(iouReportID: string | undefined, reportPreviewAction: OnyxEntry<ReportAction>): Report | undefined {
    const transactions = getTransactionsFromReport(iouReportID, reportPreviewAction);
    
    return transactions?.find((transaction) => {
        const hasViolations = areRequiredFieldsEmpty(transaction);
        const isScanFailed = transaction.receipt?.state === CONST.IOU.RECEIPT_STATE.SCAN_FAILED;
        return hasViolations && isScanFailed;
    });
}

E-Receipts

For expenses without physical receipts, SmartScan generates e-receipts:
function EReceipt({transactionID, transactionItem, onLoad, isThumbnail = false}: EReceiptProps) {
    const defaultTheme = useEReceipt(transactionItem ?? transaction);
    
    const {
        amount: transactionAmount,
        currency: transactionCurrency,
        merchant: transactionMerchant,
        created: transactionDate,
    } = getTransactionDetails(transactionItem ?? transaction, CONST.DATE.MONTH_DAY_YEAR_FORMAT) ?? {};
    
    const formattedAmount = convertToDisplayString(transactionAmount, transactionCurrency);
    
    return (
        <View style={styles.eReceiptContainer}>
            <EReceiptBackground
                primaryColor={primaryColor}
                secondaryColor={secondaryColor}
            />
            <View style={styles.eReceiptContent}>
                <Text style={styles.eReceiptTitle}>{titleText}</Text>
                <Text style={styles.eReceiptMerchant}>{transactionMerchant}</Text>
                <Text style={styles.eReceiptAmount}>{formattedAmount}</Text>
                <Text style={styles.eReceiptDate}>{transactionDate}</Text>
            </View>
        </View>
    );
}
E-receipts include:
  • Transaction details
  • Merchant information
  • Amount and currency
  • Date and time
  • “Guaranteed” badge for card transactions

Replacing Receipts

If you need to update a receipt:
  1. Open the expense
  2. Click the receipt image
  3. Select Replace receipt
  4. Upload or capture a new receipt
  5. SmartScan processes the new receipt
  6. Review the updated details
Replacing a receipt re-runs SmartScan and may update extracted information.

SmartScan Performance Tips

For Faster Processing

Well-lit receipts process faster and more accurately.
Fresh receipts are easier to read than faded ones.
Smaller files (under 5MB) upload and process faster.
JPEG and PNG images typically process fastest.

For Better Accuracy

  • Center the receipt in the frame
  • Ensure all text is visible
  • Use a steady hand or stabilizer
  • Avoid shadows across the receipt
  • Keep the receipt flat

Troubleshooting SmartScan

Receipt Won’t Upload

Possible causes:
  • File too large (over 10MB)
  • Unsupported file format
  • Poor internet connection
  • Browser permissions issue
Solutions:
  • Compress the image
  • Convert to JPEG or PNG
  • Check your connection
  • Clear browser cache

SmartScan Takes Too Long

Try these steps:
  • Check your internet speed
  • Upload a smaller image
  • Refresh the page
  • Try again during off-peak hours

Extracted Details Are Wrong

Common issues:
  • Poor image quality
  • Faded receipt
  • Unusual receipt format
  • Foreign language
Solutions:
  • Retake the photo with better lighting
  • Manually edit incorrect fields
  • Upload a clearer image
  • Replace the receipt

SmartScan Failed Error

If you see “Receipt scanning failed”:
  1. Check the image quality
    • Is the text readable?
    • Is the lighting adequate?
    • Is the entire receipt visible?
  2. Try uploading again
    • Take a new photo
    • Use better lighting
    • Ensure the receipt is flat
  3. Enter details manually
    • Fill in the required fields
    • Keep the original receipt attached
    • Submit the expense
Manually entered expenses are just as valid as SmartScanned ones. The receipt image is still attached for audit purposes.

Privacy and Security

SmartScan respects your privacy:
  • Secure processing: All data is encrypted
  • No storage: Images are processed and not stored long-term
  • Access control: Only authorized users can view receipts
  • Audit trail: All access is logged
  • Compliance: Meets SOC 2 and other standards

Best Practices

1

Scan receipts immediately

Don’t wait—thermal receipts fade quickly. Scan as soon as you receive them.
2

Review before submitting

Always verify SmartScan extracted the correct information.
3

Use Multi-Scan for batches

When you have multiple receipts, use Multi-Scan to process them efficiently.
4

Keep originals temporarily

Hold onto physical receipts until expenses are approved, just in case.
5

Report issues

If SmartScan consistently has trouble with certain receipt types, let your admin know.

Next Steps

Create an Expense

Learn the full expense creation workflow

Distance Tracking

Track mileage for travel expenses

Split Expenses

Share costs with others

Expense Overview

Return to expense management overview

Build docs developers (and LLMs) love