Zapier connection failing with new OAuth flow

We're seeing authentication failures on our Zapier integration since the OAuth flow update. The connection test passes initially, but subsequent API calls return 401 within ~10 minutes.

  • Zapier app version: 3.2.1
  • Token refresh appears to succeed (200 OK with new access_token)
  • Subsequent requests use the new token, still rejected
  • Direct API calls with manually rotated tokens work correctly

Scope on the connection: work_orders:read work_orders:write customers:read

Is there a mismatch in token expiration handling between FieldPulse's OAuth implementation and Zapier's expected refresh window? I can reproduce this 100% of the time.

  • Yeah this one tripped me up too when I first looked at it. The issue isn't actually the token refresh — it's that Zapier's OAuth v2 app is caching the Authorization header from the original connection test and not updating it after refresh.

    What's happening:

    • FieldPulse returns a new access_token (correct)
    • Zapier stores it (correct)
    • But some Zapier triggers/actions use the pre-refresh token in their metadata sample, which then 401s

    Workaround that actually works: disconnect and reconnect the Zapier integration entirely after the OAuth migration. The cached metadata resets. I know, I know — not ideal for production Zaps.

    Edge case I hit: if you have multiple Zaps using the same FieldPulse connection, you need to refresh the connection in each Zap's trigger setup, not just the connection panel. Took me an embarrassing amount of time to figure that out.

  • curl -X POST api.fieldpulse.com/.../token \
      -H 'Content-Type: application/x-www-form-urlencoded' \
      -d 'grant_type=refresh_token' \
      -d 'refresh_token=xxx' \
      -d 'client_id=xxx' \
      -d 'client_secret=xxx'

    What's the expires_in value in the token response? FieldPulse used to return 3600, new flow returns 600. Zapier's default refresh buffer might not trigger.

    Also: are you using the built-in FieldPulse app or a custom REST hook? The built-in one had a version bump last week.

  • expires_in: 600 confirmed. Built-in app, not custom.

    Where do you see the version bump? Zapier's change log is empty for FieldPulse.

  • Hi Leo — happy to help clarify what's happening here.

    You're correct that we shortened the access token lifetime from 3600 to 600 seconds as part of the OAuth security hardening in 3.3. This aligns with current best practices for token rotation.

    However, we've identified that Zapier's OAuth v2 implementation doesn't gracefully handle token lifetimes below 1800 seconds in certain trigger configurations. This is a known issue on our side — not a Zapier bug, but a gap in how we communicated the change.

    Immediate fix:

    1. Navigate to Settings → Integrations → Zapier in your FieldPulse account
    2. Click Regenerate Connection — this creates a legacy-compatible token pair
    3. Reconnect in Zapier using the new credentials

    We're also rolling out a patch (targeted for Oct 14) that restores 1800-second compatibility for existing Zapier connections while maintaining 600 seconds for direct API access.

    See this article for full steps: Zapier Trigger Missing Custom Field Values — Troubleshooting

    Let me know if the regeneration doesn't resolve this for you.

  • Ah, that explains why my workaround worked — the full reconnect probably hit a code path that bypassed the cached metadata. The 600s → 1800s mismatch makes way more sense than what I was chasing.

    Side note: the Regenerate Connection button is easy to miss. It's nested under the three-dot menu next to the Zapier card, not the main CTA. Almost filed a UX bug on that one.

  • YMMV but we've been using a custom REST hook in Zapier instead of the built-in app specifically to avoid these kinds of auth lifecycle issues. More upfront work but you control the token refresh logic entirely.

    Worth noting: FieldPulse's OAuth refresh endpoint does return a new refresh_token on each call, which is correct per spec but trips up some Zapier configurations that expect a static refresh token. Heads up if you're debugging token chains.